2016-08-17 95 views
1

我是很新的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,即在編譯時優化代碼。

這似乎是否可能,如果是的話,我怎麼能阻止這種情況發生?

感謝您的任何幫助。

回答

0

更改:

varying vec2 v_texCoords; 

到:

invariant varying vec2 v_texCoords; 

在這兩個頂點和片段着色器解決了這個問題。