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 positionCS : SV_POSITION;
half3 normal : TEXCOORD0;
};
Varyings vert(Attributes input) {
Varyings output;
output.positionCS=TransformObjectToHClip(input.positionOS.xyz);
// 使用 TransformObjectToWorldNormal 函数将法线从对象转换到世界空间,此函数来自 SpaceTransforms.hlsl 文件,在 Core.hlsl 中引用
output.normal=TransformObjectToWorldNormal(input.normal);
return output;
}
half4 frag(Varyings input): SV_Target {
half4 output=0;
// input.normal 是一个 3D 向量. 每个分量的范围 [-1, 1],
// 要使用负的法线向量,需要使用压缩技巧,将法线分量值范围 [-1,1],压缩为颜色值范围 [0,1]
output.rgb=input.normal*0.5+0.5;
return output;
}
ENDHLSL
}
}
}