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

5.9 KiB
Raw Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
BasePass修改 2026-05-03 00:00:00 强制 PrePass、阴影 Only 材质、X2Multiply 雾效等 BasePass 层面修改
ARC
Rendering
BasePass

BasePass 修改

返回 Rendering

概述

ARC 引擎在 BasePass 层面做了多项针对性修改,包括强制 Early-Z 预通道、阴影专用材质和自定义混合模式的雾效处理。

1. 阴影专用材质RED_MASKED_SHADOW_ONLY

让材质只产生阴影投射而不渲染可见像素:

#if RED_MASKED_SHADOW_ONLY
    clip(-1);  // 直接丢弃像素
#endif

用于格斗游戏中只需要地面阴影但不需要渲染实体的辅助网格。

2. 强制 Early-ZEARLY_Z_PASS_FORCED

自定义材质属性 中的 bForcedPrepass 控制,强制特定材质走 Early-Z PrePass

// BasePassRendering.cpp
if (Material.bForcedPrepass)
{
    // 强制深度 Pass提前剔除被遮挡像素
    // 减少 OverDraw 对卡通渲染管线的性能影响
}

标记来源ASW / Wizcorp (2022)。

3. X2Multiply 雾效

BLEND_X2Multiply 混合模式提供正确的雾效混合:

#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 的噪声问题:

// MaterialTemplate.ush
DeviceDepth = lerp(
    DeviceDepth,
    MaterialParameters.SvPosition.z,
    step(PixelDepthOffset, 0));  // PDO <= 0 时使用原始深度

完整代码解析

阴影专用材质

// ASW Change : 2016/11/28 22:27:26 Takuro.K
// 阴影专用材质:在 BasePass 中直接丢弃像素
// 该网格只参与 Shadow Map 渲染,不产生可见输出
// 用于格斗游戏中只需要地面阴影的辅助几何体
#if RED_MASKED_SHADOW_ONLY
    clip(-1);    // 参数 < 0 → 丢弃当前像素
#endif

强制 Early-Z

// 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 雾效

// 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 间接光照

// 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++ 端实现

// BasePassRendering.cpp — X2Multiply BlendState
// ASW Change Y.Kawakami 2020/05/21
case BLEND_X2Multiply:
    // X2Multiply 使用与 Multiply 相同的 BlendState
    break;
// 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

关联文档

代码修改情况

文件路径 行号 修改类型 修改内容
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 修复