--- title: 自定义光照Pass date: 2026-05-03 00:00:00 excerpt: REDDeferredLightPS 自定义光照 Pass、PointLight 排序和自定义光照路径 tags: - ARC - Rendering - Lighting rating: ⭐ --- # 自定义光照 Pass 返回 [[Rendering]] ## 概述 ARC 引擎在 Deferred Lighting 阶段新增了自定义光照 Pass,通过 `REDDeferredLightPS` 替换标准光照 Pixel Shader,实现 [[RED阴影系统]] 的阴影着色逻辑。同时修改了点光源的渲染排序和数据传递方式。 ## REDDeferredLightPS 在 `LightRendering.cpp` 中新增 Pixel Shader 类: ```cpp class REDDeferredLightPS : public FDeferredLightPS { // 绑定 DynamicShadowShade uniform 参数 // 调用 REDDirectionalPixelMain 入口 }; ``` ### DynamicShadowShade 参数 从 C++ 端传入的 uniform float,控制动态阴影区域的明暗程度: ```cpp // 0.0 = 完全黑色的动态阴影 // 1.0 = 无动态阴影效果 SetShaderValue(RHICmdList, ShaderRHI, DynamicShadowShadeParam, LightSceneInfo->DynamicShadowShade); ``` ## 点光源排序 点光源通过 `bPointLightRED` 排序键确保在方向光之后渲染: ```cpp // 排序优先级:方向光 → 点光源(RED) → 其他 SortKey |= bPointLightRED ? (1 << PointLightSortBit) : 0; ``` 这确保方向光的阴影着色先完成,点光源再叠加贡献。 ## 点光源 CustomData 覆写 渲染点光源时,GBufferD 的 CustomData 被重新解释为 DiffuseColor: ```hlsl // DeferredLightPixelShaders.usf #if USE_RED_CUSTOM_DATA_POINTLIGHT ScreenSpaceData.GBuffer.DiffuseColor.rgb = ScreenSpaceData.GBuffer.CustomData.rgb; #endif ``` ## RED_CUSTOM_LIGHTING 宏 通过 `RED_CUSTOM_LIGHTING` 定义控制是否启用整个自定义光照路径。关闭时回退到标准 UE4 Deferred Lighting。 ## Decal Emissive 处理 贴花的 Emissive 被作为正常光照渲染(而非 Emissive 通道),因为在 RED 管线中 BaseColor 已被阴影颜色系统占用: ```cpp // Decal Emissive → normal lighting contribution // (BaseColor 在 RED 系统中用于 shadow color) ``` ## 关联文档 - [[RED阴影系统]] — 核心阴影着色逻辑 - [[RED自定义数据通道]] — 点光源 CustomData 的来源 ## 修改文件列表 | 文件 | 修改类型 | |------|---------| | `Source/Runtime/Renderer/Private/LightRendering.cpp` | `REDDeferredLightPS`、排序、Decal | | `Shaders/Private/DeferredLightPixelShaders.usf` | `REDDirectionalPixelMain`、CustomData 覆写 | | `Shaders/Private/DeferredLightingCommon.ush` | 阴影合成修改 |