Files
BlueRoseNote/03-UnrealEngine/卡通渲染相关资料/渲染功能/ARC/Rendering/RED自定义数据通道.md

3.9 KiB
Raw Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
RED自定义数据通道 2026-05-03 00:00:00 复用 GBuffer CustomData 通道存储轮廓线 ID 和点光源 DiffuseColor
ARC
Rendering
GBuffer
Toon

RED 自定义数据通道

返回 Rendering

概述

RED 自定义数据通道是 ARC 引擎中一个巧妙的 GBuffer 复用方案。它将 UE4 原有的 Subsurface Scattering 数据通道GBufferD CustomData重新用于存储卡通渲染所需的轮廓线 ID点光源 DiffuseColor,避免了新增 GBuffer 通道带来的带宽开销。

控制宏

// Definitions.usf
#ifndef USE_RED_CUSTOM_DATA_POINTLIGHT
#define USE_RED_CUSTOM_DATA_POINTLIGHT  0
#endif

#ifndef USE_RED_CUSTOM_DATA
#define USE_RED_CUSTOM_DATA  USE_RED_CUSTOM_DATA_POINTLIGHT
#endif

两个模式:

  • USE_RED_CUSTOM_DATA — 基础模式,存储轮廓线 ID从 SubsurfaceData.b 通道读取)
  • USE_RED_CUSTOM_DATA_POINTLIGHT — 点光源模式,存储 Emissive 作为 DiffuseColor

数据写入流程

1. 启用 CustomData 写入

BasePassCommon.ush 中,将 USE_RED_CUSTOM_DATA 加入 WRITES_CUSTOMDATA_TO_GBUFFER 条件:

#define WRITES_CUSTOMDATA_TO_GBUFFER (USES_GBUFFER && (
    MATERIAL_SHADINGMODEL_SUBSURFACE ||
    MATERIAL_SHADINGMODEL_SUBSURFACE_PROFILE ||
    ... ||
    USE_RED_CUSTOM_DATA ))

2. 填充 CustomData

ShadingModelsMaterial.ush 中,为 UNLITDEFAULT_LIT 两个 ShadingModel 注入自定义数据:

#if MATERIAL_SHADINGMODEL_UNLIT
    GBuffer.ShadingModelID = SHADINGMODELID_UNLIT;
    #if USE_RED_CUSTOM_DATA
        GBuffer.CustomData = float4(SubsurfaceColor, SubsurfaceProfile);
    #endif

#elif MATERIAL_SHADINGMODEL_DEFAULT_LIT
    GBuffer.ShadingModelID = SHADINGMODELID_DEFAULT_LIT;
    #if USE_RED_CUSTOM_DATA
        GBuffer.CustomData = float4(SubsurfaceColor, SubsurfaceProfile);
    #endif
#endif

3. SubsurfaceColor 的实际含义

BasePassPixelShader.usfSubsurfaceColor 被重新赋值:

#if USE_RED_CUSTOM_DATA
    {
#if USE_RED_CUSTOM_DATA_POINTLIGHT
        // 点光源模式Emissive 作为 DiffuseColor
        SubsurfaceColor   = Emissive;
        SubsurfaceProfile = 0.0;
#else
        // 基础模式B 通道存储 OutlineID
        float4 SubsurfaceData = GetMaterialSubsurfaceData(PixelMaterialInputs);
        SubsurfaceColor   = float3(0, 0, 0);
        SubsurfaceProfile = SubsurfaceData.b;  // OutlineID
#endif
    }
#endif

4. 写入 GBufferD

DeferredShadingCommon.ush 中:

#if USE_RED_CUSTOM_DATA
    OutGBufferD = GBuffer.CustomData;
#endif

数据读取

  • 轮廓线渲染:从 GBufferD.b 读取 OutlineID用于区分不同物体的轮廓线参数
  • 点光源着色:从 GBufferD.rgb 读取 DiffuseColor用于 RED阴影系统 的阴影着色
  • 角色辉光自定义后处理 中的 CharaGlow 读取 GBufferD.b 作为辉光遮罩

设计权衡

优点 缺点
零额外 GBuffer 带宽开销 无法同时使用 SSS 材质
复用已有的 CustomData 管线 UNLIT/DEFAULT_LIT 的 SubsurfaceColor 被占用
对渲染管线入侵性小 两种模式(基础/点光源)互斥

关联文档

修改文件列表

文件 修改类型
Shaders/Private/Definitions.usf 新增 USE_RED_CUSTOM_DATA 宏定义
Shaders/Private/BasePassCommon.ush 扩展 WRITES_CUSTOMDATA_TO_GBUFFER
Shaders/Private/ShadingModelsMaterial.ush UNLIT/DEFAULT_LIT 写入 CustomData
Shaders/Private/BasePassPixelShader.usf SubsurfaceColor 重定义逻辑
Shaders/Private/DeferredShadingCommon.ush GBufferD 写入