1
我是很新的GLSL所以請原諒這些問題的基本性質..的OpenGL ES 2.0片段着色運算不正確iOS上
首先,將呼叫:
int range[2], precision;
glGetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_HIGH_FLOAT, range, &precision);
對於我設備返回precision = 23
和range = {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_h0
和u_h1
(我也證實這兩個都不爲零)。
似乎編譯器可能會將e
解釋爲b - ((a + b) - a) == (b - b) == 0
,即在編譯時優化代碼。
這似乎是否可能,如果是的話,我怎麼能阻止這種情況發生?
感謝您的任何幫助。