作为针对 DirectX* 11 的自适应体积阴影图的跟进,我们展示了一个采用相同算法的端口,专门针对支持 OpenGL ES* 3.1 和 GL_INTEL_fragment_shader_ordering OpenGL* 扩展的 Android* 设备进行了调整。
相比于前一个面向超极本™ 系统硬件的样本,这一版本提供的不仅仅是一个简单的端口,同时还包含了许多优化与折衷,允许算法在较低功耗的移动设备(例如平板电脑和电话)上运行。
AVSM 算法允许在英特尔® 硬件之上,使用实时渲染引擎生成立方体动态阴影和自阴影效果,例如烟雾、颗粒或透明物体等。
为了实现这一目标,AVSM 阴影图的每一纹理像素都沿着相应的光线存储近似的紧凑型透射率曲线。
这项技术的主要创新体现在一个全新的流压缩算法,此算法能够为可见度曲线构建一个以常量形式存储的变量误差表征,表示穿过介质的光线,并且此表征可用于之后的阴影查找。这意味着,每次向阴影图添加一个新的部分投影(光封堵器)时,算法将单独为每一纹理像素执行透射率曲线的最优有损压缩操作。
有损压缩:从 4 个节点减少到 3 个节点,删除视觉效果最不明显的节点 (A)
该算法依赖于 GL_INTEL_fragment_shader_ordering OpenGL 扩展,后者根据三角形提交顺序在每像素级别执行确定性着色器执行顺序。这就完成了 AVSM 算法所需的两项重要目标:
- 同步,允许对线程安全型数据结构的访问。
- 每像素着色器执行排序(基于三角形提交顺序),允许在后续帧之间执行确定性有损压缩操作,这将阻止出现临时的视觉假象(“闪烁”)。
使用 DirectX 11 时,这一特性可通过“英特尔像素同步扩展”获取,或者通过最新的名称为“光栅化顺序查看” (Raster Order Views) 的 DirectX 11.3 和 DirectX 12 特性获取。
由 Funcom Productions A/S 发布的《迷你乐高*在线》中的 AVSM 烟影示例(左边为禁用,右边为启用)
以下清单为 Android 和原始 DirectX 实施之间的主要差别。差别主要集中于为平板电脑和手机等低功率目标硬件优化算法性能:
- 透明烟雾颗粒被渲染成分辨率较低的帧缓冲器,并混合到原始分辨率渲染目标上,以降低高透支带来的混合成本。这不是 AVSM 所特有的优化成果,但是却有必要在目标硬件上实现这种效果。
- 在某些情况下,多数是当参照 AVSM 阴影图矩阵后投影没有移动过快时,阴影图只可以每隔一帧进行更新,以降低成本。要平衡两帧之间的计算,可以在交替帧中执行一些操作(如清除缓冲)。
- 仅每隔一个烟雾颗粒可以添加到 AVSM 图,但模糊度会变成两倍。这会稍微降低视觉质量,但插入性能提升了两倍。
- 要减少 AVSM 阴影的采样成本,采样的频率可从每像素移到每顶点。与每像素采样相比,旧样本 (DirectX11) 使用屏幕空间坐标系镶嵌技术 (screen space tessellation) 在无损质量的情况下实现这一目标。但是,此样本使用几何着色器来输出由四个三角形和五个顶点组成的固定的广告牌四边形。采用五顶点四边形(除了四个分别位于四个角,还有一个位于中间)的 AVSM 采样和插值可为目标硬件提供更合适的质量和性能的良好平衡。
- 对于始终位于投影背后的接收器几何体(如地面),无需使用全量采样,只读取最后一个节点的值即可。
在采用 Android* 的 Tesco hudl2*设备上运行的样本
样本 UI 提供了多种方式,用于开关切换或微调上述大部分优化成果,作为展示成本和视觉质量权衡的一种方式。
样本代码将在任何支持 GL_INTEL_fragment_shader_ordering 扩展的 OpenGL ES 3.1 设备上运行。支持扩展的设备包括搭载了英特尔® 凌动™ 处理器的平板电脑(代号为 Bay Trail 或 Cherry Trail)。
请参阅本档案中包含的 README.TXT,了解构建说明。
基于 Marco Salvi 提供的自适应体积阴影图,EGSR 2010 文件。