我对OpenGL来说是全新的,所以我想我可能在这里做了一些愚蠢的事情。基本上我只是尝试对我已创建的缓冲区对象进行内存映射,但glMapBuffer()
正在返回NULL
并提供错误代码GL_INVALID_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)
根据the docs,如果目标不是可用的目标枚举之一,则会返回该错误。也就是说,GL_ARRAY_BUFFER
肯定列为可用。
我在这里做错了吗?
答案 0 :(得分:0)
如果它对其他人有帮助,我有多个问题:
glGetError()
返回错误队列中的第一个值。我认为我得到的GL_INVALID_ENUM
实际上来自之前(无关)的电话。glGenBuffers()
分配一个新的缓冲区名称,但缓冲区实际上不是创建,直到它使用glBindBuffer()
绑定到上下文。我现在立即调用glNamedBufferStorage()
,这导致GL_INVALID_OPERATION
,因为缓冲区实际上还没有存在。因此,在使用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);