Shader "Custom/GeoBase" { Properties{ _MainTex("MainTex",2D) = "white"{} } SubShader{ Tags{"RenderType"="Opaque" "DisableBatching"="true"} //透明部分のあるテクスチャを使う場合 //Tags{"Queue" = "Transparent" "RenderType" = "Transparent" "DisableBatching"="true"} //Blend SrcAlpha OneMinusSrcAlpha Pass{ Cull Off CGPROGRAM #pragma vertex vert #pragma geometry geom #pragma fragment frag #pragma target 4.0 //インスペクタに Enable GPU Instanceが追加される #pragma multi_compile_instancing #include "UnityCG.cginc" struct appdata { float4 vertex:POSITION; float2 uv:TEXCOORD0; uint vid : SV_InstanceID; }; struct g2f { float4 pos:SV_POSITION; float2 uv:TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; //SV_VertexID:頂点のid(こちらはGPU Instancingがオンになってなくても有効なはず) appdata vert(appdata v,uint vid : SV_VertexID){ v.vid = vid;//GPU return v; } sampler2D _MainTex; float4 _MainTex_ST; [maxvertexcount(4)] void geom(triangle appdata vg[3], inout TriangleStream<g2f>outStream){ float p = 0.5; g2f gf = (g2f)0; gf.pos = UnityObjectToClipPos(float4(p,p,0,1)); gf.uv = float2(1,1); outStream.Append(gf); gf.pos = UnityObjectToClipPos(float4(p,-p,0,1)); gf.uv = float2(1,0); outStream.Append(gf); gf.pos = UnityObjectToClipPos(float4(-p,p,0,1)); gf.uv = float2(0,1); outStream.Append(gf); gf.pos = UnityObjectToClipPos(float4(-p,-p,0,1)); gf.uv = float2(0,0); outStream.Append(gf); outStream.RestartStrip(); } float4 frag(g2f i) :SV_Target { return tex2D(_MainTex,i.uv); } ENDCG }//Pass }//SubShader FallBack "Diffuse" }