137 lines
3.6 KiB
Markdown
137 lines
3.6 KiB
Markdown
|
|
---
|
|||
|
|
title: 自定义后处理
|
|||
|
|
date: 2026-05-03 00:00:00
|
|||
|
|
excerpt: REDPostProcess 全套自定义后处理:Diffusion Filter、角色辉光、自定义 DOF
|
|||
|
|
tags:
|
|||
|
|
- ARC
|
|||
|
|
- Rendering
|
|||
|
|
- PostProcess
|
|||
|
|
- Toon
|
|||
|
|
rating: ⭐
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 自定义后处理
|
|||
|
|
|
|||
|
|
返回 [[Rendering]]
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
ARC 引擎新增了完整的自定义后处理系统(REDPostProcess),提供 Diffusion Filter(扩散滤镜)、角色辉光(Chara Glow)和自定义景深(DOF)三大功能。这些效果专门为动画风格渲染设计,与标准 UE4 后处理管线并行工作。
|
|||
|
|
|
|||
|
|
## Shader 端:REDPostProcess.usf
|
|||
|
|
|
|||
|
|
### Diffusion Filter(扩散滤镜)
|
|||
|
|
|
|||
|
|
基于亮度的柔焦/辉光效果,使用 13-tap 高斯模糊(7 权重核):
|
|||
|
|
|
|||
|
|
```hlsl
|
|||
|
|
// 从场景颜色提取高亮区域
|
|||
|
|
float Luminance = dot(SceneColor.rgb, float3(0.299, 0.587, 0.114));
|
|||
|
|
float LuminanceMask = pow(Luminance, LuminancePow);
|
|||
|
|
LuminanceMask = saturate(LuminanceMask - LuminanceThreshold);
|
|||
|
|
|
|||
|
|
// 高斯模糊后以 Screen 混合模式叠加
|
|||
|
|
// Screen blend: 1 - (1-A)(1-B)
|
|||
|
|
float3 Result = 1.0 - (1.0 - SceneColor.rgb) * (1.0 - BlurredHighlight);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
可调参数:
|
|||
|
|
- `DiffusionFilterLuminancePow` — 亮度幂次(控制提取范围)
|
|||
|
|
- `DiffusionFilterLuminanceThreshold` — 亮度阈值
|
|||
|
|
|
|||
|
|
### Diffusion Filter 2(变体)
|
|||
|
|
|
|||
|
|
```hlsl
|
|||
|
|
// Screen 混合 + Power 调整
|
|||
|
|
float3 BlendResult = 1.0 - (1.0 - A) * (1.0 - B);
|
|||
|
|
Result = pow(BlendResult, Power);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 角色辉光(Chara Glow)
|
|||
|
|
|
|||
|
|
从 GBufferD 的 B 通道读取 OutlineID 作为辉光遮罩,进行可变半径的 Box Blur:
|
|||
|
|
|
|||
|
|
```hlsl
|
|||
|
|
// 读取 GBufferD.b 作为遮罩
|
|||
|
|
float Mask = GBufferD.b;
|
|||
|
|
|
|||
|
|
// 可变半径 Box Blur
|
|||
|
|
for (int y = -Radius; y <= Radius; y++)
|
|||
|
|
for (int x = -Radius; x <= Radius; x++)
|
|||
|
|
Sum += SampleMask(UV + offset);
|
|||
|
|
|
|||
|
|
// 以 CharaGlowColor 叠加
|
|||
|
|
OutColor = Sum * CharaGlowColor * CharaGlowArea;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
可调参数:
|
|||
|
|
- `CharaGlowArea` — 辉光范围
|
|||
|
|
- `CharaGlowColor` — 辉光颜色
|
|||
|
|
|
|||
|
|
### 自定义 DOF
|
|||
|
|
|
|||
|
|
替代标准 DOF 的 RED 专用版本,支持近景/远景独立模糊:
|
|||
|
|
|
|||
|
|
```hlsl
|
|||
|
|
// 高斯模糊 Pass(水平 + 垂直分离)
|
|||
|
|
// 13-tap 核,权重:0.0044, 0.0540, 0.2420, 0.3990, ...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Soft Focus / Glow / Sepia
|
|||
|
|
|
|||
|
|
其他后处理变体:
|
|||
|
|
- **Soft Focus**:场景与模糊版本的简单混合 + 饱和度控制
|
|||
|
|
- **Glow**:亮度阈值 + Screen 混合辉光
|
|||
|
|
- **Sepia**:Diffusion Filter 2 的棕褐色变体
|
|||
|
|
|
|||
|
|
## C++ 端:REDPostProcess.h/.cpp
|
|||
|
|
|
|||
|
|
### 后处理 Pass 类型
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
// 4 种主要 Pass
|
|||
|
|
enum class EREDPostProcessPass
|
|||
|
|
{
|
|||
|
|
DiffusionFilter, // 扩散滤镜
|
|||
|
|
CharaGlow, // 角色辉光
|
|||
|
|
DownSample, // 降采样
|
|||
|
|
BlurH, BlurV, // 水平/垂直高斯模糊
|
|||
|
|
CustomGaussianDOF // 自定义 DOF
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 插入点控制
|
|||
|
|
|
|||
|
|
通过 CVar 控制后处理在管线中的插入位置:
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
// r.REDPostprocessAfterTranslucency
|
|||
|
|
// 0 = 在 SeparateTranslucency 之前
|
|||
|
|
// 1 = 在 SeparateTranslucency 之后
|
|||
|
|
// 2 = 在 Bloom 之后
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### PostProcessSettings 扩展
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
// Scene.h 新增
|
|||
|
|
float DiffusionFilterLuminancePow;
|
|||
|
|
float DiffusionFilterLuminanceThreshold;
|
|||
|
|
float CharaGlowArea;
|
|||
|
|
FLinearColor CharaGlowColor;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 关联文档
|
|||
|
|
|
|||
|
|
- [[RED自定义数据通道]] — CharaGlow 读取 GBufferD.b 通道
|
|||
|
|
- [[BGMultColor全局色调]] — 另一个全局色彩控制系统
|
|||
|
|
|
|||
|
|
## 修改文件列表
|
|||
|
|
|
|||
|
|
| 文件 | 修改类型 |
|
|||
|
|
|------|---------|
|
|||
|
|
| `Shaders/Private/REDPostProcess.usf` | **新增** — 完整后处理着色器 |
|
|||
|
|
| `Source/Runtime/Renderer/Private/PostProcess/REDPostProcess.h` | **新增** — C++ 后处理 Pass |
|
|||
|
|
| `Source/Runtime/Renderer/Private/PostProcess/REDPostProcess.cpp` | **新增** — C++ 实现 |
|
|||
|
|
| `Source/Runtime/Engine/Classes/Engine/Scene.h` | 新增 PostProcess 参数 |
|