突発シェーダー講義で描いたソースコード

Shader "MannteraShader"
{
	Properties
	{
		// リンクさせたい変数名("インスペクタに表示させたい文字",表示させる種類)= 初期値{}
		_MainTex("Texture",2D) = "red"{}
	}
	SubShader
	{
		Pass
		{
			CGPROGRAM
			
			//vertと言う関数名は頂点シェーダーですよ!と教えている
			#pragma vertex vert
			//fragと言う関数名はフラグメントシェーダーですよ!と教えている
			#pragma fragment frag
			#include "UnityCG.cginc"
			//モデルの頂点情報
			//変数型 変数名 : セマンティクス名;
			struct appdata
			{
				float4 vertex : POSITION; //座標 3Dの情報
				float4 normal : NORMAL; //法線
				float2 uv : TEXCOORD0; //UV
			};
			//フラグメントシェーダーに渡す情報
			struct v2f
			{
				float4 pos : SV_POSITION; //座標 2Dに潰した情報
				float3 normal : NORMAL; //法線情報
				float2 uv : TEXCOORD0;	//UV
			};
			// 頂点シェーダー
			// 返し値 関数名(引数 変数名)
			v2f vert(appdata v)
			{
				v2f _out;
				_out.pos = UnityObjectToClipPos(v.vertex);
				_out.normal = UnityObjectToWorldNormal(v.normal);
				_out.uv = v.uv;
				return _out;
			}
			//フラグメントシェーダー(ピクセルシェーダー)
			//フラグメントシェーダーの結果をfloat4でSV_Targetって所に出力するよ
			sampler2D _MainTex;
			float4 frag(v2f _in) : SV_Target
			{
				float4 col = (float4)0;
				float4 texColor = tex2D(_MainTex, _in.uv);
				float3 lightVector = normalize(_WorldSpaceLightPos0.xyz);
				//ランバート拡散反射法
				float d = dot(lightVector, _in.normal);
				//d = max(0, d); //max…二つの変数を比べて大きい方を採用
				d = saturate(d); //0~1のクランプならsaturateの方が良い
				col = d * texColor;
				return col;
			}
			ENDCG
		}
	}
}

いいなと思ったら応援しよう!