7.2.2 法线纹理的使用
Shader "Custom/chap7.2.2/normal map in world space"
{
Properties
{
_MainTex("Main Texture", 2D) = "White" {}
_BumpMap("normal map", 2D) = "bump" {}
_BumpScale("bump scale", Float) = 1.0
_Color ("Color Tint", Color) = (1.0,1.0,1.0,1.0)
}
SubShader
{
pass {
Tags { "RenderPipeLine"="UniversalRenderPipeline" "RenderType"="Opaque" "LightMode"="UniversalForward"}
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"
CBUFFER_START(UnityPerMaterial)
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _MainTex_ST;
float4 _BumpMap_ST;
float4 _Color;
float _BumpScale;
CBUFFER_END
struct a2v {
float4 vertex: POSITION;
float3 normal: NORMAL;
float4 uv_MainTex: TEXCOORD0;
float4 uv_BumpTex: TEXCOORD1;
float4 tangent: TANGENT;
};
struct v2f {
float4 pos: SV_POSITION;
float2 uv_MainTex:TEXCOORD0;
float2 uv_BumpTex:TEXCOORD1;
float4 TW1:TEXCOORD2;
float4 TW2:TEXCOORD3;
float4 TW3:TEXCOORD4;
};
v2f vert(a2v v) {
v2f o;
o.pos = TransformObjectToHClip(v.vertex);
float3 worldNormal = TransformObjectToWorldNormal(v.normal);
float3 worldTangent = TransformObjectToWorldDir(v.tangent);
float3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w;
float3 worldPos = TransformObjectToWorld(v.vertex.xyz);
o.uv_MainTex = TRANSFORM_TEX(v.uv_MainTex, _MainTex);
o.uv_BumpTex = TRANSFORM_TEX(v.uv_MainTex, _BumpMap);
o.TW1 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);
o.TW2 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);
o.TW3 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);
return o;
}
float4 frag(v2f i) : SV_Target {
float3x3 TW = float3x3(i.TW1.xyz,i.TW2.xyz,i.TW3.xyz);
float3 worldPos = half3(i.TW1.w,i.TW2.w,i.TW3.w);
float4 normalTex = tex2D(_BumpMap, i.uv_BumpTex);
float3 bump = UnpackNormal(normalTex);
bump.xy *= _BumpScale;
bump.z = sqrt(1.0 - saturate(dot(bump.xy, bump.xy)));
bump = mul(TW,bump);
float3 albedo = tex2D(_MainTex, i.uv_MainTex);
Light light = GetMainLight();
float3 worldLightDir = TransformObjectToWorldDir(light.direction);
float3 ambient = _GlossyEnvironmentColor.xyz * albedo;
float3 diffuse = LightingLambert(light.color.rgb, worldLightDir, bump) * albedo;
return float4(ambient + diffuse, 1.0);
}
ENDHLSL
}
}
}