2026-05-03 20:37:58 +08:00
|
|
|
|
---
|
|
|
|
|
|
title: BasePass修改
|
|
|
|
|
|
date: 2026-05-03 00:00:00
|
|
|
|
|
|
excerpt: 强制 PrePass、阴影 Only 材质、X2Multiply 雾效等 BasePass 层面修改
|
|
|
|
|
|
tags:
|
|
|
|
|
|
- ARC
|
|
|
|
|
|
- Rendering
|
|
|
|
|
|
- BasePass
|
|
|
|
|
|
rating: ⭐
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# BasePass 修改
|
|
|
|
|
|
|
|
|
|
|
|
返回 [[Rendering]]
|
|
|
|
|
|
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
|
|
|
|
|
|
ARC 引擎在 BasePass 层面做了多项针对性修改,包括强制 Early-Z 预通道、阴影专用材质和自定义混合模式的雾效处理。
|
|
|
|
|
|
|
|
|
|
|
|
## 1. 阴影专用材质(RED_MASKED_SHADOW_ONLY)
|
|
|
|
|
|
|
|
|
|
|
|
让材质只产生阴影投射而不渲染可见像素:
|
|
|
|
|
|
|
|
|
|
|
|
```hlsl
|
|
|
|
|
|
#if RED_MASKED_SHADOW_ONLY
|
|
|
|
|
|
clip(-1); // 直接丢弃像素
|
|
|
|
|
|
#endif
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
用于格斗游戏中只需要地面阴影但不需要渲染实体的辅助网格。
|
|
|
|
|
|
|
|
|
|
|
|
## 2. 强制 Early-Z(EARLY_Z_PASS_FORCED)
|
|
|
|
|
|
|
|
|
|
|
|
由 [[自定义材质属性]] 中的 `bForcedPrepass` 控制,强制特定材质走 Early-Z PrePass:
|
|
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
|
// BasePassRendering.cpp
|
|
|
|
|
|
if (Material.bForcedPrepass)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 强制深度 Pass,提前剔除被遮挡像素
|
|
|
|
|
|
// 减少 OverDraw 对卡通渲染管线的性能影响
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
标记来源:ASW / Wizcorp (2022)。
|
|
|
|
|
|
|
|
|
|
|
|
## 3. X2Multiply 雾效
|
|
|
|
|
|
|
|
|
|
|
|
为 `BLEND_X2Multiply` 混合模式提供正确的雾效混合:
|
|
|
|
|
|
|
|
|
|
|
|
```hlsl
|
|
|
|
|
|
#elif MATERIALBLENDING_X2MULTIPLY
|
|
|
|
|
|
// X2Multiply 的中性色是 0.5(不是 0 或 1)
|
|
|
|
|
|
half3 FoggedColor = lerp(
|
|
|
|
|
|
float3(0.5, 0.5, 0.5),
|
|
|
|
|
|
Color,
|
|
|
|
|
|
Fogging.aaa * Fogging.aaa);
|
|
|
|
|
|
Out.MRT[0] = half4(FoggedColor, Opacity);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
标准 Multiply 中性色为 1.0,X2Multiply 中性色为 0.5。
|
|
|
|
|
|
|
|
|
|
|
|
## 4. PixelDepthOffset 修复
|
|
|
|
|
|
|
|
|
|
|
|
修复 PC 平台 PixelDepthOffset 的噪声问题:
|
|
|
|
|
|
|
|
|
|
|
|
```hlsl
|
|
|
|
|
|
// MaterialTemplate.ush
|
|
|
|
|
|
DeviceDepth = lerp(
|
|
|
|
|
|
DeviceDepth,
|
|
|
|
|
|
MaterialParameters.SvPosition.z,
|
|
|
|
|
|
step(PixelDepthOffset, 0)); // PDO <= 0 时使用原始深度
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-03 21:38:46 +08:00
|
|
|
|
## 完整代码解析
|
|
|
|
|
|
|
|
|
|
|
|
### 阴影专用材质
|
|
|
|
|
|
|
|
|
|
|
|
```hlsl
|
|
|
|
|
|
// ASW Change : 2016/11/28 22:27:26 Takuro.K
|
|
|
|
|
|
// 阴影专用材质:在 BasePass 中直接丢弃像素
|
|
|
|
|
|
// 该网格只参与 Shadow Map 渲染,不产生可见输出
|
|
|
|
|
|
// 用于格斗游戏中只需要地面阴影的辅助几何体
|
|
|
|
|
|
#if RED_MASKED_SHADOW_ONLY
|
|
|
|
|
|
clip(-1); // 参数 < 0 → 丢弃当前像素
|
|
|
|
|
|
#endif
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 强制 Early-Z
|
|
|
|
|
|
|
|
|
|
|
|
```hlsl
|
|
|
|
|
|
// ASW / Wizcorp Change: 2022/06/03 Maciej.W
|
|
|
|
|
|
// 原始条件:!EARLY_Z_PASS_ONLY_MATERIAL_MASKING
|
|
|
|
|
|
// 新增条件:&& !EARLY_Z_PASS_FORCED
|
|
|
|
|
|
// 当材质标记了 bForcedPrepass 时,跳过 BasePass 中的 Mask clip
|
|
|
|
|
|
// 因为深度已经在 PrePass 中确定,无需重复剔除
|
|
|
|
|
|
#if !EARLY_Z_PASS_ONLY_MATERIAL_MASKING && !EARLY_Z_PASS_FORCED
|
|
|
|
|
|
if (!bEditorWeightedZBuffering)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Mask clip 逻辑...
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### X2Multiply 雾效
|
|
|
|
|
|
|
|
|
|
|
|
```hlsl
|
|
|
|
|
|
// ASW Change : 2019/10/28 16:51:00 Takeshi.N
|
|
|
|
|
|
// X2Multiply 混合模式的雾效处理
|
|
|
|
|
|
// X2Multiply 的中性色是 0.5(乘以2后为1.0,不改变目标颜色)
|
|
|
|
|
|
// 所以雾效需要将颜色过渡到 0.5 而非 0.0(加法)或 1.0(乘法)
|
|
|
|
|
|
#elif MATERIALBLENDING_X2MULTIPLY
|
|
|
|
|
|
half3 FoggedColor = lerp(
|
|
|
|
|
|
float3(0.5, 0.5, 0.5), // X2Multiply 中性色
|
|
|
|
|
|
Color, // 原始颜色
|
|
|
|
|
|
Fogging.aaa * Fogging.aaa); // 雾衰减(平方使过渡更平滑)
|
|
|
|
|
|
Out.MRT[0] = half4(FoggedColor, Opacity);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 禁用 DEFAULT_LIT 间接光照
|
|
|
|
|
|
|
|
|
|
|
|
```hlsl
|
|
|
|
|
|
// ASW Change : 2017/12/14 11:00:00 Takeshi.N
|
|
|
|
|
|
// 对 DEFAULT_LIT + Deferred 路径禁用预计算间接光照
|
|
|
|
|
|
// 因为在 RED 管线中,BaseColor 被用于阴影颜色而非 PBR 漫反射
|
|
|
|
|
|
// 间接光照会干扰卡通阴影效果
|
|
|
|
|
|
#if MATERIAL_SHADINGMODEL_DEFAULT_LIT && !(FORWARD_SHADING || TRANSLUCENCY_LIGHTING_SURFACE_FORWARDSHADING)
|
|
|
|
|
|
// 跳过 GetPrecomputedIndirectLightingAndSkyLight 及相关计算
|
|
|
|
|
|
#else
|
|
|
|
|
|
// 原始间接光照逻辑
|
|
|
|
|
|
float3 DiffuseIndirectLighting;
|
|
|
|
|
|
float3 SubsurfaceIndirectLighting;
|
|
|
|
|
|
GetPrecomputedIndirectLightingAndSkyLight(...);
|
|
|
|
|
|
DiffuseColor += (DiffuseIndirectLighting * DiffuseColorForIndirect + ...) * AOMultiBounce(...);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### C++ 端实现
|
|
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
|
// BasePassRendering.cpp — X2Multiply BlendState
|
|
|
|
|
|
// ASW Change Y.Kawakami 2020/05/21
|
|
|
|
|
|
case BLEND_X2Multiply:
|
|
|
|
|
|
// X2Multiply 使用与 Multiply 相同的 BlendState
|
|
|
|
|
|
break;
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
|
// BasePassRendering.cpp — ForcedPrepass
|
|
|
|
|
|
// ASW / Wizcorp Change: 2022/06/03 Maciej.W
|
|
|
|
|
|
const bool bEnforceMaskedEarlyPass =
|
|
|
|
|
|
Mesh.MaterialRenderProxy->GetMaterial(FeatureLevel)->IsForcedPrepass()
|
|
|
|
|
|
&& EarlyZPassMode != DDM_None;
|
|
|
|
|
|
// 强制该材质走 Early-Z PrePass,减少 OverDraw
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-03 20:37:58 +08:00
|
|
|
|
## 关联文档
|
|
|
|
|
|
|
|
|
|
|
|
- [[自定义材质属性]] — `bForcedPrepass` 和 `BLEND_X2Multiply`
|
|
|
|
|
|
- [[RED自定义数据通道]] — BasePass 中 CustomData 的写入
|
|
|
|
|
|
|
2026-05-03 21:38:46 +08:00
|
|
|
|
## 代码修改情况
|
|
|
|
|
|
|
|
|
|
|
|
| 文件路径 | 行号 | 修改类型 | 修改内容 |
|
|
|
|
|
|
|---------|------|---------|---------|
|
|
|
|
|
|
| `Shaders/Private/BasePassPixelShader.usf` | L772~L776 | 新增 | `RED_MASKED_SHADOW_ONLY` 阴影专用材质 `clip(-1)` |
|
|
|
|
|
|
| `Shaders/Private/BasePassPixelShader.usf` | L850~L854 | 修改 | Early-Z 条件添加 `!EARLY_Z_PASS_FORCED` |
|
|
|
|
|
|
| `Shaders/Private/BasePassPixelShader.usf` | L1137~L1163 | 修改 | DEFAULT_LIT Deferred 路径禁用预计算间接光 |
|
|
|
|
|
|
| `Shaders/Private/BasePassPixelShader.usf` | L1291~L1296 | 修改 | Emissive 声明前移(与 CustomData 配合) |
|
|
|
|
|
|
| `Shaders/Private/BasePassPixelShader.usf` | L1433~L1438 | 新增 | `MATERIALBLENDING_X2MULTIPLY` 雾效处理 |
|
|
|
|
|
|
| `Source/Runtime/Renderer/Private/BasePassRendering.cpp` | L200~L216 | 新增 | `BLEND_X2Multiply` case 分支 |
|
|
|
|
|
|
| `Source/Runtime/Renderer/Private/BasePassRendering.cpp` | L288~L309 | 新增 | `bEnforceMaskedEarlyPass` 强制 PrePass 判断 |
|
|
|
|
|
|
| `Source/Runtime/Renderer/Private/BasePassRendering.cpp` | L1068~L1087 | 新增 | Shader Define 注入(`USE_RED_CUSTOM_DATA`/`USE_BGMULTCOLOR`/`USES_ORTHO_BLEND`等) |
|
|
|
|
|
|
| `Source/Runtime/Renderer/Private/BasePassRendering.cpp` | L1633~L1694 | 新增 | X2Multiply/AdditiveForUI BlendState 设置 |
|
|
|
|
|
|
| `Source/Runtime/Renderer/Private/DepthRendering.cpp` | L925~L1061 | 新增 | ForcedPrepass 深度渲染逻辑 |
|
|
|
|
|
|
| `Shaders/Private/MaterialTemplate.ush` | L2584~L2587 | 新增 | PixelDepthOffset 修复 |
|