glMapBuffer不断返回0x00000000

时间:2012-11-08 21:28:32

标签: opengl vbo vertex vertex-buffer

我初始化了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 );

这就是我创建缓冲区对象的方法。我做了glBufferData,因为我已经在openGL文章中读到了你根本没有任何存储空间,如果你没有调用它至少一次会使glMapBuffer总是给你0x00000000。

稍后我调用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。为什么是这样?我发现的唯一两个原因是我没有正确地初始化glewInit我已经完成了并且我至少没有调用glBindBufferData一次。

2 个答案:

答案 0 :(得分:4)

glBufferData( GL_ARRAY_BUFFER, 0, 0, GL_READ_WRITE );

GL_READ_WRITEnot a valid usage for buffer objects。您将其用于映射,而不是缓冲区对象的用法。使用参数类似于GL_STATIC_DRAW,或更合理地用于“读/写”情况,GL_DYNAMIC_READ

因为你传递了无效的枚举,OpenGL给你一个GL_INVALID_ENUM错误并且无法执行此命令。此外,0长度缓冲区对象不是缓冲区存储的合理大小。有时候尝试new int[0]malloc(0),看看会发生什么。

如果您真的想测试,请停止allocating miniscule or non-existent sizes of data.分配4096字节或其他内容。

答案 1 :(得分:2)

您将0作为缓冲区的大小传递给glBufferData。这意味着OpenGL实现不知道缓冲区的大小(甚至理论上),也不知道如何映射这个零大小的缓冲区。

使用非零值作为大小,使用NULL作为数据指针,即:

glBufferData( GL_ARRAY_BUFFER, SizeOfTheBuffer, NULL, GL_READ_WRITE );

P.S。 GL_READ_WRITE不是缓冲区对象的有效用法。