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,69 @@
---
title: BGMultColor全局色调
date: 2026-05-03 00:00:00
excerpt: 场景全局颜色乘算/去饱和度系统
tags:
- ARC
- Rendering
- ColorGrading
rating: ⭐
---
# BGMultColor 全局色调
返回 [[Rendering]]
## 概述
BGMultColor 是一个场景级别的全局色调控制系统,通过 `View.BGMultColor` 统一对场景颜色进行乘算和饱和度调节。在格斗游戏中常用于:关卡背景的整体色调控制、特殊技能释放时的画面变化、回合结束的灰度效果等。
## Shader 端实现
`BasePassPixelShader.usf` 中(对 Opaque 和 Translucent 均生效):
```hlsl
#if USE_BGMULTCOLOR
{
// RGB 通道:颜色乘算
BaseColor *= View.BGMultColor.rgb;
// A 通道饱和度控制1=原色0=灰度)
float Grayscale = dot(BaseColor, float3(0.299f, 0.587f, 0.114f));
BaseColor = lerp(
float3(Grayscale, Grayscale, Grayscale),
BaseColor,
View.BGMultColor.a);
}
#endif
```
相同逻辑也应用于:
- `DeferredDecal.usf` — 贴花系统
- `DeferredLightPixelShaders.usf` — 点光源着色
## C++ 端数据源
`BGMultColor` 通过 `REDSceneContext` 设置,经由 `ViewUniformShaderParameters` 传入 Shader。参见 [[REDSceneContext]]。
## 参数说明
| 分量 | 范围 | 说明 |
|------|------|------|
| R | 0~∞ | 红色乘数 |
| G | 0~∞ | 绿色乘数 |
| B | 0~∞ | 蓝色乘数 |
| A | 0~1 | 饱和度0=完全灰度1=原色) |
## 关联文档
- [[REDSceneContext]] — BGMultColor 的数据源
- [[自定义后处理]] — 后处理阶段的色彩控制
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Shaders/Private/BasePassPixelShader.usf` | 颜色乘算 + 去饱和 |
| `Shaders/Private/DeferredDecal.usf` | 同上 |
| `Shaders/Private/DeferredLightPixelShaders.usf` | 点光源颜色调制 |
| `Source/Runtime/Renderer/Private/SceneRendering.cpp` | 写入 ViewUniform |

View File

@@ -0,0 +1,86 @@
---
title: BasePass修改
date: 2026-05-03 00:00:00
excerpt: 强制 PrePass、阴影 Only 材质、X2Multiply 雾效等 BasePass 层面修改
tags:
- ARC
- Rendering
- BasePass
rating: ⭐
---
# BasePass 修改
返回 [[Rendering]]
## 概述
ARC 引擎在 BasePass 层面做了多项针对性修改,包括强制 Early-Z 预通道、阴影专用材质和自定义混合模式的雾效处理。
## 1. 阴影专用材质RED_MASKED_SHADOW_ONLY
让材质只产生阴影投射而不渲染可见像素:
```hlsl
#if RED_MASKED_SHADOW_ONLY
clip(-1); // 直接丢弃像素
#endif
```
用于格斗游戏中只需要地面阴影但不需要渲染实体的辅助网格。
## 2. 强制 Early-ZEARLY_Z_PASS_FORCED
由 [[自定义材质属性]] 中的 `bForcedPrepass` 控制,强制特定材质走 Early-Z PrePass
```cpp
// BasePassRendering.cpp
if (Material.bForcedPrepass)
{
// 强制深度 Pass提前剔除被遮挡像素
// 减少 OverDraw 对卡通渲染管线的性能影响
}
```
标记来源ASW / Wizcorp (2022)。
## 3. X2Multiply 雾效
`BLEND_X2Multiply` 混合模式提供正确的雾效混合:
```hlsl
#elif MATERIALBLENDING_X2MULTIPLY
// X2Multiply 的中性色是 0.5(不是 0 或 1
half3 FoggedColor = lerp(
float3(0.5, 0.5, 0.5),
Color,
Fogging.aaa * Fogging.aaa);
Out.MRT[0] = half4(FoggedColor, Opacity);
```
标准 Multiply 中性色为 1.0X2Multiply 中性色为 0.5。
## 4. PixelDepthOffset 修复
修复 PC 平台 PixelDepthOffset 的噪声问题:
```hlsl
// MaterialTemplate.ush
DeviceDepth = lerp(
DeviceDepth,
MaterialParameters.SvPosition.z,
step(PixelDepthOffset, 0)); // PDO <= 0 时使用原始深度
```
## 关联文档
- [[自定义材质属性]] — `bForcedPrepass``BLEND_X2Multiply`
- [[RED自定义数据通道]] — BasePass 中 CustomData 的写入
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Shaders/Private/BasePassPixelShader.usf` | 阴影 Only、X2Multiply 雾效 |
| `Source/Runtime/Renderer/Private/BasePassRendering.cpp` | 强制 PrePass、X2Multiply BlendState |
| `Shaders/Private/MaterialTemplate.ush` | PDO 修复 |

View File

@@ -0,0 +1,65 @@
---
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 信息影响后续后处理。
## 关联文档
- [[RED自定义数据通道]] — GBufferD 的数据写入方
- [[自定义后处理]] — 读取 GBufferD 数据
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Source/Runtime/Renderer/Private/SceneRenderTargets.cpp` | GBufferD 清除色、Specular 格式 |
| `Shaders/Private/PostProcessDownsample.usf` | Alpha 强制为 1.0 |

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

View File

@@ -0,0 +1,126 @@
---
title: RED阴影系统
date: 2026-05-03 00:00:00
excerpt: 动态/静态阴影分离着色系统ARC 卡通渲染的核心阴影方案
tags:
- ARC
- Rendering
- Shadow
- Toon
rating: ⭐
---
# RED 阴影系统
返回 [[Rendering]]
## 概述
RED 阴影系统是 ARC 引擎卡通渲染的核心机制。它将传统 Deferred Lighting 中的阴影处理替换为**阴影着色Shadow Coloring**方案——阴影区域不是简单地变暗,而是使用指定的"阴影颜色"进行着色,这是实现赛璐珞风格卡通渲染的关键技术。
## 核心思路
传统 PBR 阴影:`最终颜色 = 光照颜色 × 阴影衰减`
RED 阴影系统:`最终颜色 = lerp(阴影颜色, 光照颜色, 阴影系数)`
同时将**动态阴影**Shadow Map和**静态阴影**Lightmap / Distance Field Shadow分离处理允许独立控制两种阴影的着色效果。
## 实现细节
### 1. 入口函数 REDDirectionalPixelMain
`DeferredLightPixelShaders.usf` 中新增独立的方向光入口:
```hlsl
// ASW Change : 2016/10/12 21:35:18 Takuro.K
void REDDirectionalPixelMain(
float2 InUV : TEXCOORD0,
float3 ScreenVector : TEXCOORD1,
float4 SVPos : SV_POSITION,
out float4 OutColor : SV_Target0 )
{
// ... 读取 GBuffer、计算光照衰减 ...
OutColor = REDGetShadowColor(
WorldPosition, CameraVector, ScreenSpaceData.GBuffer,
ScreenSpaceData.AmbientOcclusion,
ScreenSpaceData.GBuffer.ShadingModelID,
LightData, GetPerPixelLightAttenuation(InUV),
Random, DynamicShadowShade);
}
```
`DynamicShadowShade` 是一个 uniform 参数,控制动态阴影的明暗程度。
### 2. 阴影项分离 REDGetShadowTerms
`DeferredLightingCommon.ush` 中将阴影分解为动态和静态两个独立项:
```hlsl
void REDGetShadowTerms(
FGBufferData GBuffer, FDeferredLightData LightData,
float3 WorldPosition, float4 LightAttenuation,
out float DynamicShadowTerm, out float StaticShadowTerm)
{
// 动态阴影:来自 Shadow Map
float DynamicShadowFraction = DistanceFromCameraFade(...);
DynamicShadowTerm = min(
lerp(LightAttenuation.x, 1.0f, DynamicShadowFraction),
StaticShadowing);
// 静态阴影:来自 Lightmap / Distance Field
StaticShadowTerm = StaticShadowing;
}
```
### 3. 阴影着色 REDGetShadowColor
核心函数——使用 `DiffuseColor`(存储在 GBufferD 的 CustomData 中)作为阴影颜色:
```hlsl
float4 REDGetShadowColor(...)
{
float DynamicShadow, StaticShadow;
REDGetShadowTerms(GBuffer, LightData, WorldPosition,
LightAttenuation, DynamicShadow, StaticShadow);
// 动态阴影颜色 = DiffuseColor × DynamicShadowShade
float3 DynamicShadowColor = GBuffer.DiffuseColor * DynamicShadowShade;
// 静态阴影颜色 = DiffuseColor不额外缩放
float3 StaticShadowColor = GBuffer.DiffuseColor;
StaticShadowColor = lerp(StaticShadowColor, float3(1,1,1), StaticShadow);
return float4(
lerp(DynamicShadowColor, StaticShadowColor, DynamicShadow), 0.0f);
}
```
### 4. PointLight 的 CustomData 使用
点光源渲染时,将 CustomData原本存储轮廓线 ID 等数据)重新解释为 DiffuseColor
```hlsl
// ASW Change : 2020/01/14 20:19:00 Takeshi.N
ScreenSpaceData.GBuffer.DiffuseColor.rgb = ScreenSpaceData.GBuffer.CustomData.rgb;
```
## C++ 端支持
`LightRendering.cpp` 中:
- 新增 `REDDeferredLightPS` Pixel Shader 类,绑定 `DynamicShadowShade` 参数
- 点光源通过 `bPointLightRED` 排序键控制渲染顺序(排在方向光之后)
- `RED_CUSTOM_LIGHTING` 宏控制是否启用自定义光照路径
## 关联文档
- [[RED自定义数据通道]] — DiffuseColor 如何写入 GBufferD
- [[自定义光照Pass]] — REDDeferredLightPS 的 C++ 绑定
- [[BGMultColor全局色调]] — 场景全局色调叠加
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Shaders/Private/DeferredLightPixelShaders.usf` | 新增 `REDDirectionalPixelMain` |
| `Shaders/Private/DeferredLightingCommon.ush` | 新增 `REDGetShadowTerms``REDGetShadowColor` |
| `Source/Runtime/Renderer/Private/LightRendering.cpp` | 新增 `REDDeferredLightPS`、点光排序 |

View File

@@ -0,0 +1,51 @@
---
title: Rendering
date: 2026-05-03 00:00:00
excerpt: ARC 引擎渲染系统修改分类索引
tags:
- ARC
- Rendering
rating: ⭐
---
# Rendering — 渲染系统修改
返回 [[ARC引擎修改总览]]
## 概述
渲染系统是 ARC 引擎修改量最大的部分,核心目标是实现**卡通/动画风格渲染管线**。修改覆盖了从材质系统、GBuffer、光照 Pass 到后处理的完整链路。
## 功能列表
| 功能 | 文档 | 复杂度 | 说明 |
|------|------|--------|------|
| RED 阴影系统 | [[RED阴影系统]] | 高 | 动态/静态阴影分离着色,卡通阴影核心 |
| RED 自定义数据通道 | [[RED自定义数据通道]] | 高 | 复用 GBuffer CustomData 存储轮廓线 ID 和点光源数据 |
| 正交投影混合 | [[正交投影混合]] | 高 | OrthoBlend 透视校正,动画风格透视扁平化 |
| 屏幕对齐网格 | [[屏幕对齐网格]] | 中 | 屏幕空间网格渲染,用于 UI/HUD 叠加 |
| 屏幕空间深度偏移 | [[屏幕空间深度偏移]] | 低 | 深度偏移防止 Z-fighting |
| 局部位置缩放 | [[局部位置缩放]] | 低 | 逐材质局部空间顶点缩放 |
| 自定义后处理 | [[自定义后处理]] | 高 | REDPostProcessDiffusion Filter、角色辉光、自定义 DOF |
| BGMultColor 全局色调 | [[BGMultColor全局色调]] | 中 | 场景全局着色/去饱和度 |
| 自定义材质属性 | [[自定义材质属性]] | 高 | 新增 MaterialProperty、BlendMode、材质标记 |
| GBuffer 修改 | [[GBuffer修改]] | 中 | GBufferD 清除色、Specular 格式、法线格式调整 |
| 自定义光照 Pass | [[自定义光照Pass]] | 高 | REDDeferredLightPS、PointLight 排序、自定义光照路径 |
| BasePass 修改 | [[BasePass修改]] | 中 | 强制 PrePass、阴影 Only 材质、X2Multiply 雾效 |
| 光线追踪与 PSO | [[光线追踪与PSO]] | 低 | RT 反射缩进修复、PSO 部分编译标记 |
## 渲染管线修改全景
```
材质系统 (自定义材质属性 + BlendMode)
顶点变换 (正交投影混合 / 屏幕对齐网格 / 局部位置缩放 / 深度偏移)
BasePass (RED自定义数据通道 → GBufferD / 强制PrePass / 阴影Only)
GBuffer (修改清除色 / Specular格式)
Deferred Lighting (RED阴影系统 / 自定义光照Pass / BGMultColor)
后处理 (自定义后处理: Diffusion / CharaGlow / DOF)
```

View File

@@ -0,0 +1,54 @@
---
title: 光线追踪与PSO
date: 2026-05-03 00:00:00
excerpt: RT 反射小幅修改和 PSO 部分编译标记
tags:
- ARC
- Rendering
- RayTracing
rating: ⭐
---
# 光线追踪与 PSO
返回 [[Rendering]]
## 概述
ARC 引擎在光线追踪和 PSOPipeline State Object方面的修改较少主要是格式修复和编译优化标记。
## Ray Tracing
### RayTracingDeferredReflections.usf
仅缩进格式修复(去掉一级缩进),无功能性变更。
## PSO 改进
### 部分编译标记
在 RHI 层新增 `bPartial` 标记用于 Ray Tracing Pipeline 的异步编译:
```cpp
// RHI module
struct FRayTracingPipelineStateInitializer
{
bool bPartial; // 允许部分编译(不等待所有 Shader 就绪)
FRayTracingPipelineState* BasePipeline; // 基础 PSO用于派生
};
```
### SetGraphicsPipelineState 扩展
新增 `bApplyAdditionalState` 参数,控制是否在设置管线状态时应用额外的平台特化状态。
## 关联文档
- [[D3D12RHI]] — D3D12 层面的 PSO 异步创建改进
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Shaders/Private/RayTracing/RayTracingDeferredReflections.usf` | 格式修复 |
| `Source/Runtime/RHI/` | `bPartial``bApplyAdditionalState` |

View File

@@ -0,0 +1,54 @@
---
title: 局部位置缩放
date: 2026-05-03 00:00:00
excerpt: 逐材质局部空间顶点缩放
tags:
- ARC
- Rendering
- VertexFactory
rating: ⭐
---
# 局部位置缩放
返回 [[Rendering]]
## 概述
允许通过材质图在局部空间Local Space对顶点位置进行缩放实现不依赖 Actor Transform 的比例调整。
## 实现
在各 VertexFactory 中通过 `VertexFactoryUpdateLocalPositionScale` 函数实现:
```hlsl
void VertexFactoryUpdateLocalPositionScale(
inout FVertexFactoryInput Input,
inout FVertexFactoryIntermediates Intermediates,
float3 scale)
{
Input.Position.xyz *= scale;
}
```
`USES_LOCAL_POSITION_SCALE` 宏控制启用,在世界变换之前应用。
## 使用场景
- 角色部件的动态缩放(如拳头放大的夸张动画效果)
- 不同 LOD 级别的微调
- 格斗游戏中攻击判定与视觉表现分离时的视觉调整
## 材质属性
`MP_LocalPositionScale`float3通过材质图控制。参见 [[自定义材质属性]]。
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Shaders/Private/LocalVertexFactory.ush` | 新增缩放函数 |
| `Shaders/Private/GpuSkinVertexFactory.ush` | 同上 |
| `Shaders/Private/LandscapeVertexFactory.ush` | 同上 |
| `Shaders/Private/MeshParticleVertexFactory.ush` | 同上 |
| 所有 Particle VertexFactory | 同上 |

View File

@@ -0,0 +1,65 @@
---
title: 屏幕对齐网格
date: 2026-05-03 00:00:00
excerpt: 将网格直接渲染到屏幕空间,用于 UI/HUD 叠加元素
tags:
- ARC
- Rendering
- VertexFactory
rating: ⭐
---
# 屏幕对齐网格
返回 [[Rendering]]
## 概述
屏幕对齐网格ScreenAlignedMesh将 3D 网格直接投影到屏幕空间坐标系中渲染,用于实现 UI 元素、HUD 叠加或其他需要固定屏幕位置的网格效果。
## 实现
在所有顶点着色器中通过 `USES_SCREEN_ALIGNED_MESH` 宏启用:
```hlsl
#if USES_SCREEN_ALIGNED_MESH
{
float2 p = Input.Position.xz * flip;
float3 offset = GetMaterialScreenAlignedMeshOffset(VertexParameters);
float3 scale = GetMaterialScreenAlignedMeshScale(VertexParameters);
// 基于 1280x720 的参考分辨率
float2 ScreenPos = p.xy * scale.xy;
ScreenPos.x += offset.x / 640.0f;
ScreenPos.y += -offset.y / 360.0f;
ScreenPos.xy += GetMaterialWorldPositionOffset(VertexParameters).xy;
const float z = 1.0f - 0.00001f; // 接近远裁面
WorldPosition = 0;
Output.Position = float4(ScreenPos, z, 1);
}
#endif
```
关键点:
- 使用 `Input.Position.xz`(不是 xy作为屏幕坐标输入
- 参考分辨率为 1280x720offset 以像素为单位
- 深度设为接近远裁面(`1.0 - 0.00001`),确保不遮挡 3D 场景
- 跳过雾效计算(`TRANSLUCENCY_NEEDS_BASEPASS_FOGGING` 对 ScreenAlignedMesh 禁用)
## 材质控制
通过 [[自定义材质属性]] 中的两个属性控制:
- `MP_ScreenAlignedMeshOffset` — 屏幕偏移(像素,基于 1280x720
- `MP_ScreenAlignedMeshScale` — 缩放系数
材质标记 `bScreenAlignedMesh` 启用此模式。
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Shaders/Private/BasePassVertexShader.usf` | 屏幕空间变换逻辑 |
| `Shaders/Private/DepthOnlyVertexShader.usf` | 同上 |
| `Shaders/Private/HitProxyVertexShader.usf` | 同上 |
| `Shaders/Private/DebugViewModeVertexShader.usf` | 同上 |

View File

@@ -0,0 +1,49 @@
---
title: 屏幕空间深度偏移
date: 2026-05-03 00:00:00
excerpt: 在屏幕空间偏移顶点深度,防止 Z-fighting 或强制分层
tags:
- ARC
- Rendering
- VertexFactory
rating: ⭐
---
# 屏幕空间深度偏移
返回 [[Rendering]]
## 概述
在顶点着色器中直接偏移输出深度值,用于防止卡通描边的 Z-fighting 或强制控制元素的渲染层级。
## 实现
```hlsl
#if USES_SCREEN_SPACE_DEPTH_OFFSET
{
Output.Position.z += GetMaterialScreenSpaceDepthOffset(VertexParameters)
* DEPTH_OFFSET_SIGN;
}
#endif
```
`DEPTH_OFFSET_SIGN` 根据平台的深度缓冲方向(正向/反向 Z自动调整符号。
## 使用场景
- 卡通描边网格的深度偏移(避免与本体 Z-fighting
- 半透明元素的强制排序
- 面部特征的深度分层(眉毛、头发等)
## 材质属性
`MP_ScreenSpaceDepthOffset`float通过材质图控制。参见 [[自定义材质属性]]。
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Shaders/Private/BasePassVertexShader.usf` | 深度偏移逻辑 |
| `Shaders/Private/DepthOnlyVertexShader.usf` | 同上 |
| `Shaders/Private/PositionOnlyDepthVertexShader.usf` | 同上 |

View File

@@ -0,0 +1,136 @@
---
title: 正交投影混合
date: 2026-05-03 00:00:00
excerpt: OrthoBlend 透视校正技术,实现动画风格的透视扁平化效果
tags:
- ARC
- Rendering
- VertexFactory
- Toon
rating: ⭐
---
# 正交投影混合
返回 [[Rendering]]
## 概述
正交投影混合OrthoBlend是 ARC 引擎实现**动画风格透视扁平化**的核心技术。在动画/格斗游戏中,角色需要减少透视畸变以保持美术控制的外观,这通过在透视投影和正交投影之间进行混合来实现。
引擎提供了两个版本:
- **V1** (`USES_ORTHO_BLEND_POSITION`):简单的 X 轴正交混合
- **V2** (`USES_ORTHO_BLEND_POSITION2`):基于物体中心距离的全透视校正("Purse correction"
## 实现细节
### V1X 轴正交混合
`Common.ush` 中定义:
```hlsl
float4 GetOrthoBlendPosition(
float4 WorldPosition,
float4x4 ViewProjectionMatrix,
float weight)
{
float4 ScreenPosition = mul(WorldPosition, ViewProjectionMatrix);
// 计算正交投影的 X 坐标
float OrthoScreenPositionX = dot(
ResolvedView.OrthoViewProjectionX, WorldPosition);
// 在透视和正交之间混合 X 轴
ScreenPosition.x = lerp(
ScreenPosition.x,
OrthoScreenPositionX * ScreenPosition.w,
weight * ResolvedView.OrthoBlendParameter);
return ScreenPosition;
}
```
`OrthoBlendParameter` 从 C++ 端通过 `ViewUniformShaderParameters` 传入,全局控制混合强度。`weight` 来自材质属性 `MP_OrthoBlendWeight`,允许逐材质控制。
### V2全透视校正
```hlsl
float4 GetOrthoBlendPosition2(
float4 WorldPosition,
float4x4 ViewProjectionMatrix,
float weight,
float3 ObjWorldPosition)
{
// 计算顶点相对于物体中心的偏移
float3 offset = WorldPosition.xyz - ObjWorldPosition.xyz;
// 物体中心到相机的距离(沿视线方向)
float dist = abs(dot(
ObjWorldPosition.xyz - ResolvedView.WorldCameraOrigin.xyz,
ResolvedView.ViewForward.xyz));
// 将顶点"拍平"到与物体中心相同距离的平面
float3 origin = ResolvedView.WorldCameraOrigin.xyz
+ ResolvedView.ViewForward.xyz * dist;
WorldPosition.xy = origin.xy + offset.xy;
// ... 后续投影变换
}
```
V2 的原理:将所有顶点投影到与物体中心等距的平面上,消除了前后肢体因透视导致的大小差异。
### 全 VertexFactory 覆盖
两个版本均在所有顶点着色器中实现:
| 顶点着色器 | 文件 |
|-----------|------|
| BasePass | `BasePassVertexShader.usf` |
| DepthOnly | `DepthOnlyVertexShader.usf` |
| PositionOnlyDepth | `PositionOnlyDepthVertexShader.usf` |
| HitProxy | `HitProxyVertexShader.usf` |
| DebugViewMode | `DebugViewModeVertexShader.usf` |
覆盖的 VertexFactory
- `LocalVertexFactory.ush`
- `GpuSkinVertexFactory.ush`
- `LandscapeVertexFactory.ush`
- `MeshParticleVertexFactory.ush`
- 所有 Particle VertexFactory
## 材质属性
通过 `MP_OrthoBlendWeight` 材质属性控制每个材质的混合权重:
```cpp
// MaterialTemplate.ush
float GetMaterialOrthoBlendWeight(FMaterialVertexParameters Parameters)
{
%s; // 由材质图生成
}
```
## C++ 端支持
- `SceneRendering.cpp`:计算 `OrthoBlendParameter` 并写入 ViewUniformBuffer
- `SceneTypes.h``MP_OrthoBlendWeight` 枚举值
- `HLSLMaterialTranslator.cpp`:材质编译支持
## 关联文档
- [[自定义材质属性]] — `MP_OrthoBlendWeight` 的定义
- [[屏幕对齐网格]] — 另一种屏幕空间变换方案
- [[局部位置缩放]] — 局部空间的顶点变换
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Shaders/Private/Common.ush` | 新增 `GetOrthoBlendPosition` / `GetOrthoBlendPosition2` |
| `Shaders/Private/BasePassVertexShader.usf` | 调用正交混合 |
| `Shaders/Private/DepthOnlyVertexShader.usf` | 调用正交混合 |
| `Shaders/Private/PositionOnlyDepthVertexShader.usf` | 调用正交混合 |
| `Shaders/Private/HitProxyVertexShader.usf` | 调用正交混合 |
| `Shaders/Private/DebugViewModeVertexShader.usf` | 调用正交混合 |
| 所有 VertexFactory `.ush` | 提供 ObjWorldPosition |

View File

@@ -0,0 +1,90 @@
---
title: 自定义光照Pass
date: 2026-05-03 00:00:00
excerpt: REDDeferredLightPS 自定义光照 Pass、PointLight 排序和自定义光照路径
tags:
- ARC
- Rendering
- Lighting
rating: ⭐
---
# 自定义光照 Pass
返回 [[Rendering]]
## 概述
ARC 引擎在 Deferred Lighting 阶段新增了自定义光照 Pass通过 `REDDeferredLightPS` 替换标准光照 Pixel Shader实现 [[RED阴影系统]] 的阴影着色逻辑。同时修改了点光源的渲染排序和数据传递方式。
## REDDeferredLightPS
`LightRendering.cpp` 中新增 Pixel Shader 类:
```cpp
class REDDeferredLightPS : public FDeferredLightPS
{
// 绑定 DynamicShadowShade uniform 参数
// 调用 REDDirectionalPixelMain 入口
};
```
### DynamicShadowShade 参数
从 C++ 端传入的 uniform float控制动态阴影区域的明暗程度
```cpp
// 0.0 = 完全黑色的动态阴影
// 1.0 = 无动态阴影效果
SetShaderValue(RHICmdList, ShaderRHI,
DynamicShadowShadeParam, LightSceneInfo->DynamicShadowShade);
```
## 点光源排序
点光源通过 `bPointLightRED` 排序键确保在方向光之后渲染:
```cpp
// 排序优先级:方向光 → 点光源(RED) → 其他
SortKey |= bPointLightRED ? (1 << PointLightSortBit) : 0;
```
这确保方向光的阴影着色先完成,点光源再叠加贡献。
## 点光源 CustomData 覆写
渲染点光源时GBufferD 的 CustomData 被重新解释为 DiffuseColor
```hlsl
// DeferredLightPixelShaders.usf
#if USE_RED_CUSTOM_DATA_POINTLIGHT
ScreenSpaceData.GBuffer.DiffuseColor.rgb =
ScreenSpaceData.GBuffer.CustomData.rgb;
#endif
```
## RED_CUSTOM_LIGHTING 宏
通过 `RED_CUSTOM_LIGHTING` 定义控制是否启用整个自定义光照路径。关闭时回退到标准 UE4 Deferred Lighting。
## Decal Emissive 处理
贴花的 Emissive 被作为正常光照渲染(而非 Emissive 通道),因为在 RED 管线中 BaseColor 已被阴影颜色系统占用:
```cpp
// Decal Emissive → normal lighting contribution
// (BaseColor 在 RED 系统中用于 shadow color)
```
## 关联文档
- [[RED阴影系统]] — 核心阴影着色逻辑
- [[RED自定义数据通道]] — 点光源 CustomData 的来源
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Source/Runtime/Renderer/Private/LightRendering.cpp` | `REDDeferredLightPS`、排序、Decal |
| `Shaders/Private/DeferredLightPixelShaders.usf` | `REDDirectionalPixelMain`、CustomData 覆写 |
| `Shaders/Private/DeferredLightingCommon.ush` | 阴影合成修改 |

View File

@@ -0,0 +1,136 @@
---
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 参数 |

View File

@@ -0,0 +1,105 @@
---
title: 自定义材质属性
date: 2026-05-03 00:00:00
excerpt: 新增 MaterialProperty、BlendMode 和材质标记
tags:
- ARC
- Rendering
- Material
rating: ⭐
---
# 自定义材质属性
返回 [[Rendering]]
## 概述
ARC 引擎在 UE4 材质系统中新增了多个材质属性MaterialProperty、混合模式BlendMode和材质标记为卡通渲染的顶点变换和特殊效果提供材质图级别的控制能力。
## 新增材质属性
| 属性 | 枚举值 | 类型 | 用途 |
|------|--------|------|------|
| `MP_OrthoBlendWeight` | float | 顶点 | [[正交投影混合]]权重0=透视1=正交 |
| `MP_ScreenAlignedMeshOffset` | float3 | 顶点 | [[屏幕对齐网格]]偏移(像素单位) |
| `MP_ScreenAlignedMeshScale` | float3 | 顶点 | [[屏幕对齐网格]]缩放 |
| `MP_ScreenSpaceDepthOffset` | float | 顶点 | [[屏幕空间深度偏移]]值 |
| `MP_LocalPositionScale` | float3 | 顶点 | [[局部位置缩放]]系数 |
### Shader 端访问函数
`MaterialTemplate.ush` 中生成对应的访问函数:
```hlsl
float GetMaterialOrthoBlendWeight(FMaterialVertexParameters Parameters) { %s; }
float3 GetMaterialScreenAlignedMeshOffset(FMaterialVertexParameters Parameters) { %s; }
float3 GetMaterialScreenAlignedMeshScale(FMaterialVertexParameters Parameters) { %s; }
float GetMaterialScreenSpaceDepthOffset(FMaterialVertexParameters Parameters) { %s; }
float3 GetMaterialLocalPositionScale(FMaterialVertexParameters Parameters) { %s; }
```
`%s``HLSLMaterialTranslator` 在编译时替换为材质图表达式。
## 新增混合模式
| 混合模式 | 枚举值 | 混合公式 | 用途 |
|---------|--------|---------|------|
| `BLEND_X2Multiply` | — | `DestColor × SourceColor × 2` | 双倍乘法混合,用于深色叠加 |
| `BLEND_AdditiveForUI` | — | `Dest + Source × SourceAlpha` | UI 专用加法混合 |
### X2Multiply 雾效处理
`BasePassPixelShader.usf` 中为 X2Multiply 提供自定义雾效混合:
```hlsl
#elif MATERIALBLENDING_X2MULTIPLY
half3 FoggedColor = lerp(
float3(0.5, 0.5, 0.5), // 中灰(乘法中性色)
Color,
Fogging.aaa * Fogging.aaa);
Out.MRT[0] = half4(FoggedColor, Opacity);
```
## 新增材质标记
| 标记 | 类型 | 说明 |
|------|------|------|
| `bScreenAlignedMesh` | bool | 启用[[屏幕对齐网格]]渲染模式 |
| `bForcedPrepass` | bool | 强制该材质走 Early-Z PrePassASW/Wizcorp |
### bForcedPrepass
`BasePassRendering.cpp` 中控制深度绘制行为:
```cpp
// 强制 PrePass 的材质始终写入深度
if (Material.bForcedPrepass)
{
// 走 DepthPass 而非依赖 BasePass 深度写入
}
```
可在材质实例中覆盖(`MaterialEditor` 中显示为可覆盖属性)。
## REDMaterialInstanceDynamic
新增 `REDMaterialInstanceDynamic` 类(`REDMaterialInstanceDynamic.h/.cpp`),扩展了标准 `UMaterialInstanceDynamic`,可能用于运行时的卡通渲染材质参数控制。
## 关联文档
- [[正交投影混合]] — 使用 `MP_OrthoBlendWeight`
- [[屏幕对齐网格]] — 使用 `MP_ScreenAlignedMeshOffset/Scale`
- [[BasePass修改]] — `bForcedPrepass` 的影响
## 修改文件列表
| 文件 | 修改类型 |
|------|---------|
| `Source/Runtime/Engine/Public/SceneTypes.h` | 新增 `MP_*` 枚举 |
| `Source/Runtime/Engine/Classes/Materials/Material.h` | 新增 `bScreenAlignedMesh``bForcedPrepass` |
| `Source/Runtime/Engine/Classes/Materials/REDMaterialInstanceDynamic.h` | **新增** |
| `Source/Runtime/Engine/Private/Materials/REDMaterialInstanceDynamic.cpp` | **新增** |
| `Source/Runtime/Engine/Private/Materials/HLSLMaterialTranslator.cpp` | 编译支持 |
| `Shaders/Private/MaterialTemplate.ush` | 新增访问函数 |
| `Source/Editor/MaterialEditor/` | 编辑器 UI 支持 |