2

OpenGL 3.3 コア プロファイルを使用して、次のシェーダーでgl.DrawArrays(gl.TRIANGLES, 0, 3)を介してフルスクリーンの「クワッド」(単一の特大三角形) をレンダリングしています。

頂点シェーダー:

#version 330 core
#line 1

vec4 vx_Quad_gl_Position () {
    const float extent = 3;
    const vec2 pos[3] = vec2[](vec2(-1, -1), vec2(extent, -1), vec2(-1, extent));
    return vec4(pos[gl_VertexID], 0, 1);
}

void main () {
    gl_Position = vx_Quad_gl_Position();
}

フラグメント シェーダー:

#version 330 core
#line 1
out vec3 out_Color;

vec3 fx_RedTest (const in vec3 vCol) {
    return vec3(0.9, 0.1, 0.1);
}

vec3 fx_Grayscale (const in vec3 vCol) {
    return vec3((vCol.r * 0.3) + (vCol.g * 0.59) + (vCol.b * 0.11));

}

void main () {
    out_Color = fx_RedTest(out_Color);
    out_Color = fx_Grayscale(out_Color);
}

さて、コードは少し奇妙に見えるかもしれませんし、これの現在の目的は役に立たないように見えるかもしれませんが、それは GL ドライバーをフェーズするべきではありません。

GeForce では、期待どおりに灰色の画面が表示されます。つまり、ハードコードされた色「赤」(0.9、0.1、0.1) に適用される「グレースケール効果」です。

ただし、Intel HD 4000 [ドライバー 9.17.10.2932 (12-12-2012) バージョン -- 今日の時点で最新のもの] は常に、次の絶え間なくちらつくノイズ パターンを繰り返し表示します。ショット01

ここで、少し実験するために、fx_Grayscale() 関数を少し変更しました。事実上、コーディングがわずかに異なるだけで、同じ視覚的結果が得られるはずです。

vec3 fx_Grayscale (const in vec3 vCol) {

    vec3 col = vec3(0.9, 0.1, 0.1);
    col = vCol;
    float x = (col.r * 0.3) + (col.g * 0.59) + (col.b * 0.11);
    return vec3(x, x, x);
}

繰り返しますが、Nvidia は正しいことを行いますが、Intel HD は常に、かなり異なるが常にちらつきのあるノイズ パターンを繰り返し生成します。ショット02

(さらに別の) Intel GL ドライバーのバグを疑う必要がありますか、それとも私の GLSL コードに何か問題が見られます?見る?

4

1 に答える 1

3

「アウト」カラーをパラメーターとして別の関数に送信するのは奇妙に見えると思います。私はそれを次のように書き直します:

void main () {
    vec3 col = vec3(0f,0f,0f);
    col = fx_RedTest(col);
    col = fx_Grayscale(col);
    out_Color = col;
}

違いはありますか?

于 2013-02-12T14:03:19.147 に答える