1. 程式人生 > >Shader-漫反射相關

Shader-漫反射相關

  • 漫反射 Diffuse = 直射光顏色 * max(0,cos夾角(光和法線的夾角) )  點積cosθ = 光方向· 法線方向    //max表示小於0時取最大值0
  • 只有定義了正確的LightMode才能得到一些Unity的內建光照變數    Tags{ "LightMode"="ForwardBase" }
  • 包含unity的內建的檔案,才可以使用unity內建的一些變數                #include "Lighting.cginc"
  • normalize()       用來把一個向量,單位化(原來方向保持不變,長度變為1)
  • max()                用來取得函式中最大的一個
  • dot                    用來取得兩個向量的點積
  • _WorldSpaceLightPos0      取得平行光的位置
  • _LightColor0                         取得平行光的顏色
  • UNITY_MATRIX_MVP         這個矩陣用來把一個座標從模型空間轉換到剪裁空間
  • _World2Object                     這個矩陣用來把一個方向從世界空間轉換到模型空間
  • mul(_World2Object, v.normal);         從世界空間轉換到模型空間
  • mul(v.normal, _World2Object);         從模型空間轉換到世界空間
  • UNITY_LIGHTMODEL_AMBIENT   用來獲取環境光
  • // Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
    
    Shader "LXC/04 Diffuse"
    {
    	SubShader
    	{
    		Pass{
    		Tags{"LightMode"="ForwardBase"}
    		CGPROGRAM
    #include "Lighting.cginc"
    #pragma vertex vert		
    #pragma fragment frag
    
    		struct a2v {	
    		float4 vertex:POSITION;	
    		float3 normal:NORMAL;
    		};
    		
    		struct v2f {
    		float4 position:SV_POSITION;	
    		fixed3 color : COLOR;
    		};
    			
    		v2f vert(a2v v) {
    			v2f f;
    			f.position = UnityObjectToClipPos(v.vertex);
    			fixed3 normalDir = normalize(mul(v.normal, (float3x3) unity_WorldToObject));	//從模型空間到世界空間
    			fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);					//第一個直射光的位置 _WorldSpaceLightPos0,對於每個頂點來說,光的位置就是光的方向
    			//取得漫反射的顏色
    			fixed3 diffuse = _LightColor0.rgb * max (dot(normalDir,lightDir),0);	//獲取第一個直射光的顏色 _LightColor0在#include "Lighting.cginc"裡
    			f.color = diffuse;
    			return f;
    		}
    
    
    		fixed4 frag(v2f f) :SV_Target{
    		return fixed4(f.color,1);
    	}
    		ENDCG
    	}
    	}
    		Fallback "VertexLit"
    }