我编写了一个使用 JavaScript 和 WebGL 绘制交互式场景的 Web 应用程序,包括阴影映射。我想确保该网站可以在尽可能多的 Android 设备上运行。阴影映射在台式计算机上工作得很好——通过使用深度纹理和滥用颜色纹理来存储深度。但是我还没有设法让该站点在没有重大伪影的情况下在 Android 设备上使用阴影映射渲染场景。
问题是
- 根据 webglstats.com 的说法,大多数 Android 设备不支持该
WEBGL_depth_texture
扩展,因此直接使用光源深度缓冲区作为阴影贴图是行不通的。 - 解决方法是将每个片段的深度编码为 RGBA 值。虽然这在台式计算机上运行良好,但相同的代码会在 Android 上导致主要工件。我的猜测是这是一个精度问题:WebGL 计算的深度值的精度太低,和/或
floats
WebGL 片段着色器具有mediump
精度(根据我的 Nexus 7 2012 Chrome 上的着色器编译器错误消息,highp
是不支持片段着色器)实际上只有半个浮点数,因此将深度值拆分为 RGBA 值的精度太低。
是否有在大多数 Android 设备上运行良好的 WebGL 阴影映射的工作示例?或者这是不可能的?(通过浮点扩展之类的东西来模拟更高的浮点精度在片段着色器中似乎过于昂贵)。