イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

shader ジオメトリシェーダでquadを生成してuvを貼り付ける

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"
}