1

私は率直になりたいので、シナリオから始めます:-

2 つの立方体を描画する必要があり、両方の立方体のデータでバッファー オブジェクトを作成、バインド、および入力し、両方の立方体の要素配列が次のようになっているとします。

const GLshort indexData[] =
{
//Object 1
0, 2, 1,        3, 2, 0,
4, 5, 6,        6, 7, 4,
8, 9, 10,       11, 13, 12,
14, 16, 15,     17, 16, 14,

//Object 2
18, 20, 19,     21, 20, 18,
22, 23, 24,     24, 25, 22,
26, 27, 28,     29, 31, 30,
32, 34, 33,     35, 34, 32,
};

2 つのオブジェクトを描画する最初の方法は次のとおりです。

// first Cube
glDrawElements(GL_TRIANGLES, ARRAY_COUNT(indexData), GL_UNSIGNED_SHORT, 0);

// second Cube
glDrawElementsBaseVertex(GL_TRIANGLES, ARRAY_COUNT(indexData),GL_UNSIGNED_SHORT, 0, numberOfVertices / 2);

ただし、次のコードを使用して両方の立方体を描画することは可能ですか?

// first cube
glDrawElements(GL_TRIANGLES, ARRAY_COUNT(indexData), GL_UNSIGNED_SHORT, 0);

//second cube
// set the indice pointer to 24 so that it starts reading data for the second cube
glDrawElements(GL_TRIANGLES, ARRAY_COUNT(indexData), GL_UNSIGNED_SHORT, pointer to 24th element);

はいの場合、使用するポイントは何glDrawElementBaseVertex()ですか?

4

2 に答える 2

0

はい。

実は、私はあなたと同じオンライン本を読んでいて、あなたと同じ問題に遭遇しました。

私はあなたのコード(「24番目の要素」を含むコード)をテストしましたが、元のコードと同じように機能します:

オリジナルで

glDrawElementsBaseVertex(GL_TRIANGLES, ARRAY_COUNT(indexData),
    GL_UNSIGNED_SHORT, 0, numberOfVertices / 2);

私は得た

ここに画像の説明を入力

そして

glDrawElements(GL_TRIANGLES, ARRAY_COUNT(indexData), GL_UNSIGNED_SHORT, 
    (void*)(indexData + 24));

私は得た

ここに画像の説明を入力

それらは同じです。

実際、私は一日中この問題について考えています。

本が指摘しているように (ここでは、最後の注の 2 番目の段落を確認してください)、(32 ビット OS 上で) 65536 (2 バイト) を超える頂点を含むモデルがある場合、要素配列は GL_UNSIGNED_SHORT(2バイト) をインデックスの型として使用しなくなりました。代わりに、GL_UNSIGNED_INT(4 バイト) を使用する必要があります。2倍のストレージが必要です。

次に、ここで glDrawElementsBaseVertex の説明を確認します。( index [i] + basevertex ) の値がtypeの最大値を超える場合、値は 32 ビットの unsigned int にアップコンバートされると言われています。

これらの参考文献を念頭に置いて、私は次の結論を得ました。

たとえば、1,000,000 個の頂点で構成される 3D キャラクターがあるとします。glDrawElements を使用してレンダリングする場合、GL_UNSIGNED_INT を使用してインデックスを格納する必要があり、約 3.8MB かかります。しかし、「65536 * numberOfPage + index」のようなものを使用できる場合 (ランダムアクセスのように、これらの頂点を異なる「ページ」に分割し、インデックスを使用してそのページの頂点を示すことができれば、65536 がページのサイズ) glDrawElementsBaseVertex を使用しても、GL_UNSIGNED_SHORT を使用してこれらのインデックスを格納できます。この場合、約 1.9MB 節約できます。

1.9MB というと大した数字に聞こえないかもしれませんが、現代の 3D ビデオ ゲームの状況を考えてみてください。これらの文字は 1,000,000 をはるかに超える頂点で構成されている必要があり、その場合、glDrawElementsBaseVertex が保存するのは 1.9MB ではなく 190MB になる可能性があります。

とにかく、私は OpenGL とコンピュータ グラフィックスの初心者でもあるので、これは私の憶測にすぎません。:)

于 2014-11-02T07:21:54.333 に答える