一、节点实现方式:
![](https://i-blog.csdnimg.cn/direct/96490eea9f8141b4bc80faaf0c356995.png)
其中,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"
}