Files
BlueRoseNote/03-UnrealEngine/卡通渲染相关资料/渲染功能/ARC/Rendering/GBuffer修改.md

105 lines
3.3 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: GBuffer修改
date: 2026-05-03 00:00:00
excerpt: GBufferD 清除色、Specular 格式和法线 GBuffer 格式调整
tags:
- ARC
- Rendering
- GBuffer
rating: ⭐
---
# GBuffer 修改
返回 [[Rendering]]
## 概述
ARC 引擎对 GBuffer 进行了多处细节修改,主要围绕 CustomData 通道GBufferD的清除色、Specular GBuffer 格式和法线格式。
## 修改内容
### 1. GBufferD 清除色
将 GBufferD 的清除色从默认值改为 `(0, 0, 0, 0)`
```cpp
// SceneRenderTargets.cpp
// GBufferD 清除为黑色,确保 OutlineID 和 PointLight 数据的默认值为 0
ClearColor = FLinearColor(0, 0, 0, 0);
```
这确保未被写入 [[RED自定义数据通道]] 的像素不会产生错误的轮廓线 ID 或辉光遮罩。
### 2. Specular GBuffer 格式
在非 PS5 平台上Specular GBuffer 格式改为 `PF_A8`
```cpp
// 非 PS5 平台使用 8 位精度
SpecularGBufferFormat = PF_A8;
```
降低 Specular 精度以节省带宽对卡通渲染影响极小Specular 在 Toon 着色中通常使用阶梯化而非平滑过渡)。
### 3. PostProcessDownsample Alpha
`PostProcessDownsample.usf` 中强制 Alpha 为 1.0
```hlsl
OutColor.a = 1.f;
```
防止降采样过程中 Alpha 通道携带的 CustomData 信息影响后续后处理。
## 完整代码解析
### PostProcessDownsample Alpha 修复
```hlsl
// PostProcessDownsample.usf
// 强制 Alpha 为 1.0,防止 CustomData 中的 OutlineID 信息
// 在降采样过程中泄漏到后续后处理 Pass
OutColor.rgb = max(float3(0,0,0), OutColor.rgb);
OutColor.a = 1.f; // <-- ASW 新增
```
### C++ 端实现
```cpp
// SceneRenderTargets.cpp — GBufferD 清除色修改
// ASW Change : 2016/11/09 Takuro.K
// 将 GBufferD 清除色改为 (0,0,0,0)
// 确保未写入 CustomData 的像素 OutlineID=0、PointLight DiffuseColor=黑色
FPooledRenderTargetDesc Desc(FPooledRenderTargetDesc::Create2DDesc(
BufferSize, BufferFormat,
FClearValueBinding(FLinearColor(0, 0, 0, 0)), // <-- 清除色改为全0
TexCreate_SRGB,
TexCreate_RenderTargetable | TexCreate_ShaderResource, false));
```
```cpp
// SceneRenderTargets.cpp — Specular GBuffer 格式
// ASW Change : 2017/11/21 Takuro.K
// 非 PS5 平台降低 Specular 精度到 PF_A88位
// 卡通渲染中 Specular 通常阶梯化,不需要高精度
#if defined(PLATFORM_PS5) && !PLATFORM_PS5
const EPixelFormat SpecularGBufferFormat = PF_A8;
#endif
```
## 关联文档
- [[RED自定义数据通道]] — GBufferD 的数据写入方
- [[自定义后处理]] — 读取 GBufferD 数据
## 代码修改情况
| 文件路径 | 行号 | 修改类型 | 修改内容 |
|---------|------|---------|---------|
| `Source/Runtime/Renderer/Private/PostProcess/SceneRenderTargets.cpp` | L737 | 修改 | Normal GBuffer 格式(已禁用) |
| `Source/Runtime/Renderer/Private/PostProcess/SceneRenderTargets.cpp` | L1257~L1268 | 修改 | Specular GBuffer → `PF_A8`非PS5 |
| `Source/Runtime/Renderer/Private/PostProcess/SceneRenderTargets.cpp` | L1271~L1284 | 修改 | GBufferD 清除色 → `(0,0,0,0)` |
| `Source/Runtime/Renderer/Private/PostProcess/SceneRenderTargets.cpp` | L1364~L1380 | 修改 | GBuffer 格式相关调整 |
| `Shaders/Private/PostProcessDownsample.usf` | L63 | 新增 | `OutColor.a = 1.f` 强制 Alpha 为 1 |