0

Mavericks を実行している Intel HD 4000 グラフィックスを搭載した Macbook Pro でジオメトリ シェーダーを試しています。EndPrimitive()通話中に奇妙な動作に気付きました。ここに私のジオメトリシェーダーがあります:

#version 150 core

layout(points) in;
layout(triangle_strip, max_vertices = 512) out;

void main() {
    vec4 start_pos = gl_in[0].gl_Position + vec4(-0.5, -0.5, 0.0, 0.0);
    vec4 bottom_vertex = start_pos;

    for (int i = 0; i < 17; ++i) {
        bottom_vertex = start_pos + vec4(float(i) * float(1.0 / 16.0), 0.0, 0.0, 0.0);
        gl_Position = bottom_vertex;
        EmitVertex();

        gl_Position = bottom_vertex + vec4(0.0, 1.0/16.0, 0.0, 0.0);
        EmitVertex();
    }
    //EndPrimitive();
}

プログラムはglfw、OpenGL 3.2 コア コンテキストを使用および要求します。で 1 つの頂点のみを描画し[0, 0]ます。私の目標は、最終的にジオメトリ シェーダーが複数の三角形ストリップで構成される正方形のグリッドを出力するようにすることです。シェーダーはそのままで、グリッドの 1 行を出力します。結果は次のとおりです。

明らかに正しい出力

その時点で、現在のトライアングル ストリップ プリミティブを終了し、次の行のために新しいプリミティブを開始したいと考えています。EndPrimitive()ただし、上記のシェーダーで呼び出しのコメントを外すだけで、結果が台無しになります。

壊れた出力

について何か誤解していEndPrimitive()ますか? 私の理解では、現在のトライアングル ストリップを終了し、新しいトライアングル ストリップを開始する必要があります。ループの後は何もしていないので、シェーダーの結果はループのEndPrimitive()有無にかかわらず同じになるはずです。

また、今は別の実装でテストすることはできません。私の実装にバグがあるのでしょうか? この問題を特定するためにできることはありますか?

4

1 に答える 1

1

間違いは私のホストコードにあったことが判明しました。glDrawArrays()最後のパラメーターとして間違った値で呼び出していました。配列バッファーに含まれるよりも多くのポイントを描画する呼び出しを発行したため、これはおそらく未定義の動作です。その問題を修正するとEndPrimitive()、期待どおりに動作します。

于 2014-09-22T21:43:06.957 に答える