的OpenGL ES 2.0片段着色运算不正确iOS上

问题描述:

我是很新的GLSL所以请原谅这些问题的基本性质..的OpenGL ES 2.0片段着色运算不正确iOS上

首先,将呼叫:

int range[2], precision; 
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision); 

对于我设备返回precision = 23range = {127, 127}。在我进一步讨论之前,我的理解是这是一个32位的浮点数(1符号+8exp + 23尾数) - 这是正确的吗?

其次,我的目标是使用this method模拟片段着色器中的双精度浮点数。我用下面的代码分割出双入CPU侧2个漂浮:

static double const SPLITTER = (1 << 29) + 1; 

static inline void set2d(double a, float* b, float* c) { 
    double t = a * SPLITTER; 
    double hi = t - (t - a); 
    double lo = a - hi; 
    *b = (float)hi; 
    *c = (float)lo; 
} 

然后我与返回的高/低的值的片段着色器组2和制服。制服的声明如下:

precision highp float; 
uniform float u_h0, u_h1; 

我的问题是,在下面的代码:

float a = u_h0; 
float b = u_h1; 
float s=a+b; 
float e=b-(s-a); // always 0 

溢出项float e=b-(s-a);始终计算为0的GPU(我设置的颜色调试基于),无论我通过u_h0u_h1(我也证实这两个都不为零)。

似乎编译器可能会将e解释为b - ((a + b) - a) == (b - b) == 0,即在编译时优化代码。

这似乎是否可能,如果是的话,我怎么能阻止这种情况发生?

感谢您的任何帮助。

更改:

varying vec2 v_texCoords; 

到:

invariant varying vec2 v_texCoords; 

在这两个顶点和片段着色器解决了这个问题。