泛光、TAA、GTAO、天空 LUT 和调试视图都不是硬连线的阶段。 它们是针对帧阶段注册的 compute 特效,承载它们的二十行契约, 也正是你自己的特效所实现的同一个契约。
特效位于 Rendering/Effects/。每个特效注册进一个
compute 阶段,声明它产生的纹理,并且可以按名称作为 2D 精灵来查看——
参考应用的调试模式正是这样工作的。
| 类型 | 阶段 | 用途 |
|---|---|---|
BloomEffect | AfterScene | 对 HDR 场景颜色做降采样 / 升采样链。 |
GtaoEffect | AfterScene | 用于间接漫反射的环境光遮蔽。 |
TaaEffect | AfterScene | 带方差钳制和锐化的抖动时间解析。 |
DdgiEffect | AfterScene | 探针追踪与辐照度图集更新。 |
SkyAtmosphereEffect | FrameStart | 散射 LUT、云噪声和空气体积。 |
SceneColorCopyEffect | AfterScene | 供需要的特效读取的场景颜色快照。 |
DepthViewEffect | AfterScene | 作为可查看纹理的线性化深度。 |
VelocityViewEffect | AfterScene | 可视化的运动矢量。 |
Sdf3DViewEffect | FrameStart | DDGI 所追踪的那种有符号距离场的切片。 |
PlasmaEffect | FrameStart | 最小 compute 示例——写自己的特效时抄它。 |
其中任何一个都能用三行代码放上屏幕,因为特效输出是可寻址纹理:
AddControl(new Sprite2D
{
Name = Season.Rendering.Effects.GtaoEffect.TextureName,
Color = Colors.White,
PosX = 20, PosY = 580, Width = 240
});
命名遵循一个方案:2D 纹理用 compute://,体积用
compute3d://。GTAO 发布
compute://gtao/ao,天空发布
compute://sky/skyview 和
compute3d://sky/aerial,plasma 示例发布
compute://plasma。消费它们没有任何特殊之处——
一个 Sprite2D 或材质覆盖项接受该名称,
这就是全部接口。
ComputeEffect 是一个有五个成员的抽象类。
这就是全部扩展面。
public abstract class ComputeEffect
{
public abstract string Name { get; }
public abstract ComputePhase Phase { get; }
// Create textures and pipelines. Return false and the effect is
// dropped with nothing left behind.
public abstract bool Initialize(IGraphics g);
// Dispatch. Called once per frame, in phase order.
public abstract void Record(IGraphics g);
// Swapchain changed size. Recreate anything resolution-dependent.
public virtual void OnResize(IGraphics g) { }
}
Initialize 返回 false 必须不留残渣——
没有创建了一半的纹理,没有 FrameSchedule
里悬空的名字。这正是特效真正可选的保证:没有 compute 支持的
后端和关掉了该特效的用户,产生的是同样正确的帧。
编写 compute 特效 逐行讲解
PlasmaEffect。
一个阈值加拐点的软截断,随后是对 HDR 场景颜色的六级降采样与 升采样链。因为场景颜色是真正的 HDR,阈值是有意义的: 它选出比白色更亮的像素,而不是碰巧被截断的像素。
| 设置 | 默认值 | 含义 |
|---|---|---|
BloomEnabled | on | 关闭则跳过该链并清空 FrameSchedule.BloomTexture。 |
BloomThreshold | 1.0 | 像素开始贡献的辐射度阈值。 |
BloomKnee | 0.5 | 阈值的柔和度,让泛光淡入而不是突然开启。 |
BloomIntensity | 0.3 | 链的结果加回多少。 |
BloomMipCount | 6 | 链深度。更多层级意味着更宽、更柔和的光晕。 |
AaMode 有四个值,它们不是同一事物的四种质量——
它们在帧的不同位置、不同颜色空间中运作。
| 模式 | 运行位置 | 说明 |
|---|---|---|
Off | — | 无滤波。 |
Msaa4x | 光栅化 | 遗留层级,仅 D3D12。HDR 解析质量打了折扣且带宽成本高;作为 VR 回退保留。 |
Fxaa | 色调映射后 LDR | FXAA 3.11,在 Post 合成和 FinalBlit 中应用。便宜且通用。 |
Taa | HDR,色调映射前 | 默认。需要速度和 compute;选中它会在初始化时强制开启 MotionVectors。不可用时回退到 Fxaa。 |
TAA 已在 D3D12、Vulkan、Metal 和 WebGPU 上实现并稳定。回退到 FXAA 是自动的而不是报错,这意味着请求 TAA 的场景在无法提供的设备上 仍然能渲染——更柔和,但能渲染。
相机每帧以亚像素偏移抖动投影矩阵,解析阶段通过运动矢量重投影
上一帧结果,方差钳制决定信任多少历史。有趣的部分是抖动和历史
都位于 Camera3D 上,你可以直接读取。
| 设置 | 默认值 | 含义 |
|---|---|---|
MotionVectors | on | Scene 通道是否写入速度。TAA 强制开启它。 |
JitterPhaseCount | 7 | 抖动序列重复前的长度。 |
JitterScale | 1.0 | 以像素计的抖动幅度。高于 1 用稳定性换覆盖率。 |
TaaFeedback | 0.9 | 移动像素的历史权重。 |
TaaStaticFeedback | 0.97 | 无移动处的历史权重——更多历史,更多解析。 |
TaaVarianceClipGamma | 1.0 | 历史被钳制到邻域的程度。越低越抗鬼影、越多混叠。 |
TaaSharpness | 0.5 | 解析后的锐化,因为时间累积会柔化。 |
Camera3D 上的 | 用途 |
|---|---|
ProjectionJittered | 实际用于渲染的投影,包含抖动。 |
PrevViewProjection | 上一帧的矩阵,正是它让重投影成为可能。 |
JitterNdc, JitterPixels | 本帧的偏移,两个空间都有。 |
UpdateTemporal, ResetTemporal | 推进序列,或在相机切换后丢弃历史。 |
跨不连续相机移动进行重投影,会把旧帧涂抹到新帧上, 持续时间取决于反馈权重衰减所需的时间。相机切换正是 运动矢量无法描述的情形。