3

我正在尝试以几种不同的方式渲染一个简单的四边形。

当所有内容都存储在一个类中时,我可以很容易地做到这一点。但我希望能够在屏幕上渲染多个对象,因此我开始将代码分开并将各种功能放在单独的类中。问题是,当我将渲染功能放在 Entity 类中时,我开始收到错误消息。

这是函数,它是一个 VertexArrayObject 类:

public void render(){
    glBindVertexArray(vaoID);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboiID);

    this.exitOnGLError("Before render");
    glDrawElements(GL_TRIANGLES, indicesCount, GL_UNSIGNED_BYTE, 0);
    this.exitOnGLError("After render");

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glBindVertexArray(0);

    this.exitOnGLError("error rendering vao");
}

同样,我所做的只是将它从主类移到一个管理 VAO 并在理论上呈现它的类。

它给了我错误值 1285,得到错误的错误调用是标记为“渲染后”的错误调用。(exitOnGLError() 是一种错误检查方法)。

错误 1285 显然意味着“内存不足”,这显然是荒谬的,因为我使用的是 1 兆字节的图像文件并且......我无法想象我的四个顶点浮动缓冲区正​​在填满我所有的 VRAM。

还有什么可能导致此错误?

4

4 回答 4

2

为那些从谷歌来到这里的人分享一个可能的答案。

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData( GL_ARRAY_BUFFER , sizeof( 索引 ), &indices[0], GL_STATIC_DRAW );

请注意以粗体显示的复制粘贴错误。这导致了错误 1285 和相当长一段时间的头疼。

于 2014-09-26T09:47:18.690 回答
2

仅供参考,我遇到了同样的错误,这是由于我未能添加对 glBufferData 的调用,这是您实际“发送数据”到 opengl 的地方。

glBufferData(GL_ARRAY_BUFFER, sizeof(GLSL_XYZNDUV_Item)*p->iNum_verts,p->pVerts,GL_STATIC_DRAW);

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*p->iNum_tris*2,p->pIndices, GL_STATIC_DRAW);
于 2014-12-02T17:21:45.123 回答
0

您应该首先验证您以正确的顺序创建所有 OpenGL 类,例如,您应该只在创建 VAO 时绑定 VBO,而不是在渲染它时。

以下是我在我的 VAO 课程中对呼叫进行排序的方式:

    // creation
    array = glGenVertexArrays();
    glBindVertexArray(array);

    vertices = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vertices);
    glBufferData(GL_ARRAY_BUFFER, b, usage);

    for (attributes) {
        glEnableVertexAttribArray(index);
        glVertexAttribPointer(index, dimension, type, false, bytesPerVertex, offset);
    }

    if (indices are used) {
      indices = glGenBuffers();
      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices);
      glBufferData(GL_ELEMENT_ARRAY_BUFFER, buffer, usage);
    }

    // render
    glBindVertexArray(array);
    program.use(); // binds shader program and textures
    if (indices == -1)
        glDrawArrays(mode, 0, size);
    else
        glDrawElements(mode, size, indicesType, 0);
于 2014-01-13T15:58:16.143 回答
-1

在 Android 11 上使用 OpenGL渲染文件时,我遇到了同样的错误.obj(在 Android 9 上运行良好)。OpenGL 中似乎存在一个错误,当文件中的源顶点在没有纹理坐标索引格式.obj的顶点法线索引中定义时() ,它会抛出内存不足错误。为了规避错误,只需在文件中添加一个纹理坐标(例如)并在每个面中引用它(变成)f 113//113 76//76 77//77vt 0.500 1f 113//113 76//76 77//77f 113/1/113 76/1/76 77/1/77

于 2021-09-20T11:32:26.113 回答