c++ - 为什么 glDrawElements 给我 GL_OUT_OF_MEMORY?

标签 c++ opengl glsl

<分区>

我只绘制了 4 个顶点。我正在尝试使用 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__ 调用,无论哪种方式,我都会得到相同的结果。无论如何,这第一次打印“无错误”,然后第二次打印“内存不足”。这意味着它绝对是由 glDrawElements 引起的。

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

最佳答案

OP 在评论中指出:

As I stated, I made absolutely sure it is coming from 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);

错误检查在之前 glDrawElements 执行。错误检查代码也是错误的。正确的方法是:

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

如前所述,错误会累积,并且必须在这样的循环中查询到穷尽。

如果不了解程序的更多信息,就无法判断为什么会发生此错误:上下文是如何创建的,扩展是否已正确初始化,诸如.理想情况下,一个人拥有完整的源代码,或者一个最小的(不是)工作的可编译示例。

关于c++ - 为什么 glDrawElements 给我 GL_OUT_OF_MEMORY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7857527/

相关文章:

opengl - 使用 GLSL 着色器时聚光灯效果无法正常工作

matrix - 将权重应用于矩阵和顶点(骨骼旋转)

c++ - 这是制作单例类的正确程序吗?

c++ - 对c++构造函数删除感到困惑

cocoa - 如何从 OpenGL 纹理创建 CVOpenGLTextureRef

c++ - glDisable(GL_COLOR_MATERIAL) 无法正常工作

c++ - 从二叉树中删除一个节点

c++ - 将文本文件读入二维数组 C++

opengl - 如何将常量数据发送到着色器?

c++ - GLSL - 对象在乘以矩阵时消失