URP 编写自定义 Shader (4) 法线
https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.7/manual/writing-shaders-urp-unlit-normals.html
Shader "Example/URPUnlitShaderNormal" {
Properties {
}
SubShader {
Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" }
Pass {
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes {
float4 positionOS : POSITION;
// 声明包含每个顶点法向量的变量
half3 normal : NORMAL;
};
struct Varyings {
float4 positionHCS : SV_POSITION;
half3 normal : TEXCOORD0;
};
Varyings vert(Attributes IN) {
Varyings OUT;
OUT.positionHCS=TransformObjectToHClip(IN.positionOS.xyz);
// 使用 TransformObjectToWorldNormal 函数将法线从对象转换到世界空间,此函数来自 SpaceTransforms.hlsl 文件,在 Core.hlsl 中引用
OUT.normal=TransformObjectToWorldNormal(IN.normal);
return OUT;
}
half4 frag(Varyings IN): SV_Target {
half4 color=0;
// IN.normal 是一个 3D 向量. 每个分量的范围 [-1, 1],
// 要使用负的法线向量,需要使用压缩技巧,将法线分量值范围 [-1,1],压缩为颜色值范围 [0,1]
color.rgb=IN.normal*0.5+0.5;
return color;
}
ENDHLSL
}
}
}