Unity Shader 學習筆記001 -- 漫反射

漫反射: 光源射到的地方是亮的,沒射到的地方是暗的

蘭伯特定律:反射光線的強度 和 (光源方向和物體表面法線的夾角的餘弦值)成正比。

個人對於蘭伯特定律的思考:0-90度 夾角越大,餘弦值越小,所以反射光線的強度也就越小,所以就越暗。大於90度的時候就是暗的

點乘,也叫數量積。結果是一個向量在另一個向量方向上投影的長度,是一個標量。
叉乘,也叫向量積。結果是一個和已有兩個向量都垂直的向量。

diffuse 公式:  物體顏色 * 光源顏色 * max(0, dot(光源方向,物體法線方向))

個人理解:光源向量和發現向量點乘就是類似求餘弦值

Shader Code

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            fixed4 _Diffuse;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float4 normal : NORMAL;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                fixed3 color : Color;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);//從模型空間轉換到齊次裁剪空間
                fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);//模型法線轉換成世界法線
                fixed3 worldLight = normalize( UnityWorldSpaceLightDir(mul(unity_ObjectToWorld, v.vertex).xyz));//求世界光線向量
                fixed3 diffuse = _Diffuse.rgb * _LightColor0.rgb * max(0, dot(worldNormal, worldLight));//公式求漫反射顏色
                o.color = diffuse;//傳給frag着色器
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(i.color, 1);
            }
            ENDCG

以上都是個人筆記,個人理解,如有問題,給我私信,謝謝!

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