Files
BlueRoseNote/03-UnrealEngine/卡通渲染相关资料/渲染功能/ARC/Rendering/BasePass修改.md

177 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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-ZEARLY_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.0X2Multiply 中性色为 0.5。
## 4. PixelDepthOffset 修复
修复 PC 平台 PixelDepthOffset 的噪声问题:
```hlsl
// MaterialTemplate.ush
DeviceDepth = lerp(
DeviceDepth,
MaterialParameters.SvPosition.z,
step(PixelDepthOffset, 0)); // PDO <= 0 时使用原始深度
```
## 完整代码解析
### 阴影专用材质
```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
```
## 关联文档
- [[自定义材质属性]] — `bForcedPrepass``BLEND_X2Multiply`
- [[RED自定义数据通道]] — BasePass 中 CustomData 的写入
## 代码修改情况
| 文件路径 | 行号 | 修改类型 | 修改内容 |
|---------|------|---------|---------|
| `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 修复 |