iOS GLSL片段着色器中的基本算术

时间:2012-08-01 10:02:00

标签: ios fragment-shader

这是我的片段着色器程序,它在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);
}

哪会产生好罪:

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 个答案:

没有答案