0

这是我在 iPhone 3g 上的 iOS 5.1.1 上运行的片段着色器程序。

#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);
}

这会产生美好的罪恶:

片段着色器生成的罪孽

注意标有 (!!!) 的行。我想,将浮点值乘以 1.0 不会有任何改变。(在 Windows 操作系统下运行的同一着色器完全按预期工作。)因此,我取消注释该行并收到以下信息:

哇?!

怎么回事?!


如何重现:

  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. 将 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. 在设备上运行程序并查看蓝色立方体上的酷条: 酷酒吧

  5. 取消注释由 (!!!) 标记的行 ( a = a * 1.0;) 并再次运行: 呃?

4

1 回答 1

0

好吧,让我回答我自己的问题。问题在于着色器中使用的低精度限定符。将其更改为 mediump 着色器后开始按预期工作。

于 2012-08-02T07:55:17.157 回答