返回

用EBO绘制三维立方体的C++ OpenGL

发布时间:2022-02-22 13:33:44 522

我正在尝试使用EBO、VAO和VBO用OPENGL绘制一个立方体。

第一个函数初始化立方体的VAO

initVAO()
{
    GLfloat cube_vertices[] = {
        // front
        -1.0, -1.0,  1.0,
         1.0, -1.0,  1.0,
         1.0,  1.0,  1.0,
        -1.0,  1.0,  1.0,
        // back
        -1.0, -1.0, -1.0,
         1.0, -1.0, -1.0,
         1.0,  1.0, -1.0,
        -1.0,  1.0, -1.0
    };
    GLushort cube_elements[] = {
        // front
        0, 1, 2,
        2, 3, 0,
        // right
        1, 5, 6,
        6, 2, 1,
        // back
        7, 6, 5,
        5, 4, 7,
        // left
        4, 0, 3,
        3, 7, 4,
        // bottom
        4, 5, 1,
        1, 0, 4,
        // top
        3, 2, 6,
        6, 7, 3
    };

    vertices.insert(vertices.begin(), std::begin(cube_vertices), std::end(cube_vertices));
    indices.insert(indices.begin(), std::begin(cube_elements), std::end(cube_elements));

    /* create vao */
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);

    /* create ebo */
    glGenBuffers(1, &EBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_elements), cube_elements, GL_STATIC_DRAW);

    /* create vbo */
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(cube_vertices), cube_vertices, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);

    /* unbind buffers */
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    glBindVertexArray(0);
    
}

第二个函数用它来画画

draw()
{

    shader->activateShader();

    /* calculate projection matrix */
    //TODO:: find a new place for the projection matrix calculation
    int width = (GLfloat)ResourceManager::getInstance()->getWindowSize().x;
    int height = (GLfloat)ResourceManager::getInstance()->getWindowSize().y;
    glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)width / height, 0.1f, 100.0f);

    /* update shader uniforms*/
    glUniformMatrix4fv(shader->projectionUniform, 1, GL_FALSE, glm::value_ptr(proj));
    glUniformMatrix4fv(shader->viewUniform, 1, GL_FALSE, glm::value_ptr(Engine::getInstance()->camera->createViewMatrix()));
    glUniformMatrix4fv(shader->modelUniform, 1, GL_FALSE, glm::value_ptr(transform->createModleMatrix()));

    glUniform4f(shader->colorUniform, color.x, color.y, color.z, 1);

    glBindVertexArray(VAO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);

    glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
    glUseProgram(0);

}

现在这个程序没有画任何东西,我也不知道它到底出了什么问题

我知道代码的其他部分是有效的,因为我在没有EBO的情况下对它进行了测试,它也起了作用,但我不知道该怎么做。

谢谢你的帮助

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(1)
按点赞数排序
用户头像
相关帖子
下一篇
c#-对每个操作调用的公共函数 2022-02-22 12:45:43