GameTech/URP 渲染实战
源码 / shaders/Ch17/VertexAnimPasses.glsl
shaders/Ch17/VertexAnimPasses.glsl
// 三个 Pass 的顶点函数。(GLSL 版,对应 Ch17/VertexAnimPasses.hlsl)
// 包含本文件之前必须已经定义 void Deform(inout VAAttributes v)。
// 如果阴影里需要不同的变形(例如做对比实验),可以先 #define VA_DEFORM_SHADOW 另一个函数名。
#ifndef COOKBOOK_CH17_VA_PASSES_INCLUDED
#define COOKBOOK_CH17_VA_PASSES_INCLUDED

#ifndef VA_DEFORM_SHADOW
    #define VA_DEFORM_SHADOW Deform
#endif

#ifdef VERTEX
void VAForwardVert()
{
    VAAttributes v = VAGetAttributes();
    Deform(v);                                           // ① 颜色 Pass:变形
    positionWS  = TransformObjectToWorld(v.positionOS.xyz);
    gl_Position = TransformWorldToHClip(positionWS);
    normalWS    = TransformObjectToWorldNormal(v.normalOS);
    uv = v.uv; vertColor = v.color; extra = v.uv2;
}

void VAShadowVert()
{
    VAAttributes v = VAGetAttributes();
    VA_DEFORM_SHADOW(v);                                 // ② 阴影 Pass:同样的变形
    vec3 posWS = TransformObjectToWorld(v.positionOS.xyz);
    vec3 nrmWS = TransformObjectToWorldNormal(v.normalOS);
    vec4 positionCS = TransformWorldToHClip(ApplyShadowBias(posWS, nrmWS, _LightDirection));
#if UNITY_REVERSED_Z
    positionCS.z = min(positionCS.z, UNITY_NEAR_CLIP_VALUE);
#else
    positionCS.z = max(positionCS.z, UNITY_NEAR_CLIP_VALUE * positionCS.w);
#endif
    gl_Position = positionCS;
}

void VADepthVert()
{
    VAAttributes v = VAGetAttributes();
    Deform(v);                                           // ③ 深度 Pass:同样的变形
    gl_Position = TransformObjectToHClip(v.positionOS.xyz);
}
#endif

#ifdef FRAGMENT
void VANullFrag() { fragColor = vec4(gl_FragCoord.z); }
#endif

#endif