unity shader学习笔记(三)——在Unity中计算高光反射光照

来源:互联网 发布:js给时间控件赋值 编辑:程序博客网 时间:2024/05/02 00:25

逐顶点计算高光反射光照

Phong模型计算方法

以下是在顶点着色器中使Phong模型计算高光反射光照的shader代码:

 Properties{    _Diffuse("Diffuse", Color) = (1.0, 1.0, 1.0, 1.0)    _Specular("Specular", Color) = (1.0, 1.0, 1.0, 1.0)    _Gloss("Gloss", Range(8.0, 256)) = 20}SubShader{    Pass    {        Tags{ "LightMode" = "ForwardBase" }        CGPROGRAM        #pragma vertex vert        #pragma fragment frag        #include "Lighting.cginc"        fixed4 _Diffuse;        fixed4 _Specular;        float _Gloss;        struct a2v        {            float4 vertex : POSITION;            float3 normal : NORMAL;        };        struct v2f        {            float4 position : SV_POSITION;            fixed3 color : COLOR;        };        v2f vert(a2v a)        {            v2f v;            v.position = UnityObjectToClipPos(a.vertex);            //把法线转化为世界坐标下的法线            fixed3 worldNormal = normalize(mul(a.normal, (float3x3)unity_WorldToObject));            //环境光            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;            //光照            fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);            //漫反射光            fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));            //摄像机方向            fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul((float3x3)unity_WorldToObject, a.vertex));            //反射光            fixed3 reflectDir = normalize(reflect(-worldLight, worldNormal));            //高光反射            fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(viewDir, reflectDir)), _Gloss);            //颜色            v.color = ambient + diffuse + specular;            return v;        }        fixed4 frag(v2f a) : SV_Target        {            return fixed4(a.color, 1.0);        }        ENDCG    }}FallBack "Specular"

  _WorldSpaceCameraPos是世界空间下摄像机的位置。
  reflect方法是用来计算入射方向。
  

Blinn-Phong模型计算方法

Blinn-Phong模型只需要将下面代码:

//反射光fixed3 reflectDir = normalize(reflect(-worldLight, worldNormal));//高光反射fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(viewDir, reflectDir)), _Gloss);

  替换为:

fixed3 halfDir = normalize(worldLight + viewDir);//高光反射fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(worldNormal, halfDir)), _Gloss);

逐像素计算高光反射光照

以下是在片元着色器中使Phong模型计算高光反射光照的shader代码:

Phong模型计算方法

Properties{    _Diffuse("Diffuse", Color) = (1.0, 1.0, 1.0, 1.0)    _Specular("Specular", Color) = (1.0, 1.0, 1.0, 1.0)    _Gloss("Gloss", Range(8.0, 256)) = 20}SubShader{    Pass    {        Tags{ "LightMode" = "ForwardBase" }        CGPROGRAM        #pragma vertex vert        #pragma fragment frag        #include "Lighting.cginc"        fixed4 _Diffuse;        fixed4 _Specular;        float _Gloss;        struct a2v        {            float4 vertex : POSITION;            float3 normal : NORMAL;        };        struct v2f        {            float4 position : SV_POSITION;            float3 worldNormal : TEXCOORD0;            float3 worldPos : TEXCOORD1;        };        v2f vert(a2v a)        {            v2f v;            v.position = UnityObjectToClipPos(a.vertex);            //把法线转化为世界坐标下的法线            v.worldNormal = normalize(mul(a.normal, (float3x3)unity_WorldToObject));            //把顶点坐标转化为世界坐标            v.worldPos = normalize(mul(unity_ObjectToWorld, a.vertex));            return v;        }        fixed4 frag(v2f a) : SV_Target        {            //环境光            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;            //光照            fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);            //漫反射光            fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(a.worldNormal, worldLight));            //摄像机方向            fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - a.worldPos.xyz);            //反射光            fixed3 reflectDir = normalize(reflect(-worldLight, a.worldNormal));            //高光反射            fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(viewDir, reflectDir)), _Gloss);            //颜色            fixed3 color = ambient + diffuse + specular;            return fixed4(color, 1.0);        }        ENDCG    }}FallBack "Specular"

Blinn-Phong模型计算方法

  同上……

阅读全文
0 0