1

概念実証コードを書いています。バッファが作成された後、バッファオブジェクトにデータを書き込めることを証明したいと思います。ただし、バッファに書き込んだ後でバッファのマップを解除しようとすると、GLenumエラーコード1280が表示されます。私は完全に窮地に立たされています。

バッファをカラーデータで初期化し、正常にレンダリングできます。問題は、後でバッファ内のデータを変更できないことです。コードは以下のとおりです。これは、新しいデータをバッファーに書き込む方法と、それを読み戻そうとする方法を示しています。エラーコードは、glGetError()が呼び出された後のコメントに表示されます。変数「cbo」はカラーバッファーです。

//NEW COLOR DATA
GLubyte colorData2[9] = {255,255,0, 0,128,255, 255,0,255};

//WRITE THE DATA TO THE COLOR BUFFER OBJECT (variable cbo)
glBindBuffer(GL_ARRAY_BUFFER, cbo);
int err1 = glGetError();  //Error code 0

//Oddly, glMapBuffer always returns and invalid pointer.
//GLvoid * pColor = glMapBuffer(GL_ARRAY_BUFFER, GL_MAP_WRITE_BIT); 

//However, glMapBufferRange return a pointer that looks good 
GLvoid * pColor = glMapBufferRange(GL_ARRAY_BUFFER, 0, 9, GL_MAP_WRITE_BIT);
int err2 = glGetError(); //Error code 0

// Copy colors from host to device
memcpy(pColor, colorData2, 9);

//Unmap to force host to device copy
glUnmapBuffer(cbo);
int err3 = glGetError(); //Error code 1280

//Unbind
glBindBuffer(GL_ARRAY_BUFFER, 0);
int err4 = glGetError(); //Error code 0

//******TEST THE WRITE******
GLubyte readbackData[9];
glBindBuffer(GL_ARRAY_BUFFER, cbo);
int err5 = glGetError(); //Error code 0
GLvoid * pColorX = glMapBufferRange(GL_ARRAY_BUFFER, 0, 9, GL_MAP_READ_BIT);
int err6 = glGetError(); //Error code 1282

//Mem copy halts because of a memory exception. 
memcpy(readbackData, pColorX, 9);

glUnmapBuffer(cbo);
glBindBuffer(GL_ARRAY_BUFFER, 0);

バッファオブジェクトを作成したコードは次のとおりです。

//Create color buffer
glGenBuffers(1, &cbo);
glBindBuffer(GL_ARRAY_BUFFER, cbo);

//Create space for three RGB 8-bit color objects
colorBufferSize = 3 * numColorChannels * sizeof(GLubyte);
glBufferData(GL_ARRAY_BUFFER, colorBufferSize, colorData, GL_DYNAMIC_DRAW);

//Unbind
glBindBuffer(GL_ARRAY_BUFFER, 0);
4

1 に答える 1

2

1280、または0x0500はですGL_INVALID_ENUM

glUnmapBufferマップを解除するバッファオブジェクトではなく、バッファオブジェクトがバインドされている列挙型を取得します。glUnmapBufferバッファオブジェクトがマッピング解除され、そのバインディングターゲットにバインドされることを期待します。したがってglUnmapBuffer(GL_ARRAY_BUFFER)、現在GL_ARRAY_BUFFERバインディングにバインドされているものはすべてマップ解除されます。

于 2011-08-31T04:52:29.680 に答える