光照漫反射(平行光)

来源:互联网 发布:淘宝达人怎么发表状态 编辑:程序博客网 时间:2024/04/30 11:26
Shader "Custom/test1" {    SubShader {        pass        {            Tags{"LightMode"="ForwardBase"}            CGPROGRAM            #pragma vertex vert            #pragma fragment frag             #include "unitycg.cginc"            #include "lighting.cginc"            struct v2f{                float4 pos:POSITION;                fixed4 col:COLOR;            };            v2f vert(appdata_base v)            {                v2f o;                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);                //点积两个向量必须处于同一坐标系空间                //取法线与光照向量点积                //顶点法线v.normal                //光源向量_WorldSpaceLightPos0                //光源颜色_LightColor0 include对应的头文件                //最后取值在0-1之间                float3 N = normalize(v.normal);                //光照向量转模型  也可以使用顶点模型转世界                float3 L = normalize(_WorldSpaceLightPos0);                //这种解决方式会导致物体非等比缩放导致显示错误                 //L = mul(_World2Object,float4(L,0)).xyz;                //可以使用_World2Object的逆矩阵的转置矩阵相乘                L = mul(float4(L,0),_Object2World).xyz;                float ndot =saturate(dot(L,N));                //光照颜色与环境光颜色相加 获得接近真实的颜色                o.col = _LightColor0*ndot+UNITY_LIGHTMODEL_AMBIENT;                return o;            }            fixed4 frag(v2f IN):COLOR            {                //光照计算放在片段程序中,交接顶点会变得比较平滑                return IN.col;            }            ENDCG        }    }}

1.对顶点进行合适的MVP转换
2.向量点积所在的坐标系需要统一
3. 光照计算最好是在片段着色器中

Shader "Custom/test1" {    SubShader {        pass        {            Tags{"LightMode"="ForwardBase"}            CGPROGRAM            #pragma vertex vert            #pragma fragment frag             #include "unitycg.cginc"            #include "lighting.cginc"            struct v2f{                float4 pos:POSITION;                fixed4 col:COLOR;                float3 n:NORMAL;             };            v2f vert(appdata_base v)            {                v2f o;                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);                o.n = v.normal;                return o;            }            fixed4 frag(v2f IN):COLOR            {                //光照计算放在片段程序中,交接顶点会变得比较平滑                //点积两个向量必须处于同一坐标系空间                //取法线与光照向量点积                //顶点法线v.normal                //光源向量_WorldSpaceLightPos0                //光源颜色_LightColor0 include对应的头文件                //最后取值在0-1之间                float3 N = normalize(IN.n);                //光照向量转模型  也可以使用顶点模型转世界                float3 L = normalize(_WorldSpaceLightPos0);                //这种解决方式会导致物体非等比缩放导致显示错误                 //L = mul(_World2Object,float4(L,0)).xyz;                //可以使用_World2Object的逆矩阵的转置矩阵相乘                L = mul(float4(L,0),_Object2World).xyz;                float ndot =saturate(dot(L,N));                //光照颜色与环境光颜色相加 获得接近真实的颜色                IN.col = _LightColor0*ndot+UNITY_LIGHTMODEL_AMBIENT;                return IN.col;            }            ENDCG        }    }}
0 0