GameTech/URP 渲染实战
源码 / shaders/Ch12/LightLoop.glsl
shaders/Ch12/LightLoop.glsl
// 第 12 章的通用光源循环:主光(含阴影)+ 附加光(GLSL 版,对应 LightLoop.hlsl)。
// 用法(“模板式 include”):在 include 本文件之前,先定义
//     struct MaterialCtx { ... };                         // 片元的材质与几何信息
//     vec3 ShadeOneLight(MaterialCtx m, Light light);     // 单个光源的出射辐射率(含 NoL、衰减、阴影)
// 然后调用 AccumulateDirectLighting(m, positionWS, screenUV)。
// GLSL 版说明:网页版只有 Forward 路径,没有 Forward+ 的分簇宏(LIGHT_LOOP_BEGIN),附加光就是普通 for 循环。
#ifndef COOKBOOK_CH12_LIGHTLOOP_INCLUDED
#define COOKBOOK_CH12_LIGHTLOOP_INCLUDED

vec3 AccumulateDirectLighting(MaterialCtx m, vec3 positionWS, vec2 screenUV)
{
    vec4 shadowMask = vec4(1.0);   // 本章不涉及 Shadowmask 烘焙,全 1 即可
    vec4 shadowCoord = TransformWorldToShadowCoord(positionWS);
    Light mainLight = GetMainLight(shadowCoord, positionWS, shadowMask);
    vec3 color = ShadeOneLight(m, mainLight);

#if defined(_ADDITIONAL_LIGHTS)
    int pixelLightCount = GetAdditionalLightsCount();
    for (int lightIndex = 0; lightIndex < pixelLightCount; lightIndex++)
    {
        color += ShadeOneLight(m, GetAdditionalLight(lightIndex, positionWS, shadowMask));
    }
#endif
    return color;
}

#endif