用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的情况下对它进行了测试,它也起了作用,但我不知道该怎么做。
谢谢你的帮助
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报