GL_INVALID_ENUM与glMapBuffer()

时间:2016-11-29 03:44:43

标签: opengl

我对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肯定列为可用。

我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

如果它对其他人有帮助,我有多个问题:

  • glGetError()返回错误队列中的第一个值。我认为我得到的GL_INVALID_ENUM实际上来自之前(无关)的电话。
  • this threadglGenBuffers()分配一个新的缓冲区名称,但缓冲区实际上不是创建,直到它使用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);