适用于 Android 的自适应体积阴影贴图 (使用 OpenGL ES 3.1)





5.00/5 (1投票)
作为《适用于 DirectX 11 的自适应体积阴影贴图》的后续,我们提出了将同一算法移植到支持 OpenGL ES 3.1 和 GL_INTEL_fragment_shader_ordering OpenGL 扩展的 Android 设备上。
Intel® 开发者专区 提供跨平台应用开发的工具和操作指南、平台和技术信息、代码示例以及同行专业知识,帮助开发者创新并取得成功。加入我们的社区,了解 Android、物联网、Intel® RealSense™ 技术和 Windows,下载工具、获取开发套件、与志同道合的开发者分享想法,并参与黑客松、竞赛、路演和本地活动。
作为《适用于 DirectX* 11 的自适应体积阴影贴图》的后续,我们提出了将同一算法移植到支持 OpenGL ES* 3.1 和 GL_INTEL_fragment_shader_ordering OpenGL* 扩展的 Android* 设备上。
与简单的移植相比,此版本包含多项优化和权衡,使该算法能够在低功耗移动设备(如平板电脑和手机)上运行,而之前的示例则面向 Ultrabook™ 系统级硬件。
该AVSM 算法支持使用当今的 Intel® 硬件在实时渲染引擎中生成体积效果(如烟雾、粒子或透明对象)的动态阴影和自阴影。
为此,AVSM 阴影贴图的每个 texel 都存储了沿相应光线的透射率曲线的紧凑近似值。
该技术的主要创新是一个新的流式压缩算法,它能够构建一个恒定存储、可变误差的可视性曲线表示,该曲线代表光线在介质中的传播,可用于后续的阴影查找。这本质上意味着,每次将新的部分阴影投射器(光线遮挡物)添加到阴影贴图中时,算法都会对每个 texel 的透射率曲线进行单独的优化有损压缩。
该算法依赖于 GL_INTEL_fragment_shader_ordering OpenGL 扩展,该扩展根据三角形提交顺序强制执行每像素级别的确定性着色器执行顺序。这实现了 AVSM 算法所需的两个重要目标:
- 同步,允许线程安全的数据结构访问。
- 每像素着色器执行顺序(基于三角形提交顺序),允许有损压缩在后续帧之间具有确定性行为,从而防止出现其他情况下的时间视觉伪影(“闪烁”)。
在 DirectX 11 上,此功能可通过 Intel 像素同步扩展获得,或者更近期地,通过 DirectX 11.3 和 DirectX 12 的光栅顺序视图 (Raster Order Views) 功能原生支持。
以下是 Android 版本与原始 DirectX 实现之间的主要区别列表。这些区别主要集中在优化算法在低功耗目标硬件(如平板电脑和手机)上的性能。
- 透明烟雾粒子被渲染到较低分辨率的帧缓冲区,然后混合到原生分辨率的渲染目标,以降低高重叠渲染的混合成本。这不是 AVSM 特有的优化,但对于在目标硬件上实现该效果是必需的。
- 在某些情况下,特别是当阴影投射器相对于 AVSM 阴影贴图矩阵移动速度不快时,阴影贴图可以每隔一帧更新一次以降低成本。为了平衡两帧的计算,可以在另一帧执行一些操作(例如清除缓冲区)。
- 每隔一帧只能将烟雾粒子添加到 AVSM 贴图中,但其不透明度翻倍。这会稍微降低视觉质量,但可以将插入性能提高一倍。
- 为了降低采样 AVSM 阴影的成本,可以将采样频率从每像素转移到每顶点。旧的(DirectX11)示例使用屏幕空间细分来实现这一点,而不会损失与每像素采样相比的质量。然而,本示例使用几何着色器输出一个由四个三角形和五个顶点组成的固定广告牌四边形。使用五顶点四边形(除四个角外还有一个在中间)的 AVSM 采样和插值,在质量和性能之间取得了良好的平衡,更适合目标硬件。
- 对于始终位于阴影投射器后面的接收几何体(例如地面),不需要完全采样,只需读取最后一个节点的值即可。
示例 UI 提供了开启/关闭或调整上述大部分优化选项的功能,以此来演示成本和视觉质量之间的权衡。
示例代码可在任何支持 GL_INTEL_fragment_shader_ordering 扩展的 OpenGL ES 3.1 设备上运行。支持该扩展的设备包括基于 Intel® Atom™ 处理器的平板电脑(代号为 Bay Trail 或 Cherry Trail)。
有关构建说明,请参阅压缩包中包含的 README.TXT。
基于 Marco Salvi 的 EGSR 2010 论文《自适应体积阴影贴图》。