【その2】突発シェーダー講義で描いたソースコード

Shader "MannteraShader"
{
	Properties
	{
		// リンクさせたい変数名("インスペクタに表示させたい文字",表示させる種類)= 初期値{}
		_MainTex("Texture",2D) = "red"{}
		_SpecularPower("SpecularPower",float) = 10

		// RampMap
		_RampMap("RampMap",2D) = "white" {}
	}
	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 wPos : WORLD_POS; //ワールド座標
				float3 normal : NORMAL; //法線情報
				float2 uv : TEXCOORD0;	//UV
			};

			// 頂点シェーダー
			// 返し値 関数名(引数 変数名)
			v2f vert(appdata v)
			{
				v2f _out;

				_out.pos = UnityObjectToClipPos(v.vertex);

				//ワールド座標
				//unity_ObjectToWorldは、ワールド行列で
				//頂点にunity_ObjectToWorldかけてやるとワールド座標に変換する。
				_out.wPos = mul(unity_ObjectToWorld, v.vertex).xyz;

				_out.normal = UnityObjectToWorldNormal(v.normal);
				_out.uv = v.uv;
				return _out;
			}

			//フラグメントシェーダー(ピクセルシェーダー)
			//フラグメントシェーダーの結果をfloat4でSV_Targetって所に出力するよ
			sampler2D _MainTex;
			sampler2D _RampMap;
			float _SpecularPower;

			float4 frag(v2f _in) : SV_Target
			{
				float4 col = (float4)0;

				float4 texColor = tex2D(_MainTex, _in.uv);
				float3 lightVector = normalize(_WorldSpaceLightPos0.xyz);

				//ピクセルからカメラまでの距離を測定して、
				//normalizeする事で、単位ベクトル(ggr)が出る
				// _WorldSpaceCameraPos…カメラの座標
				float3 viewVector = normalize(_WorldSpaceCameraPos - _in.wPos);

				//ランバート拡散反射法
				float d = dot(lightVector, _in.normal);

				//ハーフランバート
				d = d * 0.5f + 0.5f;
				d = d * d;

				//d = max(0, d); //max…二つの変数を比べて大きい方を採用
				d = saturate(d); //0~1のクランプならsaturateの方が良い

				//ディフューズカラー(拡散光)
				//ランプマップを取得して、トゥーン調の絵にする
				float3 rampColor = tex2D(_RampMap, float2(0, d));
				float4 diffuseColor = float4(rampColor.xyz,1) * texColor;

				//スペキュラを計算
				float3 ref = reflect(-lightVector, _in.normal);
				float reflectionPower = dot(ref, viewVector);
				reflectionPower = max(0, reflectionPower);
				float3 specularColor = pow(reflectionPower, _SpecularPower);

				//最終の色を算出
				col.xyz = diffuseColor.xyz +specularColor;
				col.w = diffuseColor.w;
		
				return col;
			}
			ENDCG
		}
	}
}

この記事が気に入ったらサポートをしてみませんか?