vault backup: 2026-05-03 21:38:46

This commit is contained in:
2026-05-03 21:38:46 +08:00
parent 83502d0874
commit 0a81d4ee33
34 changed files with 2442 additions and 845 deletions

View File

@@ -81,10 +81,87 @@ SortKey |= bPointLightRED ? (1 << PointLightSortBit) : 0;
- [[RED阴影系统]] — 核心阴影着色逻辑
- [[RED自定义数据通道]] — 点光源 CustomData 的来源
## 修改文件列表
## 完整代码解析
| 文件 | 修改类型 |
|------|---------|
| `Source/Runtime/Renderer/Private/LightRendering.cpp` | `REDDeferredLightPS`、排序、Decal |
| `Shaders/Private/DeferredLightPixelShaders.usf` | `REDDirectionalPixelMain`、CustomData 覆写 |
| `Shaders/Private/DeferredLightingCommon.ush` | 阴影合成修改 |
> Shader 侧的完整代码解析(`REDDirectionalPixelMain`、`REDGetShadowTerms`、`REDGetShadowColor`)请参见 [[RED阴影系统#完整代码解析]]。本节仅补充 C++ 端的结构说明。
### LightRendering.cppREDDeferredLightPS 类结构
```cpp
// ASW Change : 2016/10/12 21:35:18 Takuro.K
// 继承自标准 FDeferredLightPS新增 DynamicShadowShade 参数绑定
class REDDeferredLightPS : public FDeferredLightPS
{
DECLARE_SHADER_TYPE(REDDeferredLightPS, Global);
// Shader 参数声明
FShaderParameter DynamicShadowShadeParam;
// 构造函数中绑定参数
REDDeferredLightPS(const ShaderMetaType::CompiledShaderInitializerType& Initializer)
: FDeferredLightPS(Initializer)
{
DynamicShadowShadeParam.Bind(
Initializer.ParameterMap, TEXT("DynamicShadowShade"));
}
// SetParameters 中传入光源的 DynamicShadowShade 值
void SetParameters(FRHICommandList& RHICmdList,
const FSceneView& View,
const FLightSceneInfo* LightSceneInfo)
{
FDeferredLightPS::SetParameters(RHICmdList, View, LightSceneInfo);
const FPixelShaderRHIParamRef ShaderRHI = GetPixelShader();
// 从光源信息获取 DynamicShadowShade 值并设置到 GPU
SetShaderValue(RHICmdList, ShaderRHI,
DynamicShadowShadeParam,
LightSceneInfo->DynamicShadowShade);
}
};
```
### LightRendering.cpp — 点光源排序
```cpp
// ASW Change : 2019/02/05 20:37:00 Takeshi.N
// 确保点光源在方向光之后渲染,让方向光阴影着色先完成
// bPointLightRED 标志位用于区分 RED 系统的点光源
uint32 SortKey = 0;
SortKey |= bDirectionalLight ? 0 : (1 << DirectionalLightSortBit);
SortKey |= bPointLightRED ? (1 << PointLightSortBit) : 0;
// 排序结果DirectionalLight(RED) → PointLight(RED) → 其他光源
```
### LightRendering.cpp — RED_CUSTOM_LIGHTING 条件分派
```cpp
// 根据 RED_CUSTOM_LIGHTING 宏决定使用标准光照还是 RED 光照
#if RED_CUSTOM_LIGHTING
if (bUseREDLighting)
{
// 使用 REDDeferredLightPS 渲染方向光
TShaderMapRef<REDDeferredLightPS> PixelShader(View.ShaderMap);
// ...
}
else
#endif
{
// 标准 UE4 Deferred Light 路径
TShaderMapRef<FDeferredLightPS> PixelShader(View.ShaderMap);
// ...
}
```
## 代码修改情况
| 文件路径 | 行号 | 修改类型 | 修改内容 |
|---------|------|---------|---------|
| `Source/Runtime/Renderer/Private/LightRendering.cpp` | — | 新增 | `REDDeferredLightPS` 类(继承 `FDeferredLightPS` |
| `Source/Runtime/Renderer/Private/LightRendering.cpp` | — | 新增 | `DynamicShadowShade` Shader 参数绑定 |
| `Source/Runtime/Renderer/Private/LightRendering.cpp` | — | 修改 | 点光源排序键 `bPointLightRED`(方向光后渲染) |
| `Source/Runtime/Renderer/Private/LightRendering.cpp` | — | 修改 | Decal Emissive → 正常光照贡献 |
| `Shaders/Private/DeferredLightPixelShaders.usf` | L109~L145 | 新增 | `REDDirectionalPixelMain` 入口(详见 [[RED阴影系统]] |
| `Shaders/Private/DeferredLightPixelShaders.usf` | L236~L239 | 新增 | CustomData → DiffuseColor 覆写 |
| `Shaders/Private/DeferredLightingCommon.ush` | L457~L557 | 新增 | `REDGetShadowTerms` + `REDGetShadowColor`(详见 [[RED阴影系统]] |