2

だから私は単純なキューブ「メッシュ」を持っています:

6 つの立方体面は 12 の三角形であるため、36 の「頂点」が 36 のインデックスとして編成され、8 つの固有の頂点位置、6 つの固有の頂点法線、および 4 つの固有の頂点-texcoords を再利用します。

このインデックス付きメッシュは VBO/IBO ペアに格納され、その前後に他のメッシュが存在する可能性があるため、ここでは base-vertex をお勧めします。

これで、次のような 1 回の描画呼び出しで立方体全体を完全かつ正確にレンダリングできます。

gl.DrawElementsBaseVertex(
    gl.TRIANGLES, gl.Sizei(36), gl.UNSIGNED_INT,
    gl.PtrOffset(nil, uintptr(myMeshIndexBufOffset)),
    gl.Int(myMeshIndexBufBaseIndex))

ただし、今は「最初の 4 つの三角形」(別名「最初の」2 つの立方体面) を描画したいだけです - 1 回ではなく 4 回の描画呼び出しで (間にテクスチャ バインドが発生する可能性があるため)、私は本当にcountおよびbasevertex引数を適切に指定する方法に関する損失。

1 つの三角形の場合は、3 の数を指定する必要があると想定する必要あります。12 の三角形の場合、完全な立方体を正常にレンダリングするには 36 を使用する必要があったため、1 つの三角形の 3 は理にかなっています。次に、要素配列から 3 つの「インデックス エントリ」(ここではエントリごとに 3 つの uint32 として定義) を選択します。正しい?

しかし、論理的な推論でも実験でも、ベース頂点がここでどのように指定されているかを理解することはできません。具体的には、既知の「cube-mesh base-index」に独自のオフセットを追加する必要があります。glDrawElementsBaseVertex() を実行すると、個々の 12 個の三角形すべてがループ内で個別に処理されます。

for i := 0; i < 12; i++ {
    gl.DrawElementsBaseVertex(
        gl.TRIANGLES, gl.Sizei(3), gl.UNSIGNED_INT,
        gl.PtrOffset(nil, uintptr(myMeshIndexBufOffset)),
        (i * fooBar) + gl.Int(myMeshIndexBufBaseIndex))
}

それから...上記のfooBarが正確に何を表すべきかについて、誰かが洞察を持っていますか?

本当に、理論的には、 glDrawElementsBaseVertex 仕様を完全に理解していると確信してましたが、実際には、個々の三角形を選択して適切に個別にレンダリングするものは何もありません。

4

1 に答える 1

3

わかりました...要素配列バッファーから読み取る位置へのオフセットとして追加されるのではなく、要素配列バッファーから取得された後にベース頂点がインデックスに追加されることに気づきました。 .. ああ。したがって、basevertex 引数ではなく、indexes 引数をオフセットする必要あるようで、現在、目的の結果が得られているようです。

于 2013-02-18T16:03:38.847 に答える