忽略了GLSL精度限定符

问题描述 投票:0回答:1

我们有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设备。

android opengl-es-2.0 precision fragment-shader
1个回答
1
投票

OpenGLES 2规范允许设备仅支持片段着色器中的中间精度。

据推测,亚马逊Kindle Fire 7的Mali-450MP4 GPU就是其中之一。可以在运行时使用glGetShaderPrecisionFormat进行查询。

您要么必须放弃对此类设备的支持(说起来容易做起来因为没有简单的清单选项),或者您必须重构着色器以便不依赖于高精度,或者在运行时检测并使用较低的细节着色器这种设备。我倾向于做后者。

© www.soinside.com 2019 - 2024. All rights reserved.