MIT 许可证 NuGet

首页 / 文档 / 渲染质量

渲染质量

RenderQuality 有两副面孔,把它们搞混是这个引擎 最常见的早期错误。静态的 Default* 字段是你在任何东西启动之前设置的默认值; RenderQuality.Current 是你可以每帧写入的 活实例。

两副面孔

初始化 — 静态 Default* 字段,在应用构造函数中设置。它们烘焙 着色器变体和分配尺寸。

public App()
{
    RenderQuality.DefaultGlobalIllumination = GiMode.Ddgi;
    RenderQuality.DefaultAerialIntensity = 12f;
    RenderQuality.DefaultShadowAtlasSize = 4096;
}

运行时 — RenderQuality.Current,活实例,从 设置界面或每帧写入都是安全的。

var q = RenderQuality.Current;

q.HdrExposure = 1.2f;
q.ShadowDistance = 220f;
q.AoIntensity = 0.8f;
每个成员都说明自己是哪一种

Season/Rendering/RenderQuality.cs 为每个成员附带 一条注释,说明它是在图形初始化之前读取一次,还是每帧读取。层级 值 — 任何决定管线状态对象、渲染目标格式或 缓冲区大小的东西 — 在帧循环开始前锁定,之后写它们 不生效。后端把不支持的特性当作有效的 false,而不是错误。

Current 实际上从哪里来

Current 返回 BaseApp.Settings.RenderQuality — 就是被 序列化进设置文件的同一个对象 — 在还没有应用时回退到一个新实例。 BaseApp.Init() 为新的或空的设置把 Default* 字段快照进去。

默认值到不了已有安装

因为质量驻留在持久化的设置里,改变一个 Default* 值只影响从未运行过你的 应用的机器。如果你改了一个默认值而开发机上什么都没发生, 原因就在这 — 删除设置文件,或者也把值写到 Current 上。你写到 Current 的任何东西都会在重启后存活,不管你是否打算如此。

值得先知道的旋钮

成员默认读取
HdrSceneColortrue初始化 — 决定场景颜色格式。
HdrExposure1.0运行时。
AntiAliasingAaMode.Taa初始化 — 也决定是否存在后处理目标。
AmbientOcclusionAoMode.Gtao初始化。
AoRadius、AoIntensity0.5、1.0运行时。
GlobalIlluminationGiMode.Off初始化 — DDGI 会分配探针和 SDF 体积。
GiIntensity0.4运行时。
BloomEnabledtrue初始化;阈值、膝点和强度是运行时。
ShadowsEnabledtrue运行时 — 关闭会跳过该通道。
ShadowAtlasSize2048初始化。
ShadowDistance40运行时。
SkySkyMode.Procedural初始化。
AerialIntensity1.0运行时。见下文。
TaaSharpness0.5运行时;大于零会额外买一个 RCAS 锐化通道。
KhrLightIntensityScale0.05运行时 — 把光度计单位的 glTF 光照值带进引擎范围。
AnimatedBoundsScale1.5运行时 — 蒙皮包围盒为剔除膨胀多少。
TextureMaxAnisotropy16运行时;被钳制到后端支持的范围。

那是一个选集,不是清单。文件里大约有七十个成员,每个都带着 自己的注释,那是比网站上任何表格都可靠的参考。

把一个旋钮好好讲清楚

AerialIntensity 是解释为什么这套 API 里的数字 需要附上推理的好例子。

它是一个 lerp 权重,不是乘数

0 绕过空气透视,1 是物理结果,大于 1 则外推以 强调效果。引擎默认是 1。参考应用用 12,因为它的世界 只有几百米宽,而真实的空气透视是公里级的效应 — 在 1 处,远处的山在 255 里大约只多了两个单位的蓝色, 没人看得见。公里级的场景应该移回 1 或 2,而完全没有 距离感的场景可以把它关掉。

搭建一个设置界面

参考应用里的 Settings 面板就是可用的例子:它把控件 直接绑定到 RenderQuality.Current,在变化时写入,并让 常规的设置保存把值带到磁盘。

要在 UI 里编码的唯一规则就是上面的划分。运行时值可以是滑块。层级值 需要一个重启提示,或者干脆没有控件 — 一个直到下次启动才 默默生效的滑块,比没有更糟。

WorldSettings 刻意拥有同样的形态,出于同样的 原因:静态默认值、持久化的实例属性、 Current 作为读取。见 光照与天空。