移动正向渲染
引言
Vision 提供一套为移动设备专门优化的正向渲染系统。 与常规正向渲染系统的主要差别在于,对于动态光照,移动正向渲染系统会选择一个光源作为单一主导光源,并将其作为基底通路的一部分来渲染。 所有附加光照作为附加几何体通路被渲染在场景几何体顶层。 在同一时间只有一个占明显主导地位的动态光源(例如太阳或明亮的眩光)的常见情景下,这可以免去一个代价高昂的几何体通路。 而且,该渲染系统增加了在移动设备上对动态阴影贴图的支持。 与已有的阴影贴图系统相反,这种阴影贴图直接应用于光照通路,而不会先生成延迟阴影蒙版。 其限制在于,移动设备上的阴影贴图不支持任何高级过滤技术。 详情请见下文。
就像常规的正向渲染系统一样,移动设备正向渲染系统也支持附加特定后期处理效果。 但其选择范围比常规正向渲染系统要有限得多。
注: 移动设备正向渲染系统仅支持电脑(用于预览)、安卓、iOS 和PlayStation Vita。
如何激活移动正向渲染
在主层下拉菜单中选择相应的渲染器,即可将场景设为移动设备正向渲染模式:
![](http://www.anarchy.cn/data/attachment/portal/201408/05/133658kc09xpes1118x9mf.jpg)
特性
移动设备正向渲染系统的特性如下。
移动设备着色器提供器
Vision 移动设备正向渲染系统使用其自身的 Vision 移动设备着色器提供器。 该着色器提供器不仅支持移动着色器(来自 MobileShaders.ShaderLib),而且支持大多数常规的正向渲染着色器。
后期处理兼容性
Vision 移动设备正向渲染系统与所有只需要颜色缓存作为输入的后期处理特效兼容。 因为移动设备正向渲染系统不能生成法线、高光、线性深度或散射缓存,需要这些输入的后期处理特效通常只能在标准正向渲染系统中使用。
动态光照
为了判定当前视图中的主导光源,CPU 会计算光照影响范围的屏幕尺寸约值。 然后,渲染器根据这一尺寸生成优先级,并考虑对应光照是否投射阴影。 以这种方式,影响区域更大且附带阴影贴图组件的光照通常将具有更高的优先级。 优先级最高的光照将在基底通路中渲染。 所有其他光照则在额外叠加几何体通路中渲染。
注: 只有用移动设备着色器渲染、并且在不透明主通路中的表面才支持基底通路中的主导光源渲染。 另外,对于实体来说,仅当其所有表面都不使用全亮光照方法时,上述情况才成立。
动态阴影
为聚光灯或平行光添加一个
VMobileShadowMapComponentSpotDirectional(V 移动阴影贴图 - 聚光灯 / 平行光照组件),即可在场景中添加动态阴影。 请注意,移动渲染系统不支持点光源阴影贴图。 由于移动设备上的性能限制,和默认阴影贴图组件相比,这一特殊阴影贴图组件有特定局限:
1. 不具备阴影贴图过滤,也就是说,阴影会有硬边缘。 因此,我们建议将阴影贴图限制在相对较小的区域内。
2. 平行光照的阴影贴图仅使用一个层叠。
3. 因为阴影贴图直接应用于光照通路,所以不会生成延迟阴影蒙版。
注: 默认阴影贴图系统与移动正向渲染系统不兼容。 而且,V 移动阴影贴图 - 聚光灯 / 平行光照组件的动态阴影只能投射到用某个移动材质渲染器渲染的表面上,这一渲染器由 Vision 移动着色器提供器分配。 这些着色器包含在 MobileShaders.ShaderLib 中。 当然,添加并执行支持阴影贴图的自定义着色器也是可能的;请查看移动材质着色器获取参考。
注: 移动设备上的阴影贴图需要 OpenGL 扩展”GL_OES_packed_depth_stencil”或”GL_OES_depth_texture”。 在不支持这两种扩展的设备上,动态光照将被直接渲染而不投射任何动态阴影。
重要:
移动设备上的阴影贴图容易产生精度问题,如下图所示。 配置聚光灯光源的
半径
和”移动设备阴影贴图组件”的
近切
参数时必须小心,因为两个参数分别定义了阴影贴图的近切和远切面。 下方示例的半径为 5000,近切值为 2,其结果是明显的精度伪影。 提高光源近切值或降低半径就可以避免这类伪影。
删减法阴影
让静态光源额外投射动态阴影也是可能的。 实现方法为向静态光源附加 Vision 移动设备阴影贴图 - 聚光灯 / 平行光源组件组件 所产生的阴影为删减型,因此会降低静态光照形成的预计算光照强度。
注: 只能让一个静态光源投射删减法阴影。 使用多个附带 Vision 移动设备阴影贴图 - 聚光灯 / 平行光源组件的静态光源会导致渲染伪影。 投射删减型阴影的静态光源会始终拥有最高优先级,从而始终在基底通路中渲染。
为避免阴影区域完全变黑,阴影贴图组件提供了
MaxIntensity(最大强度)参数。 该值用于缩放阴影强度,其取值范围为 [0..1]。
缺失阴影贴图过滤所造成的自荫蔽伪影通常相当明显,为避免这些伪影,您可以通过实体和几何网格的光照影响位元蒙版来控制阴影投射的光照影响。
时间变化
移动设备正向渲染系统支持 Vision 时间变化系统。 这要求一个动态平行光照和一个
VTimeOfDayComponent,并启用时间变化。
注: 对于使用移动设备着色器渲染的材质,仅在启用时间变化系统时才会应用全局环境色。
分辨率放大
分辨率放大功能允许您以比移动设备更低的分辨率渲染场景。 这一功能有时对性能有益,因为有些移动设备有极高的显示密度(有时高于 400dpi),而游戏渲染通常不需要这么高。 在分辨率极高的设备上渲染像素着色复杂度高的场景时,分辨率放大功能有很大的益处。
不过您必须考虑到,分辨率放大要涉及额外的 blit 操作,这也需要占用 GPU 时间。 因此,在深度复杂度很低、材质简单的场景中,或是在渲染分辨率低于 300dpi 的设备上,使用分辨率放大往往得不偿失。
您可以在渲染器节点设置中为 Vision 移动设备正向渲染系统配置分辨率放大:
RenderingResolutionMode(渲染分辨率模式)指定是否使用分辨率放大,如为是,则指定使用哪种模式。 设为 FULLSIZE(全尺寸)时,正向渲染器节点将始终以其最终目标上下文(通常是含有后台缓存的上下文)的全尺寸分辨率进行渲染。 设为 QUARTERSIZE(四分之一尺寸)时,场景始终以最终目标上下文的四分之一分辨率进行渲染。例如,当最终目标上下文的分辨率为 1920×1080,则四分之一尺寸模式将以 960×540 的分辨率进行渲染。 最后,DPI 设定指示了场景应以某个具体的 dpi 率(密度)进行渲染。
如分辨率模式设为 DPI,则 DesiredRenderingDpi(期望渲染 Dpi)指定场景的目标渲染密度。 例如,如果设备的原始显示密度为 300dpi,分辨率为 1280×720,启用 DPI 模式,该值设为 150 dpi,则场景的实际渲染分辨率将是 640×360。 如果分辨率模式设为 QUARTERSIZE 或 FULLSIZE,则该设置不起效果。
如果设备的显示密度已经接近 DesiredRenderingDpi 中指定的 dpi 率,则可使用 ResolutionTolerance(分辨率容错)来指定容错阈值。 例如,如果设备的原始显示密度为 300dpi,DesiredRenderingDpi 值设为 250dpi,ResolutionTolerace 为 25(百分比),则渲染将以设备的原始分辨率进行,因为 300dpi 和 250dpi 的差异不到 25%。 其优势在于,在这种情况下禁用分辨率放大可省去一个完全渲染目标的分辨率放大 / blit 操作,该操作的开支往往比多渲染 20% 或 20% 的像素更大。 因此,在 DPI 模式下,我们建议将 ResolutionTolerance 值设得足够大。
最后,UseUpscaleFiltering(使用分辨率放大过滤)指定了将已渲染场景分辨率放大到 V 移动正向渲染系统的最终渲染目标时是否使用双线过滤。
请注意,分辨率放大仅影响主场景的渲染。 屏幕蒙版、Vision 字体、Vision UI 元素 和调试渲染输出依然以显示器原始分辨率显示,以确保 UI 元素和文本的清晰!
伽马校正
因为 OpenGL ES 2.0 仅通过一个 GL 扩展(GL_EXT_sRGB)支持硬件伽马校正,而目前支持该扩展的移动设备并不常见,所以,所有相关 sRGB 转换都需要在着色器编码中手动进行。 因此,移动正向渲染系统不支持伽马校正。
性能考量和优化提示
总的来说,适用于默认正向渲染系统的建议同样适用于移动正向渲染系统。 但也应牢记一些特殊事项:
由于目前的移动设备性能有限,动态光照的使用应非常小心。 要牢记,只有一个动态光照会在基底通路中渲染。 每多一个额外的动态光照,就必须多渲染一条叠加几何体通路,这对移动设备的负担尤其大。
后期处理特效在移动设备上的性能开支会很高。 因此,只有在真正提供显著的视觉改善时才能使用色调映射。 也可考虑在中低端移动设备上禁用色调映射。
移动设备阴影贴图系统在 CPU 侧决定了哪个几何体位于光照的阴影体内。 只有在阴影体内的几何体会被计算阴影贴图的着色器渲染。 所有其他几何体会被一个更简单、更快速的着色器渲染。
在当前一代的移动设备上,阴影贴图是一种性能开支高昂的技术,所以只能为数量有限的几何网格启用动态阴影投射。 例如,一个良好的使用实例是照亮场景且附加阴影贴图组件(删减法阴影)的静态平行光照。 在限制主角色模型的阴影投射器的同时,由于上文提到的阴影体优化,只有主角色周围的几何体会使用更高性能开支的、将阴影贴图纳入计算的着色器;而场景主体会采用性能负担小得多的、仅计算静态光照的着色器。
如果没有附加后期处理组件,且渲染分辨率模式设为 FULLSIZE,移动设备正向渲染器会自动绕过任何离屏渲染。 这将极大提升性能,因为分辨率放大或后期处理所涉及的额外图像块传输操作会占用大量 GPU 时间。
注:
避免使用子分区很少的大几何体,例如仅由两个三角形构成的大片地面。 由于精度问题,这不仅会对纹理过滤造成负面影响,而且在极端情况下,平行光照所投射的阴影会非计划淡出。