Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl glMapBuffer()的GLU枚举无效_Opengl - Fatal编程技术网

Opengl glMapBuffer()的GLU枚举无效

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

我对OpenGL完全陌生,所以我想我可能在这里做了一些愚蠢的事情。基本上,我只是尝试内存映射我创建的缓冲区对象,但是
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教程。谢谢你把它们放在一起)。