最も実用的な方法は、おそらく最も単純な方法です。線と三角形のレンダリングに個別のインデックス配列を使用します。確かに頂点属性を複製する必要はありませんが、まったく異なるプリミティブ タイプを同じインデックスで描画することは非常に問題に思えます。
GL_ELEMENT_ARRAY_BUFFER
これを実装するには、2 つの異なるインデックス ( ) バッファーを使用できます。または、より洗練された私見では、単一のバッファを使用し、両方のインデックス セットを格納します。三角形のレンダリングと線のレンダリングtriIdxCount
にインデックスが必要だとします。lineIdxCount
次に、次の方法でインデックス バッファを設定できます。
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuf);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
(triIdxCount + lineIdxCount) * sizeof(GLushort), 0,
GL_STATIC_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,
0, triIdxCount * sizeof(GLushort), triIdxArray);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,
triIdxCount * sizeof(GLushort), lineIdxCount * sizeof(GLushort),
lineIdxArray);
次に、描画の準備ができたら、インデックス バッファー バインディングを含むすべての状態を設定し (理想的には、すべての状態設定に VAO を使用します)、条件付きでレンダリングします。
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuf);
if (renderTri) {
glDrawElements(GL_TRIANGLES, triIndexCount, GL_UNSIGNED_SHORT, 0);
} else {
glDrawElements(GL_LINES, lineIdxCount, GL_UNSIGNED_SHORT,
triIndexCount * sizeof(GLushort));
}
メモリ使用量の観点からすると、2 セットのインデックスを持つことは、適度な量のオーバーヘッドです。通常、実際の頂点属性データはインデックス データよりもはるかに大きく、ここで重要な点は、属性データが複製されないことです。
線を厳密にレンダリングする必要はなく、ワイヤフレーム タイプのレンダリングが必要な場合は、他のオプションがあります。たとえば、ポリゴンの境界に近いピクセルのみを描画し、ポリゴン エッジまでの距離に基づいてフラグメント シェーダーの内部ピクセルを破棄するエレガントなアプローチ (自分で実装したことはありませんが、巧妙に見えます) があります。この質問 (私が回答を寄稿した場所) では、アプローチについて詳しく説明しています:ワイヤーフレーム シェーダー - 共有頂点を使用する場合の重心座標の問題。