我们有OpenGLES2.0着色器可以在IOS和大多数Android设备上正常工作,但在亚马逊Kindle Fire 7上似乎我们不同的组件之一正在失去精度
在顶点着色器和像素着色器中定义为
varying highp vec4 v_worldposition;
我们也有
precision highp float;
位于每个文件的顶部。
然而,在这一台设备上,精度越来越差,数字越高越好。在0附近有很多精度,但随着位置达到200+,精度下降到大约0.1个单位 - 所以看起来着色器使用16位浮点。在我看来,根本不高,但也许这就是它所能做的一切?
它有可能为所有变化的组件使用16位浮点,但在我们的情况下它显示非常糟糕,因为我们在基于世界坐标的像素着色器中进行纹理化。
有没有人知道是否有办法在着色器或其他代码中强制使用32位浮点,或者Amazon Fire 7是否甚至可以支持它。它可能是清单中的设置吗?这是我们见过这个问题的唯一Android设备。
答案 0 :(得分:1)
OpenGLES 2规范允许设备仅支持片段着色器中的mediump精度。
据推测,亚马逊Kindle Fire 7的Mali-450MP4 GPU就是其中之一。可以在运行时使用glGetShaderPrecisionFormat
查询。
您必须放弃对此类设备的支持(说起来容易做起来因为没有简单的清单选项)或者您必须重构着色器以便不依赖于高精度,或者在运行时检测并使用较低的这种设备的细节着色器。我倾向于做后者。