c++ - OpenGL 2.1でのglDrawRangeElementsの使用

原文 c++ c opengl

Questions about glDrawRangeElements()の情報に基づいて、次の項目が与えられます。

struct MyVertex
{
   GLfloat x, y, z;        //Vertex
};

const GLushort pindices[] = { 0, 1, 2, 3, 5, 4 };

struct MyVertex pvertex[6];
//VERTEX 0
pvertex[0].x = 0.0;
pvertex[0].y = 0.0;
pvertex[0].z = 0.0;
//VERTEX 1
pvertex[1].x = 1.0;
pvertex[1].y = 0.0;
pvertex[1].z = 0.0;
//VERTEX 2
pvertex[2].x = 0.0;
pvertex[2].y = 1.0;
pvertex[2].z = 0.0;
//VERTEX 3
pvertex[3].x = 0.0;
pvertex[3].y = 0.0;
pvertex[3].z = 0.0;
//VERTEX 4
pvertex[4].x = 1.0;
pvertex[4].y = 0.0;
pvertex[4].z = 0.0;
//VERTEX 5
pvertex[5].x = 0.0;
pvertex[5].y = -1.0;
pvertex[5].z = 0.0;


そして次の初期化:

glGenBuffers(1, &VertexVBOID);
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBufferData(GL_ARRAY_BUFFER, sizeof(struct MyVertex)*3, &pvertex[0].x, GL_STATIC_DRAW);
glVertexPointer(3, GL_FLOAT, sizeof(struct MyVertex), BUFFER_OFFSET(0));

glGenBuffers(1, &IndexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*3, pindices, GL_STATIC_DRAW);

glEnableClientState(GL_VERTEX_ARRAY);


次の呼び出し:

glDrawRangeElements(GL_TRIANGLES, 0, 2, 3, GL_UNSIGNED_SHORT, (const GLvoid*) pindices);
glDrawRangeElements(GL_TRIANGLES, 3, 5, 3, GL_UNSIGNED_SHORT, (const GLvoid*) pindices+3);


2つの三角形を描画する必要があります。ただし、EXE_BAD_ACCESSが表示されます。 glDrawRangeElementsでpindices [0]を使用すると、最初の3つのインデックスで定義された三角形を取得します。 glDrawRangeElementsへの2回目の呼び出しでpindices [3]を使用しても、何も描画されず、OpenGlエラーも発生しません。最後の3つの頂点によって定義された逆三角形を2番目のglDrawRangeElements呼び出しが描画することはありません。ここでのポインタの使用に関して、基本的な何かが足りないように感じますが、まだ理解できていません。考え?
答え
あなたの問題はglDrawRangeElementsに直接関係しているのではなく、VBOの誤った使用に関係しています。

まず、VBOを使用する場合(より正確には、VBOをGL_ELEMENT_ARRAY_BUFFERにバインドする場合)、glDraw...へのインデックスポインター引数は、GL_ELEMENT_ARRAY_BUFFERバインドポイントにバインドされたバッファーへのバイトオフセットとして解釈されます(インデックスbuffer)、GL_ARRAY_BUFFERglVertexPointerへの配列引数に影響する方法に似ています。したがって、悪いアクセス。したがって、最初の(const GLvoid*)pindices呼び出しで0glDrawRangeElementsに置き換えます。とにかく、2番目の呼び出しは間違っています。これは、voidポインターでポインター演算を実行できないためです(コンパイルすることもできません。バイト数、ショート数をどれだけ増やすか)。したがって、2番目の呼び出しでは、(const GLushort*)0+3を使用して、インデックスバッファーの4番目のインデックスへのバイトオフセットを取得します。

次に、両方のsizeof(...)*3呼び出しでglBufferDataを使用しますが、配列には実際には6つの要素が含まれているため、バッファーには必要なデータの半分しか含まれていません。
関連記事

c++ - POSIX読み取りの一時停止をマイクロ秒の範囲で認識する

c++ - Qtで、モデルからリストビューのアイテムの背景色をリセットするにはどうすればよいですか?

c++ - 実装ファイルでコンストラクタを使用するにはどうすればよいですか?

c++ - cursesライブラリーの使用時にmove()またはwmove()を使用するとカーソルが移動しない

c++ - プログラムでシステム情報を開く

c++ - Boost::Spiritを使用してエスケープされた文字列を解析する

java - 乱数をテストする[終了]

c++ - Qt CreatorとGCC

c++ - DLLが機能しない

c++ - Win32のアニメーションとイベントの質問(C++)