Unity Shader學習筆記(二)簡單的漫反射

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "Lesson/SimpleDiffuse"
{
	Properties
	{
	  _Diffuse("DiffuseColor",Color) = (1,1,1,1)
	}

	SubShader
	{
	  Tags{"LightMode" = "ForwardBase"}
	  Pass
	  {
	    CGPROGRAM
	    #pragma  vertex vert       //定義頂點管線函數
	    #pragma  fragment frag     //定義片段管線函數

	    #include"Lighting.cginc"

	    fixed4  _Diffuse;          //float  32位 ,  half 16bit ,  fixed 11bit

	    struct a2v  //應用到頂點
	    {
	       float4  vertex : POSITION;  //POSITION  語義  GPU在哪裏存取數據
	       float3  normal : NORMAL;
	    };

	    struct v2f  //頂點到片段
	    {
	       float4 Pos : SV_POSITION;   // SV_POSITION( 可以用POSITION來代替)        SV_TARGET(可以用COLOR來代替) 都是DX11新出的語義
	       fixed3 color : COLOR;
	    };

	    v2f vert(a2v v)
	    {
	      v2f o;
	      o.Pos  = mul(UNITY_MATRIX_MVP,v.vertex)  ;//從模型空間變化到裁剪空間

	      float3 nDir =normalize( mul((float3x3)unity_ObjectToWorld,v.normal));  //頂點法線  從模型空間變換到世界空間
	      float3 lDir = normalize(_WorldSpaceLightPos0.xyz);       //用於平行光

	      fixed diffuse   = _LightColor0 * _Diffuse * saturate( dot(nDir,lDir));  //數值保證在0~1之間
	      fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;   //在unity引擎裏直接得到環境光

	      o.color = ambient + diffuse;  //ambient  指的是環境光   顏色相加
	      return o;
	    }

	    fixed4 frag(v2f IN):SV_TARGET
	    {
	     return fixed4(IN.color,1.0);
	    }
	    ENDCG
	  }
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章