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 写入 |
|