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

それは素晴らしい罪を生み出します:

フラグメントシェーダーによって生成された罪

(!!!) でマークされた行に注意してください。float 値に 1.0 を掛けても何も変わらないはずだと思います。(Windows OS で実行されている同じシェーダーは、期待どおりに動作します。) そこで、行のコメントを外すと、次のようになります。

えっ?!

なんてこと?!


再現方法:

  1. xcode の標準テンプレートから iOS ゲーム プロジェクトを作成します。プロジェクトを実行すると、2 つのフローティング キューブが表示されます。赤と青が1つずつ。
  2. Shader.vsh の内容を次のように変更します。(私は 1 つの可変パラメーター 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

さて、私自身の質問に答えさせてください。問題は、シェーダーで使用される低精度の修飾子にあります。ミディアムシェーダーに変更した後、期待どおりに動作し始めました。

于 2012-08-02T07:55:17.157 に答える