OpenGL ES 2.0片段着色器算法在iOS上不正确

OpenGL ES 2.0片段着色器算法在iOS上不正确,ios,opengl-es,glsl,opengl-es-2.0,fragment-shader,Ios,Opengl Es,Glsl,Opengl Es 2.0,Fragment Shader,我对GLSL非常陌生,因此请原谅这些问题的基本性质 首先,呼吁: int range[2], precision; glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision); 对于我的设备,它返回precision=23,和range={127127}。在进一步讨论之前,我的理解是这是一个32位浮点(1号+8经验+23尾数)-这是正确的吗 其次,我的目标是使用模拟片段着色器中的双浮点

我对GLSL非常陌生,因此请原谅这些问题的基本性质

首先,呼吁:

int range[2], precision;
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision);
对于我的设备,它返回
precision=23
,和
range={127127}
。在进一步讨论之前,我的理解是这是一个32位浮点(1号+8经验+23尾数)-这是正确的吗

其次,我的目标是使用模拟片段着色器中的双浮点精度。我使用以下代码在CPU端将一个double拆分为2个float:

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;
}
float a = u_h0;
float b = u_h1;
float s=a+b;
float e=b-(s-a);  // always 0
我遇到的问题是,在以下代码中:

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;
}
float a = u_h0;
float b = u_h1;
float s=a+b;
float e=b-(s-a);  // always 0
溢出项
float e=b-(s-a)u_h0
u_h1
传递了什么,在GPU上code>总是计算为0(我通过根据值设置颜色进行调试)(我还确认这两个值都不是零)

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

这看起来有可能吗?如果有,我怎样才能阻止这种情况发生

感谢您的帮助。

更改:

varying vec2 v_texCoords;
致:

在顶点着色器和片段着色器中都修复了该问题。

更改:

varying vec2 v_texCoords;
致:

在“顶点”和“片段”着色器中,修复了该问题