《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"
}
相关推荐
め.1 小时前
定点数运算库
算法·unity
Duo1J4 小时前
【UE】Slate 编辑器工具开发03 - 节点编辑器 (EdGraph)
ue5·编辑器·游戏引擎·ue4
郝学胜-神的一滴5 小时前
[简化版 GAMES 104] 现代游戏引擎 02:拆解现代游戏引擎5+1层级架构,吃透引擎底层核心逻辑
c++·unity·架构·游戏引擎·图形渲染·unreal engine·系统设计
LONGZETECH7 小时前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
丁小未7 小时前
Unity 几种常见合批手段的要求
游戏·unity·合批·srpbatcher·动态合批·静态合批
旧物有情1 天前
游戏开发常用架构 #MVP,MVC
游戏·unity·架构·mvc
勇踏前人未索之境1 天前
Unity打包运行于鸿蒙手机
unity·智能手机·harmonyos
玖玥拾1 天前
Unity 3D 笔记(十一)UI 框架进阶:栈弹窗交互、BasePanel 基类虚方法、DoTween 界面动画
笔记·3d·unity
郝学胜-神的一滴1 天前
中级OpenGL教程 023:Assimp模型加载全解——从源码到架构的骈文探秘
c++·unity·游戏引擎·cmake·unreal engine·opengl
xcLeigh2 天前
Unity基础:GameObject与Component——Unity核心架构思想彻底理解
unity·教程·component·gameobject