与webgl相比,android上的着色器精度不准确

与webgl相比,android上的着色器精度不准确,android,opengl-es,fragment-shader,simplex-noise,Android,Opengl Es,Fragment Shader,Simplex Noise,基于以下示例,我尝试在android上发出单纯形噪音: 在转换代码并在设备上编译之后,我意识到模式远非随机。我已经将代码分解到最基本的部分,在这里我仍然看到桌面(我在上面测试这些)和移动设备之间的巨大差异,我得到了这个 #ifdef GL_ES precision mediump float; #endif #extension GL_OES_standard_derivatives : enable uniform float time; uniform vec2 mouse; unif

基于以下示例,我尝试在android上发出单纯形噪音:

在转换代码并在设备上编译之后,我意识到模式远非随机。我已经将代码分解到最基本的部分,在这里我仍然看到桌面(我在上面测试这些)和移动设备之间的巨大差异,我得到了这个

#ifdef GL_ES
precision mediump float;
#endif

#extension GL_OES_standard_derivatives : enable

uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;

float u_time = time;
vec2 u_resolution = resolution;

vec3 mod289(vec3 x) { 
    vec3 t = x * 0.00346020761;
    t = floor(t);
    t = t * 289.0;

    return x - t;

    //return x - floor(x * (1.0 / 289.0)) * 289.0; 
}

vec3 permute(vec3 x) { 
    vec3 t = x * 34.0;
    t = t + 1.0;
    t = t * x;
    return mod289(t);

    //return mod289(((x*34.0)+1.0)*x); 
}


void main( void ) {

    vec2 p = vec2( (gl_FragCoord.xy / u_resolution.xx - 0.5) * 2.0);

    vec3 value = permute( p.xyx * 10000.0 + u_time * 0.1);

    gl_FragColor = vec4(value, 1.0);
    //gl_FragColor = vec4(p + 1.0, 0.0, 1.0);
}
将它们分成几行的目的是,我以前也遇到过这种错误。

在设备上,此代码(#ifdef和#扩展名已删除,且统一变量设置正确)生成白色屏幕。(在多台设备上测试,使用#版本300 es,也使用较旧的着色器版本,结果始终相同。)

这个错误是由floor()的不准确引起的吗

或者有没有办法在没有这些mod289功能的情况下产生单纯形噪声?
(2d噪波运行正常)

桌面GPU很可能使用fp32精度进行计算(即使在着色器中指定了只需要fp16的
mediump

如果设置
精度高浮点值
,它是否工作得更好?这将强制fp32浮点计算

但是,请注意,并非所有移动设备都支持
highp
——它仅在OpenGL ES 3.x之后成为强制性的,因此一些OpenGL ES 2.x GPU仅支持fp16计算


(您在哪台设备上运行?

我只在较低的设备上测试了highp,它是ARM Mali-400 MP2(双核)。支持es 3.0的Adreno 305更好的一个也支持highp,解决了我的问题。注意:对于其他有此问题的用户,您可以检查精度支持情况:如果不支持highp,glGetShaderPrecisionFormat将返回零。Mali-400系列仅适用于OpenGL ES 2.x,不支持fp32,因此在这种情况下,您将只获得fp16