--- title: RED自定义数据通道 date: 2026-05-03 00:00:00 excerpt: 复用 GBuffer CustomData 通道存储轮廓线 ID 和点光源 DiffuseColor tags: - ARC - Rendering - GBuffer - Toon rating: ⭐ --- # RED 自定义数据通道 返回 [[Rendering]] ## 概述 RED 自定义数据通道是 ARC 引擎中一个巧妙的 GBuffer 复用方案。它将 UE4 原有的 **Subsurface Scattering** 数据通道(GBufferD CustomData)重新用于存储卡通渲染所需的**轮廓线 ID** 和**点光源 DiffuseColor**,避免了新增 GBuffer 通道带来的带宽开销。 ## 控制宏 ```hlsl // 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` 条件: ```hlsl #define WRITES_CUSTOMDATA_TO_GBUFFER (USES_GBUFFER && ( MATERIAL_SHADINGMODEL_SUBSURFACE || MATERIAL_SHADINGMODEL_SUBSURFACE_PROFILE || ... || USE_RED_CUSTOM_DATA )) ``` ### 2. 填充 CustomData 在 `ShadingModelsMaterial.ush` 中,为 `UNLIT` 和 `DEFAULT_LIT` 两个 ShadingModel 注入自定义数据: ```hlsl #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.usf` 中,SubsurfaceColor 被重新赋值: ```hlsl #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` 中: ```hlsl #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 被占用 | | 对渲染管线入侵性小 | 两种模式(基础/点光源)互斥 | ## 关联文档 - [[RED阴影系统]] — 点光源模式下 DiffuseColor 的使用方 - [[自定义后处理]] — CharaGlow 读取 OutlineID 通道 - [[GBuffer修改]] — GBufferD 清除色等相关修改 ## 修改文件列表 | 文件 | 修改类型 | |------|---------| | `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 写入 |