Opengl glMapBuffer()的GLU枚举无效
我对OpenGL完全陌生,所以我想我可能在这里做了一些愚蠢的事情。基本上,我只是尝试内存映射我创建的缓冲区对象,但是Opengl glMapBuffer()的GLU枚举无效,opengl,Opengl,我对OpenGL完全陌生,所以我想我可能在这里做了一些愚蠢的事情。基本上,我只是尝试内存映射我创建的缓冲区对象,但是glMapBuffer()返回NULL,并给出一个错误代码GL\u INVALID\u ENUM。以下是失败的相关代码: glGenVertexArrays(1, &m_vao); glBindVertexArray(m_vao); glGenBuffers(1, &m_vertex_buffer); glNamedBufferStorage(m_vertex_b
glMapBuffer()
返回NULL
,并给出一个错误代码GL\u INVALID\u ENUM
。以下是失败的相关代码:
glGenVertexArrays(1, &m_vao);
glBindVertexArray(m_vao);
glGenBuffers(1, &m_vertex_buffer);
glNamedBufferStorage(m_vertex_buffer,
BUFFER_SIZE,
NULL,
GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_DYNAMIC_STORAGE_BIT);
glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer);
void* vertex_buffer = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_ONLY);
if (!vertex_buffer)
{
GLenum error = glGetError();
fprintf(stderr, "Buffer map failed! %d (%s)\n", error, gluErrorString(error));
return;
}
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0);
这是印刷:
Buffer map failed! 1280 (invalid enumerant)
根据,如果目标不是可用的目标枚举之一,则返回该错误。这就是说,GL\u ARRAY\u BUFFER
肯定是可用的
我只是做错了什么吗?如果这对其他人有帮助,我有多个问题:
返回错误队列中的第一个值。我以为我得到的glGetError()
实际上来自上一个(不相关的)调用GL\u INVALID\u ENUM
- 根据,
分配一个新的缓冲区名称,但在使用glGenBuffers()
将缓冲区绑定到上下文之前,缓冲区实际上不会创建。相反,我立即调用了glBindBuffer()
,这导致了glNamedBufferStorage()
GL\u INVALID\u操作,因为缓冲区实际上还不存在。因此,在使用DSA时,基本上我应该始终使用
而不是glCreate*()
glGen*()
- 我相信
用于不可变的缓冲区,glNamedBufferStorage()
用于您可以修改的缓冲区,尽管从文档中我不完全清楚这一点。无论如何,我现在使用的是glNamedBufferData()
glNamedBufferData()
glCreateBuffers(1, &m_vertex_buffer);
glNamedBufferData(m_vertex_buffer, BUFFER_SIZE, NULL, GL_DYNAMIC_DRAW);
void* vertex_buffer_ptr = glMapNamedBuffer(m_vertex_buffer, GL_WRITE_ONLY);
“我只是做错了什么吗?”你的意思是,除了不使用DSA函数映射缓冲区之外?您已经在使用
glNamedBufferStorage
;为什么不把它也映射到DSA上?@Nicolas,我也尝试过使用glNamedBufferStorage,但遇到了同样的问题(除了错误代码是GL_INVALID_OPERATION)。我又回到了旧版本,因为我的司机可能会更好地支持它。不走运。^我是说glMapNamedBuffer,对不起。太晚了,无法编辑评论。(顺便说一句,我刚刚看到了你的个人资料——实际上我一直在阅读你的OpenGL教程。谢谢你把它们放在一起)。