Shader "Custom/NormalMap"
{
Properties {
_NormalMap("法线贴图",2d) = "bump"{}
}
SubShader {
Tags {
"RenderType"="Opaque"
}
LOD 200
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;
uniform float4 _NormalMap_ST;
//输入结构
struct VertexInput {
float4 vertex : POSITION; //获取模型顶点信息
float4 normal : NORMAL; //获取模型法线信息
float4 tangent : TANGENT;
float2 uv : TEXCOORD0;
};
//输出结构
struct VertexOutput {
float4 pos : SV_POSITION; //获取屏幕顶点位置
float2 uv0 : TEXCOORD0; //获取世界空间法线信息
float3 tDirWS : TEXCOORD1;
float3 bDirWS : TEXCOORD2;
float3 nDirWS : TEXCOORD3;
};
//顶点shader
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0; //新建输出结构
o.pos = UnityObjectToClipPos( v.vertex ); //把模型顶点信息放到屏幕
o.nDirWS = UnityObjectToWorldNormal(v.normal); //把模型法线放到世界空间
o.uv0 = v.uv;
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 nDirTS =UnpackNormal(tex2D(_NormalMap,TRANSFORM_TEX(i.uv0,_NormalMap)));
float3x3 TBN = float3x3(i.tDirWS,i.bDirWS,i.nDirWS);
float3 nDirWS = normalize (mul(nDirTS,TBN)); //获取法线方向
float3 lDir = normalize(_WorldSpaceLightPos0.xyz); //获取光方向(反向)
float Dot1 = dot(nDirWS,lDir); //点乘
float lambert = max(0.0,Dot1); //取大于0
return float4(lambert,lambert,lambert,1.0); //输出最终颜色
}
ENDCG
}
}
FallBack "Diffuse"
}
法线贴图
最新推荐文章于 2023-05-09 17:14:12 发布