Shader-漫反射相關
阿新 • • 發佈:2018-12-21
- 漫反射 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" }