OpenGL ES 2.0 fragment shader arithmetic incorrect on iOS
我对 GLSL 很陌生,所以请原谅这些问题的基本性质..
首先,调用:
1 2 | int range[2], precision; glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision); |
对于我的设备,这将返回
其次,我的目标是使用这种方法在片段着色器中模拟双浮点精度。我使用以下代码在 CPU 端将双精度浮点数拆分为 2 个浮点数:
1 2 3 4 5 6 7 8 9 | 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 个制服。制服是这样声明的:
1 2 | precision highp float; uniform float u_h0, u_h1; |
我遇到的问题是在以下代码中:
1 2 3 4 | float a = u_h0; float b = u_h1; float s=a+b; float e=b-(s-a); // always 0 |
溢出项
似乎编译器可能将
这看起来有可能吗?如果有,我该如何阻止这种情况发生?
感谢您的帮助。
变化:
1 | varying vec2 v_texCoords; |
收件人:
1 | invariant varying vec2 v_texCoords; |
在顶点和片段着色器中都解决了这个问题。