2011-08-31 455 views
0

我在写一些概念验证代码。我想证明我可以在创建缓冲区后将数据写入缓冲区对象。但是,当我在写入缓冲区后尝试取消映射缓冲区时,我得到的是GLENUM错误代码1280。我完全困惑。openGL glUnmapBuffer()返回未知错误代码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); 

回答

2

1280,或在0x0500,是GL_INVALID_ENUM

glUnmapBuffer获取绑定缓冲区对象的枚举值,而不是要取消映射的缓冲区对象值。 glUnmapBuffer预计将缓冲区对象取消映射以绑定到该绑定目标。因此glUnmapBuffer(GL_ARRAY_BUFFER)将取消映射当前绑定到GL_ARRAY_BUFFER绑定的任何内容。

+0

哇。谢谢。我不知道我是如何错过这个参数的。今晚我回家时我会试试看。另外, – ahoffer

+0

另外,你有什么想法为什么glMapBuffer()失败,但glMapBufferRange()成功?谢谢,亚伦 – ahoffer

+0

我测试过了。工作很好。非常感谢。 – ahoffer