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 回答