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

131 lines
3.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: 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 写入 |