渲染阶段
**渲染阶段(Render stages)**定义给定对象的渲染方式(通常使用其关联的效果/着色器)。它们还让你控制排序和过滤对象等高级属性。
对象可以订阅多个渲染阶段。例如,一个网格通常同时订阅 Opaque 和 ShadowCaster 阶段,或者 Transparent 阶段。
Note
渲染阶段不定义渲染顺序。渲染顺序由图形合成器控制。
效果插槽
**效果插槽(Effect slots)**决定渲染阶段使用哪个效果/着色器。你通过 @'Stride.Rendering.RenderStage.EffectSlotName' 选择效果插槽。
如果多个渲染阶段各自独占地渲染不同的对象,这些阶段可以共享同一个效果插槽。例如,由于 opaque 阶段只渲染不透明对象、transparent 阶段只渲染透明对象,这两个阶段都可以使用主效果插槽。
如果它们渲染了相同的对象,就不能共享效果插槽。这就是为什么,例如,我们通常先用主效果插槽渲染不透明网格,然后再用阴影投射者效果插槽渲染一遍不透明网格以产生阴影。
渲染阶段的典型配置:
| 渲染阶段 | 效果插槽 |
|---|---|
| Opaque | Main |
| Transparent | Main |
| UI | Main |
| Shadow caster | Shadow caster |
在渲染阶段中排序对象
@'Stride.Rendering.RenderStage.SortMode' 定义 Stride 在该渲染阶段中如何排序对象。Stride 自带多个 @'Stride.Rendering.SortMode' 实现,例如:
- @'Stride.Rendering.FrontToBackSortMode',以有限精度从前向后渲染对象,并尽量避免在同一深度范围内切换状态(适用于不透明对象和阴影)
- @'Stride.Rendering.BackToFrontSortMode',严格从后向前渲染对象(适用于透明对象)
- @'Stride.Rendering.StateChangeSortMode',尽量减少状态切换
当然,你也可以自由实现自己的排序模式。
在渲染阶段中过滤对象
要为渲染阶段中的对象创建自己的过滤器,请继承 @'Stride.Rendering.RenderStageFilter'。
渲染阶段选择器
**渲染阶段选择器(Render stage selectors)**定义场景中的哪些对象被发送到哪个渲染阶段,并在渲染给定对象时选择使用哪个效果。
例如,这是网格的典型配置:
- @'Stride.Rendering.MeshTransparentRenderStageSelector' 根据材质属性选择
Main或Transparent渲染阶段。默认效果是 Stride 定义的StrideForwardShadingEffect(你也可以创建自己的效果)。 - @'Stride.Rendering.Shadows.ShadowMapRenderStageSelector' 选择投射阴影的不透明网格,并将它们加入
ShadowMapCaster渲染阶段。默认效果是 Stride 定义的StrideForwardShadingEffect.ShadowMapCaster。
两者都可以按渲染组进行过滤。
你可以自定义所有内容,因此可以添加其他预定义的渲染阶段选择器(例如在之后的全屏通道中添加 UI),或创建针对你游戏的选择器。