《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"
}
相关推荐
魔士于安18 小时前
unity 丑陋哥布林 哥布林有humannoid 动画没 带动画
unity·游戏引擎·材质·贴图·模型
小贺儿开发1 天前
Unity 家居视频遥控(细节优化)
科技·unity·程序员·udp·视频·工具·通信
淡海水1 天前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
小小数媒成员2 天前
UGUI 性能优化(详细,全,深入)
开发语言·unity·游戏引擎
林川~012 天前
Unity新输入系统使用笔记
unity·input system
小贺儿开发3 天前
Unity 结合百度AI开放平台 手写文字识别
人工智能·科技·学习·unity·云服务·文字识别·手写文字
goujunwe3 天前
GEO 评估方法:如何自测你的内容,会不会被 AI 引用
搜索引擎·网络安全·游戏引擎·全文检索·中文分词
林川~013 天前
Unity 万能物理检测工具:射线检测 / 范围检测 / 层级过滤 / 编辑器可视化(可直接拿去用)
游戏·unity·c#·射线检测·通用工具
yi碗汤园4 天前
MQTT消息队列遥测传输协议
网络·网络协议·unity
林川~014 天前
Unity 常用 API 与核心类全解:从生命周期到协程,附性能避坑清单(Unity 6 适配)
unity·游戏引擎·常用api