3.9 KiB
3.9 KiB
title, date, excerpt, tags, rating
| title | date | excerpt | tags | rating | ||||
|---|---|---|---|---|---|---|---|---|
| RED自定义数据通道 | 2026-05-03 00:00:00 | 复用 GBuffer CustomData 通道存储轮廓线 ID 和点光源 DiffuseColor |
|
⭐ |
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 中,为 UNLIT 和 DEFAULT_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.usf 中,SubsurfaceColor 被重新赋值:
#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 写入 |