2012-08-01 79 views
0

這是我在iPhone 3g上運行iOS 5.1.1的片段着色器程序。iOS中的基本算術GLSL片段着色器

#ifdef GL_ES 
precision lowp float; 
#endif 

varying vec2 v_texCoord; 

void main() 
{ 
    float offset = sin(v_texCoord.x * 10.0); 
    // offset = offset * 1.0; // (!!!) 
    gl_FragColor = vec4(offset, 0.0, 0.0, 1.0); 
} 

將會產生很好的罪:

sin generated by fragment shader

說明標線(!)。我想,浮點值乘以1.0必須不會改變。 (在Windows操作系統中運行相同的着色器工程完全按照預期的。)所以,我去掉行和接收這樣的:

wtf?!

WTF?


如何重現:

  1. 創建一個從在Xcode標準模板的iOS遊戲項目。如果你運行該項目,那麼你會看到兩個浮動立方體。一個紅色和一個藍色。
  2. 將Shader.vsh的內容更改爲以下內容。 (我剛剛添加了一個可變參數v_pos)。

    attribute vec4 position; 
    attribute vec3 normal; 
    
    varying lowp vec4 colorVarying; 
    varying lowp vec4 v_pos; 
    
    uniform mat4 modelViewProjectionMatrix; 
    uniform mat3 normalMatrix; 
    
    void main() 
    { 
        vec3 eyeNormal = normalize(normalMatrix * normal); 
        vec3 lightPosition = vec3(0.0, 0.0, 1.0); 
        vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0); 
    
        float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); 
    
        colorVarying = diffuseColor * nDotVP; 
    
        gl_Position = modelViewProjectionMatrix * position; 
        v_pos = gl_Position; 
    } 
    
  3. Chnge Shader.fsh以下。

    varying lowp vec4 colorVarying; 
    varying lowp vec4 v_pos; 
    
    void main() 
    { 
        gl_FragColor = colorVarying; 
        lowp float a = sin(v_pos.x * 10.0); 
        // a = a * 1.0; // (!!!) 
        gl_FragColor = vec4(a, 0.0, 0.0, 1.0); 
    } 
    
  4. 的設備上運行程序,看到藍色立方體灰色條: Cool bars

  5. 通過取消註釋(!)標記的代碼行(a = a * 1.0;),然後再次運行: Uh?

+0

是由iOS上的圖形硬件引入的舍入錯誤? – deanWombourne 2012-08-01 11:53:27

+0

它看起來像。 我也在iPad上測試過它,它工作正常。我也會嘗試在其他iPhone設備上進行測試。 – 2012-08-01 12:29:42

+0

iPhone 4上也存在問題。 – 2012-08-01 13:34:01

回答

0

好吧,讓我回答我自己的問題。 問題在於shader中使用的lowp精度限定符。 將其更改爲中景着色器後,開始按預期工作。