繁体   English   中英

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

[英]OpenGL ES 2.0 fragment shader arithmetic incorrect on iOS

我对GLSL很新,请原谅这些问题的基本性质。

首先,致电:

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

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

其次,我的目标是使用此方法在片段着色器中模拟双浮点精度。 我使用以下代码在CPU端将一个double分成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;
}

然后我在片段着色器中使用返回的hi / 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-(sa); 总是在GPU上评估为0(我通过设置基于值的颜色进行调试),无论我为u_h0u_h1传递什么(我也确认这两者都是非零)。

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

这看起来是否可能,如果是这样,我怎么能阻止这种情况发生?

谢谢你的帮助。

更改:

varying vec2 v_texCoords;

至:

invariant varying vec2 v_texCoords;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM