Android 忽略GLSL精度限定符
我们有OpenGLES2.0着色器,可以在IOS和大多数Android设备上正常工作,但在Amazon Kindle Fire 7上,我们的一个不同组件似乎正在失去精度 它在顶点着色器和像素着色器中定义为Android 忽略GLSL精度限定符,android,opengl-es-2.0,precision,fragment-shader,Android,Opengl Es 2.0,Precision,Fragment Shader,我们有OpenGLES2.0着色器,可以在IOS和大多数Android设备上正常工作,但在Amazon Kindle Fire 7上,我们的一个不同组件似乎正在失去精度 它在顶点着色器和像素着色器中定义为 varying highp vec4 v_worldposition; 我们也有 precision highp float; 在每个文件的顶部 然而,在这台设备上,数字越高,精度越差。在0附近有很多精度,但是当位置达到200+时,精度下降到0.1个单位左右-因此着色器似乎使用了16位浮点
varying highp vec4 v_worldposition;
我们也有
precision highp float;
在每个文件的顶部
然而,在这台设备上,数字越高,精度越差。在0附近有很多精度,但是当位置达到200+时,精度下降到0.1个单位左右-因此着色器似乎使用了16位浮点。在我看来,一点也不高,但也许这就是它所能做的
它可能对所有不同的组件使用16位浮点,但在我们的例子中,它表现得非常糟糕,因为我们在基于世界坐标的像素着色器中进行纹理处理
有人知道有没有办法在着色器或其他代码中强制使用32位浮点,或者Amazon Fire 7是否支持它。这可能是清单中的一个设置吗?这是我们在Android设备上看到的唯一一个问题。OpenGLES 2规范允许设备在片段着色器中仅支持mediump精度 亚马逊KindleFire7的Mali-450MP4 GPU大概就是这样一种设备。可以在运行时使用
glGetShaderPrecisionFormat
进行查询
您要么必须放弃对此类设备的支持(说起来容易做起来难,因为没有简单的清单选项),要么必须重构着色器,使其不依赖于高精度,或者在运行时进行检测,并对此类设备使用较低细节的着色器。我倾向于后者。我想这完全取决于“mediump”的精度。我们已经更改了着色器,但我们还将按照您的建议检查精度。谢谢