为什么glMapBuffer返回NULL
Why is glMapBuffer returning NULL?
我不是在尝试流式传输或任何东西,我只是想通过将顶点和索引数据直接加载到 OpenGL 的缓冲区中来加快我的文件加载代码,而不必先将其放入中间缓冲区。下面是抓取指针的代码:
void* VertexArray::beginIndexLoad(GLenum indexFormat, unsigned int indexCount)
{
if (vao == 0)
return NULL;
bindArray();
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize(indexFormat) * indexCount, NULL, GL_STATIC_DRAW);
iformat = indexFormat;
icount = indexCount;
GLenum err = glGetError();
printf("%in", err);
void* ptr = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
err = glGetError();
printf("%in", err);
unbindArray();
return ptr;
}
问题是,这返回 NULL。更糟糕的是,就在我用GL_ARRAY_BUFFER
做类似的事情之前,我得到了一个完全有效的指针。为什么这失败了,而另一个成功了?
第一个glGetError
返回 1280 (GL_INVALID_ENUM
)。 第二个 glGetError 返回 1285( GL_OUT_OF_MEMORY
)。 我知道它实际上并没有内存不足,因为通常通过glBufferData
上传完全相同的数据可以正常工作。
也许我只是处理错了顶点数组?
(附言。我在游戏开发堆栈交换中问了这个问题,但一无所获。 在这里重新发布以尝试弄清楚)
首先,您的错误检查代码是错误的。您必须在循环中调用glGetError
,直到它返回 GL_NO_ERROR
。
关于GL_OUT_OF_MEMORY
错误代码:它也可能意味着地址空间不足,如果从操作系统请求大量连续的虚拟地址空间,但进程的地址空间非常碎片化,以至于没有可用的块大小(即使可用地址空间的总量就足够了)。
这已成为32位系统的祸根。一个简单的补救措施是使用 64 位系统。如果您坚持使用 32 位平台,则必须对地址空间进行碎片整理(这并非易事)。
如果我是你,我会尝试以下方法:
- 将
GL_STATIC_DRAW
替换为GL_DYNAMIC_DRAW
- 确保
indexSize(indexFormat) * indexCount
产生的尺寸符合您的预期 - 尝试使用
glMapBufferRange
而不是glMapBuffer
,类似于glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, 0, yourBufferSize, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
- 检查
ibo
是否属于GLuint
类型
编辑:fwiw,我会得到一个gDEBugger,并在出现OpenGL错误时设置一个断点来中断。
我解决了这个问题。 我indexSize(header.indexFormat)
传球,而我本应该在header.indexFormat
中通过. 我现在觉得自己像个白痴,很抱歉浪费大家的时间。
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在映射中返回null
- 为什么返回 NULL 不会破坏函数?
- fopen 在 gdb 中返回 NULL
- 为什么要从main()返回NULL?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- Box2D World.GetBodyList() 返回 NULL,但 World 显然正在更新对象
- API 返回智能指针的 std::optional 以明确指定指针可能为 null 是否有意义?
- boost::p ython:PyErr_Fetch始终返回 NULL 回溯
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 如何在C++中返回Null作为引用
- 从模板化函数返回Null对象
- 如何返回值为NULL的变量指针
- Windows 函数"GetCursorInfo"返回成功,但光标的句柄为 NULL
- GDALOpen 在 GEOTiff 文件上返回 null
- 将对象作为 null 返回内容
- QList<float* 类型的 NULL 返回值>
- 在用C++编写的COM客户端中引发异常的Null返回值
- nullptr初始值和WinAPI NULL返回
- DirectX pEnum->Next(1,&pPin,NULL) 返回S_FALSE