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 执行 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 );

我的缓冲区1中总是得到0x00000000。为什么是这样?我发现的唯一 2 个原因是我没有正确初始化 glewInit 并且我没有调用 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 回答