首页 文章

为什么glDrawElements会给我GL_OUT_OF_MEMORY? [关闭]

提问于
浏览
2

我'm only drawing 4 vertices. I' m尝试使用 glDrawElements 渲染一个简单的四边形,但似乎没有任何效果 . 我也用Java编写了相同的代码,但它确实有效 . 然而,这不是 .

这是绘图代码:

glUseProgram(mProgram);


glBindBuffer(GL_ARRAY_BUFFER, mBuffers[0]);
glEnableVertexAttribArray(mPosAttr);
glVertexAttribPointer(mPosAttr, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mBuffers[1]);
if (er == 0){ er = glGetError(); std::cout<<gluErrorString(er)<<std::endl; }
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (void*)0);


glDisableVertexAttribArray(mPosAttr);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glUseProgram(0);

我遗漏了像 glUniform__ 这样无用的东西,我得到了同样的结果 . 无论如何,这是第一次打印"no error"然后是第二次打印"out of memory" . 这意味着它绝对是由glDrawElements引起的 .

为什么会这样?什么能解决它?我应该提供更多代码吗?

1 回答

  • 2

    OP在评论中表示:

    正如我所说,我绝对确定它来自glDrawElements .

    但是在给定的源代码中

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mBuffers[1]);
    if (er == 0){ er = glGetError(); std::cout<<gluErrorString(er)<<std::endl; }
    glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (void*)0);
    

    执行错误检查 before glDrawElements . 错误检查代码也是错误的 . 正确的方法是:

    while( (er = glGetError()) != GL_NO_ERROR ){ std::cerr << gluErrorString(er) << std::endl; }
    

    如前所述,错误累积,必须在这样的循环中查询到耗尽 .

    为什么会发生这种错误,如果不了解更多关于程序的信息就无法分辨:如何创建上下文,扩展是否正确初始化,类似于 . 理想情况下,一个人拥有完整的源代码,或者一个最小的(非)工作可编译的例子 .

相关问题