OpenGL - VAO、VBO、IBO、glDrawElements未显示

6

我在将我的游戏关卡数据显示到屏幕上时遇到了麻烦。我的着色器已经成功地渲染了一个立方体,但是没有显示游戏关卡。

下面是我设置顶点缓冲对象(VBO)、顶点数组对象(VAO)和索引缓冲对象(IBO)的代码:

void ZoneMesh::buildData()
{
    // Create the VBO for this mesh
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // Create the IBO
    glGenBuffers(1, &ibo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, numPoly * 3 * sizeof(short), indices, GL_STATIC_DRAW);

    // Create the VAO
    glGenVertexArraysAPPLE(1, &vao);
    glBindVertexArrayAPPLE(vao);

    // Bind the VBO to the buffer and set up the attributes
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(0));
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float)*3));
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(float)*5));

    //Bind the IBO to the VAO
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
}

这是我的顶点结构:

struct Vertex
{
    float x;
    float y;
    float z;
    float u;
    float v;
    float normX;
    float normY;
    float normZ;
};

以下是ZoneMesh类中相关的数据项:

Vertex* vertices;
short* indices;

GLuint vbo;
GLuint vao;
GLuint ibo;

顶点着色器:

#version 120

attribute vec3 position;

uniform mat4 camera;

void main()
{
    gl_Position = camera * vec4(position, 1.0f);
}

片元着色器:

#version 120

void main(void)
{
    gl_FragColor = vec4(0.0, 0.6, 0.7, 1.0);
}

渲染:

    shader.Use();

    // Testing - render the first 50 meshes
    for(int i = 0; i < 50; i++)
    {

        glUniformMatrix4fv(shader("camera"), 1, GL_FALSE, glm::value_ptr(MVPMatrix));

        glEnableVertexAttribArray(shader["position"]);
        glBindVertexArrayAPPLE(zone.getVAO(i));
        glDrawElements(GL_TRIANGLES, 500, GL_UNSIGNED_SHORT, NULL);

    }

    shader.UnUse();

渲染/着色器使用并不是问题。 MVPMatrix是正确的。 我有一个立方体在其上正确地渲染。 但该区域未呈现。


一切看起来都很好,只是我对VAO有些疑问。尝试使用一个VAO来代替所有区域,并在每次DrawElements之前手动重新绑定+vertexattribpointer VBO和IBO。 - Calvin1602
你是否在使用英特尔GPU?我遇到了类似的问题 https://dev59.com/hmox5IYBdhLWcg3wyHPc. - the swine
2个回答

3

GL_LINE 不是 glDrawElements 的有效原始,您应该使用 GL_LINES

在您的代码中使用 glGetError() 来查找这些问题!


GL_LINE是我在调试过程中添加的内容。非常抱歉。它目前已更改为GL_TRIANGLES,但仍未呈现。 - Satchmo Brown

0

我曾经遇到过同样的问题...看看这里:什么是glBindVertexArrays的作用...按照步骤进行所有的Gen/Bind/Data操作就可以解决问题。此外,它还解决了由几个版本的OpenGL引入的各种方言之间的混淆问题...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接