glMapBuffer 不断返回 0x00000000

Posted

技术标签:

【中文标题】glMapBuffer 不断返回 0x00000000【英文标题】:glMapBuffer Returns 0x00000000 constantly 【发布时间】:2012-11-08 21:28:31 【问题描述】:

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

我总是在缓冲区 1 中得到 0x00000000。为什么是这样?我发现的唯一两个原因是我没有正确初始化 glewInit 并且我没有至少调用一次 glBindBufferData。

【问题讨论】:

not getting answers you like 的解决方案是不要删除你的旧问题并再次询问。仅供参考。 @NicolBolas 取决于是否有人滥用了系统的回答 【参考方案1】:
glBufferData( GL_ARRAY_BUFFER, 0, 0, GL_READ_WRITE );

GL_READ_WRITE 是 not 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字节或其他东西。

【讨论】:

是的!非常感谢你:D。如此多的枚举和听起来相似的枚举以及用于相同功能的枚举,但措辞 O_O 略有变化。非常感谢!【参考方案2】:

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

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

glBufferData( GL_ARRAY_BUFFER, SizeOfTheBuffer, NULL, GL_READ_WRITE );

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

【讨论】:

我把它改成了 glBufferData( GL_ARRAY_BUFFER, sizeof(int), NULL, GL_READ_WRITE );我只是想创建我的存储空间开始。这样我就可以拥有我的缓冲区对象存储空间。我试着做你所说的,为我的 void* buffer1 放置某种大小我仍然得到 0x00000000 GL_READ_WRITE 不是缓冲区对象的有效用法。

以上是关于glMapBuffer 不断返回 0x00000000的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:如何在 Qt 中使用 glMapBuffer?

带有 glMapBuffer 的 Buffer 会被分配比 glBufferSubData 更慢的 VRAM 吗?

使用glMapBuffer的缓冲区是否会分配比glBufferSubData更慢的VRAM?

使用 glMapBuffer 用一个缓冲区渲染多个对象?

0x000000 16进制颜色代码第一个0表示啥意思,为啥要0x后面的颜色代码呢?

打开的网页经常崩溃怎么回事、