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 的任何东西都会在重启后存活,不管你是否打算如此。
| 成员 | 默认 | 读取 |
|---|---|---|
HdrSceneColor | true | 初始化 — 决定场景颜色格式。 |
HdrExposure | 1.0 | 运行时。 |
AntiAliasing | AaMode.Taa | 初始化 — 也决定是否存在后处理目标。 |
AmbientOcclusion | AoMode.Gtao | 初始化。 |
AoRadius、AoIntensity | 0.5、1.0 | 运行时。 |
GlobalIllumination | GiMode.Off | 初始化 — DDGI 会分配探针和 SDF 体积。 |
GiIntensity | 0.4 | 运行时。 |
BloomEnabled | true | 初始化;阈值、膝点和强度是运行时。 |
ShadowsEnabled | true | 运行时 — 关闭会跳过该通道。 |
ShadowAtlasSize | 2048 | 初始化。 |
ShadowDistance | 40 | 运行时。 |
Sky | SkyMode.Procedural | 初始化。 |
AerialIntensity | 1.0 | 运行时。见下文。 |
TaaSharpness | 0.5 | 运行时;大于零会额外买一个 RCAS 锐化通道。 |
KhrLightIntensityScale | 0.05 | 运行时 — 把光度计单位的 glTF 光照值带进引擎范围。 |
AnimatedBoundsScale | 1.5 | 运行时 — 蒙皮包围盒为剔除膨胀多少。 |
TextureMaxAnisotropy | 16 | 运行时;被钳制到后端支持的范围。 |
那是一个选集,不是清单。文件里大约有七十个成员,每个都带着 自己的注释,那是比网站上任何表格都可靠的参考。
AerialIntensity 是解释为什么这套 API 里的数字
需要附上推理的好例子。
0 绕过空气透视,1 是物理结果,大于 1 则外推以 强调效果。引擎默认是 1。参考应用用 12,因为它的世界 只有几百米宽,而真实的空气透视是公里级的效应 — 在 1 处,远处的山在 255 里大约只多了两个单位的蓝色, 没人看得见。公里级的场景应该移回 1 或 2,而完全没有 距离感的场景可以把它关掉。
参考应用里的 Settings 面板就是可用的例子:它把控件
直接绑定到 RenderQuality.Current,在变化时写入,并让
常规的设置保存把值带到磁盘。
要在 UI 里编码的唯一规则就是上面的划分。运行时值可以是滑块。层级值 需要一个重启提示,或者干脆没有控件 — 一个直到下次启动才 默默生效的滑块,比没有更糟。
WorldSettings 刻意拥有同样的形态,出于同样的
原因:静态默认值、持久化的实例属性、
Current 作为读取。见
光照与天空。