Shader Forge初学者——法线贴图006

一、节点实现方式:

节点方式获取法线信息

其中,code节点的代码如下:

float3 nDirTS = UnpackNormal(tex2D(normalMap, uv));
float3x3 TBN = float3x3(tDir, bDir, nDir);
float3 nDirWS = normalize(mul(nDirTS, TBN));
return nDirWS;

 二、代码实现方式:

1.我们需要一个光照模型来显示法线效果,选取最简单的Lambert;

2.面板参数追加一张法线贴图;

3.输出参数对应追加;

4.输入结构追加:

        1)UV0:用于采样法线贴图;

        2)Tangent:用于构建TBN矩阵;

5.输出结构追加:

        1)UV0:用于采样法线贴图;

        2)tDirWS,bDirWS,nDirWS:切线空间3轴向方向,用于构建TBN矩阵;

6.顶点shader追加相应内容;

7.像素Shader种nDir的获取方法与节点类似,其余保持Lambert不变。


//法线信息

Shader "Unlit/U3D_007_normalMap"{
    Properties {
        _NormalMap("法线贴图",2D)="bump"{}
    }
    SubShader {
        Tags {
            "RenderType"="Opaque"
        }
        Pass {
            Name "FORWARD"
            Tags {
                "LightMode"="ForwardBase"
            }
            
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0

            uniform sampler2D _NormalMap;

            //输入结构
            struct VertexInput {   
                float4 vertex : POSITION;       //顶点信息 Get✔
                float3 normal : NORMAL;         //法线信息 Get✔
                float2 uv0 : TEXCOORD0;         //法线信息
                float4 tangent : TANGENT;       //构建切线空间需要模型切线信息
            };
            //输出结构
            struct VertexOutput {   
                float4 pos : SV_POSITION;           //顶点屏幕位置
                float2 uv0:TEXCOORD0;               //uv信息
                float3 nDirWS:TEXCOORD1;            //世界空间法线信息
                float3 tDirWS:TEXCOORD2;            //世界空间切线信息
                float3 bDirWS:TEXCOORD3;            //世界空间切线信息

            };
            //输入结构>>>顶点Shader>>>输出结构
            VertexOutput vert (VertexInput v) {
                VertexOutput o = (VertexOutput)0;                       //新建输出结构
                o.pos = UnityObjectToClipPos( v.vertex );               //变换顶点信息
                o.uv0=v.uv0;                                            //传递UV信息
                o.nDirWS=UnityObjectToWorldNormal(v.normal);            //变换法线信息
                o.tDirWS=normalize( mul( unity_ObjectToWorld,float4(v.tangent.xyz,0.0)).xyz);
                o.bDirWS=normalize(cross(o.nDirWS,o.tDirWS)*v.tangent.w);
                return o;                                               //输出结构
            }
            //输出结构>>像素Shader
            float4 frag(VertexOutput i) : COLOR {   
                float3 var_NormalMap=UnpackNormal(tex2D(_NormalMap,i.uv0)).rgb;     //采样法线贴图并解码 切线空间nDir
                float3x3 TBN = float3x3(i.tDirWS,i.bDirWS,i.nDirWS);                //构建TBN矩阵
                float3 nDir=normalize(mul(var_NormalMap,TBN));                      //获取nDir
                float3 lDir=normalize(_WorldSpaceLightPos0.xyz);                    //获取IDir
                float nDotl=dot(nDir,lDir);                                         //nDir点乘IDir
                float lambert=max(0.0,nDotl);                                       //截断负值
                return float4(lambert,lambert,lambert,1.0);                         //输出其最终颜色
            }
            ENDCG
        }
    }
    FallBack "Diffuse"
    CustomEditor "ShaderForgeMaterialInspector"
}

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值