GameTech/URP 渲染实战
源码 / shaders/Ch06/DepthNormalsPass.glsl
shaders/Ch06/DepthNormalsPass.glsl
// DepthNormals Pass:同时写深度和世界空间法线到 _CameraNormalsTexture。(GLSL 版,对应 Ch06/DepthNormalsPass.hlsl)
// SSAO(Depth Normals 模式)、贴花、部分自定义屏幕空间效果都依赖它。

VARYING vec2 uv;
VARYING vec3 normalWS;

#ifdef VERTEX
void main()
{
    gl_Position = TransformObjectToHClip(positionOS.xyz);
    normalWS = TransformObjectToWorldNormal(normalOS);
    uv = texcoord0.xy;
#if defined(_ALPHATEST_ON)
    uv = TransformTex(texcoord0.xy, _BaseMap_ST);
#endif
}
#endif

#ifdef FRAGMENT
void main()
{
#if defined(_ALPHATEST_ON)
    if (texture(_BaseMap, uv).a * _BaseColor.a - _Cutoff < 0.0) discard;
#endif
    // URP 14 的 _CameraNormalsTexture 直接存归一化的世界空间法线(不做 0.5 偏移)
    // (网页版不支持“渲染层”贴图,_WRITE_RENDERING_LAYERS 那一路省略)
    fragColor = vec4(NormalizeNormalPerPixel(normalWS), 0.0);
}
#endif