Shader学习过程中 小知识点积累

本文详细介绍了在Unity Shader中如何通过顶点法线和光照方向进行光照计算的过程。包括了如何定义和传递顶点法线及世界位置到片段着色器,并解释了使用不同关键字的原因。

001 拿到顶点法线

    struct appdata
    {
         float4 vertex : POSITION;
         float2 uv : TEXCOORD0;
         float3 normal: NORMAL;  //【S1】定义---------------使用关键字 NORMAL,计算光照需要用到模型法线
     };
     
    struct v2f
    {
        float2 uv : TEXCOORD0;
        float4 vertex : SV_POSITION;
        
        // 计算光照需要用到法线和世界位置
        float3 worldNormal: TEXCOORD1; //【S1】定义---------------使用关键字 TEXCOORD1
        
        //------------------> 【疑问】 为什么一会用”NORMAL" , 一会儿用“TEXCOORD(n)” ,是因为在不同的渲染阶段吗?
        //【我的理解】: 在应用程序阶段,即在appdata中,NORMAL 是关键字, Unity会识别,将模型的“法线”赋值给“声明的变量 normal”
        
        float3 worldPos:TEXCOORD2;
    };
    
    v2f vert (appdata v)   //你只管定义好”结构体“ , 传入是Unity的”ShaderLab“识别并执行的
    {
         v2f o;
         o.vertex = UnityObjectToClipPos(v.vertex);
         o.uv = TRANSFORM_TEX(v.uv, _MainTex);
         
         //【S2】向下传输这些数据 , ------------------------------拿到法线
         o.worldNormal = normalize(UnityObjectToWorldNormal(v.normal));
         
         o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
         return o;
     }
     
    fixed4 frag (v2f i) : SV_Target
    {
         // sample the texture
         fixed4 col = tex2D(_MainTex, i.uv);
                
         //漫反射
         //【S3】使用--------------------------------------- 得到顶点法线
         float3 normal = normalize(i.worldNormal);
         
         // 得到光照方向
         float3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);
          ......
    }

002 拿到光照方向

        // 得到光照方向
         float3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值