GameTech/URP 渲染实战
源码 / Ch17/VertexAnimPasses.hlsl
Ch17/VertexAnimPasses.hlsl
// 三个 Pass 的顶点函数。包含本文件之前必须已经定义 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

VAVaryings VAForwardVert(VAAttributes v)
{
    Deform(v);                                           // ① 颜色 Pass:变形
    VAVaryings o;
    o.positionWS = TransformObjectToWorld(v.positionOS.xyz);
    o.positionCS = TransformWorldToHClip(o.positionWS);
    o.normalWS   = TransformObjectToWorldNormal(v.normalOS);
    o.uv = v.uv; o.color = v.color; o.extra = v.uv2;
    return o;
}

float4 VAShadowVert(VAAttributes v) : SV_POSITION
{
    VA_DEFORM_SHADOW(v);                                 // ② 阴影 Pass:同样的变形
    float3 positionWS = TransformObjectToWorld(v.positionOS.xyz);
    float3 normalWS = TransformObjectToWorldNormal(v.normalOS);
    float4 positionCS = TransformWorldToHClip(ApplyShadowBias(positionWS, normalWS, _LightDirection));
#if UNITY_REVERSED_Z
    positionCS.z = min(positionCS.z, UNITY_NEAR_CLIP_VALUE);
#else
    positionCS.z = max(positionCS.z, UNITY_NEAR_CLIP_VALUE);
#endif
    return positionCS;
}

float4 VADepthVert(VAAttributes v) : SV_POSITION
{
    Deform(v);                                           // ③ 深度 Pass:同样的变形
    return TransformObjectToHClip(v.positionOS.xyz);
}

half4 VANullFrag() : SV_Target { return 0; }

#endif