《Unity Shader》6.4.3 半兰伯特模型

(1)仍然使用6.4.1小节中使用的场景。
(2)新建一个材质。在本书资源中,该材质名为HalfLambertMat。

(3)新建一个Unity Shader。在本书资源中,该Shader名为Chapter6-HalfLambert。把新的Shader赋给第2步中创建的材质。

(4)把第2步中创建的材质赋给胶囊体。

打开Chapter6-HalfLambert,删除已有的Shader代码,把6.4.2小节的Chapter6-DiffusePixelLevel代码粘贴进去,并使用半兰伯特公式修改片元着色器中计算漫反射光照的部分:

java 复制代码
Shader "Custom/Chapter6-HalfLambert"
{
    Properties{
        _Diffuse  ("Diffuse",  Color)  =  (1,  1,  1,  1)
    }
    SubShader{
        Tags {"LightMode"="ForwardBase"}
        Pass {
            CGPROGRAM
            #pragma  vertex  vert
            #pragma  fragment  frag
            #include  "Lighting.cginc"
            fixed4  _Diffuse;
            
            struct a2v {
                float4  vertex  :  POSITION;
                float3  normal  :  NORMAL;
            };

            struct v2f {
                float4  pos  :  SV_POSITION;
                float3  worldNormal  :  TEXCOORD0;
            };

            v2f vert(a2v v) {
                v2f  o;
                //  Transform  the  vertex  from  object  space  to  projection  space
                o.pos  =  UnityObjectToClipPos(v.vertex);
                
                // Transform  the  normal  from  object  space  to  world  space
                o.worldNormal  =  mul(v.normal,  (float3x3)unity_WorldToObject); //用的左乘,使用顶点变换矩阵的逆转置矩阵对法线进行相同的变换 //normalize 向量单位化,使其长度为1
            
                return  o;
            }

            fixed4  frag(v2f  i)  :  SV_Target  {
                //  Get  ambient  term
                fixed3  ambient  =  UNITY_LIGHTMODEL_AMBIENT.xyz;
                //  Get  the  normal  in  world  space
                fixed3  worldNormal  =  normalize(i.worldNormal);
                //  Get  the  light  direction  in  world  space
                fixed3  worldLightDir  =  normalize(_WorldSpaceLightPos0.xyz);
                 //  Compute  diffuse  term
                fixed  halfLambert  =  dot(worldNormal,  worldLightDir) * 0.5  +  0.5;
                fixed3   diffuse   =   _LightColor0.rgb * _Diffuse.rgb * halfLambert;

                fixed3 color  =  ambient  +  diffuse;

                return  fixed4(color,  1.0);
            }

            

            ENDCG

        }
    }
    Fallback  "Diffuse"
}
相关推荐
AC梦1 天前
unity中如何将UI上的字高清显示
ui·unity
小贺儿开发1 天前
Unity3D 智慧城市管理平台
数据库·人工智能·unity·智慧城市·数据可视化
June bug2 天前
【领域知识】休闲游戏一次发版全流程:Google Play + Apple App Store
unity
星夜泊客2 天前
C# 基础:为什么类可以在静态方法中创建自己的实例?
开发语言·经验分享·笔记·unity·c#·游戏引擎
dzj20212 天前
PointerEnter、PointerExit、PointerDown、PointerUp——鼠标点击物体,则开始旋转,鼠标离开或者松开物体,则停止旋转
unity·pointerdown·pointerup
心前阳光2 天前
Unity 模拟父子关系
android·unity·游戏引擎
在路上看风景2 天前
26. Mipmap
unity
咸鱼永不翻身2 天前
Unity视频资源压缩详解
unity·游戏引擎·音视频
在路上看风景2 天前
4.2 OverDraw
unity
在路上看风景2 天前
1.10 CDN缓存
unity