【问题标题】:OpenGL - VAO, VBO, IBO, glDrawElements not displayingOpenGL - VAO、VBO、IBO、glDrawElements 不显示
【发布时间】:2012-07-24 14:39:21
【问题描述】:

我无法让我的关卡数据显示在屏幕上。我正在使用我的着色器来正确渲染立方体,但不能正确渲染关卡。

这是我的 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();

渲染/着色器的使用不是问题。 MVP 矩阵是正确的。我在其上方正确渲染了一个立方体。但是该区域不会渲染。

【问题讨论】:

  • 一切看起来都很干净整洁。我只对VAO有疑问。尝试对所有区域使用一个,并在每个 DrawElements 之前手动重新绑定+顶点属性指针 VBO 和 IBO。
  • 您是否在英特尔 GPU 上运行?我有一个类似的问题stackoverflow.com/questions/8973690/…

标签: c++ opengl vbo


【解决方案1】:

GL_LINE 不是glDrawElements 的有效原语,您需要GL_LINES

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

【讨论】:

  • GL_LINE 是我在调试过程中放置​​的。我很抱歉。它目前处于 GL_TRIANGLES 上,但仍未呈现。
【解决方案2】:

我遇到了同样的问题...看看那里:what is the role of glbindvertexarrays... 逐步完成所有 Gen/Bind/Data 使其工作。更进一步,解决了OpenGL几个版本引入的各种方言之间的混淆...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多