6

GL_LINE_STRIP を使用して多くの線を描画するにはどうすればよいですか?ただし、次の値にジャンプするため、これらの線の間に余分な線を描画しないでください。画像を見る

ここに画像の説明を入力

赤い線はグラフの線の実際の値ですが、黄色の線は line1 の値を終了して次の値に進みますが、これらの値の間に線を引いているためです。

私が使用しているコードは次のようなものです: vector1 にはすべての行の値が含まれています。

glGenVertexArrays(1,&Vector1_VAObject);
glGenBuffers(1,&Vector1_VBObject);

glBindVertexArray(Vector1_VAObject);
glBindBuffer(GL_ARRAY_BUFFER, Vector1_VBObject);

glBufferData(GL_ARRAY_BUFFER,vector1.size()*sizeof(GLfloat), &vector1[0] ,GL_STATIC_DRAW);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE, 3*sizeof(GLfloat),(GLvoid*)0);
//Clean
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);

glUseProgram(lineShader->getProgram());
glBindVertexArray(Vector1_VAObject);

glDrawArrays(GL_LINE_STRIP,0,vector1.size());


glBindVertexArray(0);

だから私の質問は、どうすればこの問題を解決できますか? したがって、ベクトルをループし、最初の線の描画が終了した後にジャンプするときではなく、線の値のみを描画します..

4

2 に答える 2

13

複数の切断されたライン ストリップを描画するには、いくつかのオプションがあります。

複数の描画呼び出し

最も簡単で直接的な方法は、複数の描画呼び出しを行うことです。現在、バッファに 1000 個の頂点があり、描画呼び出しを行うと、次のようになります。

glDrawArrays(GL_LINE_STRIP, 0, 1000);

ここで、これが実際にそれぞれ 250 個の頂点を持つ 4 つの切断された線のセットである場合、単純に各線のセットを個別に描画します。

glDrawArrays(GL_LINE_STRIP, 0, 250);
glDrawArrays(GL_LINE_STRIP, 250, 250);
glDrawArrays(GL_LINE_STRIP, 500, 250);
glDrawArrays(GL_LINE_STRIP, 750, 250);

欠点はもちろん、複数のドローコールが必要になることです。これが適度な数の呼び出しであり、各呼び出しが依然としてかなりの量の作業を生成している限り、これは問題ありません。パフォーマンス上の理由から、小さな描画呼び出しが多数あることは望ましくありません。

glMultiDrawArrays()

基本的に単一の API 呼び出しで複数の描画呼び出しを送信できるさまざまな呼び出しがあります。たとえば、これは上記の呼び出しシーケンスと同等です。

GLint firstA[4] = {0, 250, 500, 750};
GLint countA[4] = {250, 250, 250, 250};
glMultiDrawArrays(GL_LINE_STRIP, firstA, countA, 4);

あなたがやろうとしていることを私が理解しているように、このソリューションはあなたにとって理想的かもしれません。

GL_LINESそれ以外のGL_LINE_STRIP

ドローコールに使用するGL_LINESと、ポイントの各ペアが個別の線で接続され、簡単にギャップができます。

ただし、重大なペナルティがあります。ほとんどの頂点が繰り返されるため、バッファーにほぼ 2 倍の頂点が必要です。以前にn頂点があった場所:

a0 a1 a2 a3 ... an

2 * n - 2同じジオメトリの頂点が必要です:

a0 a1 a1 a2 a2 a3 a3 ... an

利点は、1 回の描画呼び出しで必要な数のギャップを含めてすべてを描画できることです。

プリミティブ リスタート

OpenGL 3.1以降には、「プリミティブ再起動」と呼ばれる機能があり、説明したような場合に非常に便利です。ただし、インデックス配列を使用する必要があります。いずれにせよ、ジオメトリがより複雑な場合はインデックス配列がよく使用されるため、通常は問題になりません。しかし、インデックス配列を使用しておらず、ユースケースでそれを実際に必要としないため、プリミティブ再起動を使用するためだけにインデックス配列を導入する価値はおそらくありません。

ここにコード例を含めるつもりはありませんが、「OpenGL プリミティブ再起動」を探すと、多くのドキュメントと例を見つけることができるはずです。

于 2015-07-31T08:02:44.287 に答える