vault backup: 2026-05-03 20:37:58

This commit is contained in:
2026-05-03 20:37:58 +08:00
parent 4fb34c6f38
commit 83502d0874
37 changed files with 2411 additions and 0 deletions

View File

@@ -0,0 +1,130 @@
---
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 写入 |