2026-05-03 20:37:58 +08:00
|
|
|
|
---
|
|
|
|
|
|
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 信息影响后续后处理。
|
|
|
|
|
|
|
2026-05-03 21:38:46 +08:00
|
|
|
|
## 完整代码解析
|
|
|
|
|
|
|
|
|
|
|
|
### 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_A8(8位)
|
|
|
|
|
|
// 卡通渲染中 Specular 通常阶梯化,不需要高精度
|
|
|
|
|
|
#if defined(PLATFORM_PS5) && !PLATFORM_PS5
|
|
|
|
|
|
const EPixelFormat SpecularGBufferFormat = PF_A8;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-03 20:37:58 +08:00
|
|
|
|
## 关联文档
|
|
|
|
|
|
|
|
|
|
|
|
- [[RED自定义数据通道]] — GBufferD 的数据写入方
|
|
|
|
|
|
- [[自定义后处理]] — 读取 GBufferD 数据
|
|
|
|
|
|
|
2026-05-03 21:38:46 +08:00
|
|
|
|
## 代码修改情况
|
2026-05-03 20:37:58 +08:00
|
|
|
|
|
2026-05-03 21:38:46 +08:00
|
|
|
|
| 文件路径 | 行号 | 修改类型 | 修改内容 |
|
|
|
|
|
|
|---------|------|---------|---------|
|
|
|
|
|
|
| `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 |
|