131 lines
3.9 KiB
Markdown
131 lines
3.9 KiB
Markdown
---
|
||
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 写入 |
|