3

glewInit( ) とその他の openGL のものを初期化しました。これらの呼び出しを行う前にすべて。

  glGenBuffers( 1, &m_uiVertBufferHandle );
  glBindBuffer( GL_ARRAY_BUFFER, m_uiVertBufferHandle );
  glBufferData( GL_ARRAY_BUFFER, 0, 0, GL_READ_WRITE );
  glBindBuffer( GL_ARRAY_BUFFER, 0 );

これは、バッファオブジェクトを作成する方法です。iiは、glMapBufferが常に0x00000000を与えるようになる少なくとも1回呼び出さないと、ストレージスペースがまったくないopenGLの記事を読んだため、glBufferDataを実行しました。

後で glMapBuffer を呼び出して、glMapBuffer を使用するときにデータの保存を開始するストレージの場所を取得します。このように呼び出します

void* buffer1; 
glBindBuffer( GL_ARRAY_BUFFER, m_uiVertBufferHandle );

//make sure our buffer excists
buffer1 = glMapBuffer( GL_ARRAY_BUFFER, GL_READ_WRITE );

buffer1 には常に 0x00000000 が入ります。どうしてこれなの?私が見つけた唯一の2つの原因は、glewInitを適切に初期化しなかったことと、少なくとも1回はglBindBufferDataを呼び出していなかったことです。

4

2 に答える 2

4
glBufferData( GL_ARRAY_BUFFER, 0, 0, GL_READ_WRITE );

GL_READ_WRITEバッファ オブジェクトの有効な使用法ではありません。バッファオブジェクトの使用ではなく、マッピングに使用します。使用パラメータは のようなものGL_STATIC_DRAW、または「読み取り/書き込み」の場合にはより合理的ですGL_DYNAMIC_READ

無効な列挙型が渡されたため、OpenGL でGL_INVALID_ENUMエラーが発生し、このコマンドを実行できませんでした。また、長さ 0 のバッファー オブジェクトは、バッファーのストレージとして妥当なサイズではありません。new int[0]またはmalloc(0)いつか試してみて、何が起こるか見てください。

極小または存在しないサイズのデータ​​の割り当てを停止してください。本当にこれをテストしたい場合は、4096 バイトか何かを割り当ててください。

于 2012-11-08T22:49:34.277 に答える
2

0バッファのサイズとして に渡しglBufferDataます。これは、OpenGL 実装がバッファーのサイズ (理論上も) を認識しておらず、このサイズがゼロのバッファーをマップする方法を認識していないことを意味します。

サイズとしてゼロ以外の値を使用し、データ ポインターとして NULL を使用します。

glBufferData( GL_ARRAY_BUFFER, SizeOfTheBuffer, NULL, GL_READ_WRITE );

PS GL_READ_WRITEは、バッファー オブジェクトの有効な使用法ではありません。

于 2012-11-08T22:09:41.163 に答える