gpt4 book ai didi

c++ - 立方体 OPENGL 上缺少面

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:49 25 4
gpt4 key购买 nike

as you can see the cube has missing faces

我尝试了一切,我知道我的程序正在绘制正确的顶点,我基本上将它指向索引,这是主循环

void mainLoop() {

while (!glfwWindowShouldClose(window)) {

glfwSwapBuffers(window);
glEnable(GL_DEPTH_TEST);
glClearColor(0.1, 0.1, 0.3, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glfwPollEvents();
glFrontFace(GL_CW);
glDisable(GL_CULL_FACE);

glfwGetFramebufferSize(window, &WIDTH, &HEIGHT);
glViewport(1, 1, WIDTH, HEIGHT);

glm::mat4 view = glm::lookAt(
glm::vec3(1.2f, 1.2f, 1.2f),
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 0.0f, 1.0f)
);


glm::mat4 projectionmatrix = glm::perspective(glm::radians(45.0f), 800.0f / 800.0f, 1.0f, 10.0f);

glm::mat4 identitymatrix = glm::mat4(1.0f);

glm::mat4 modelmatrix = identitymatrix;

MVPmatrix = projectionmatrix * view * modelmatrix;

GLint loc = glGetUniformLocation(SHADERPROGRAM, "MVPmatrix");
glUniformMatrix4fv(loc, 1, GL_FALSE, &MVPmatrix[0][0]);

short vertex_index[] = { 2U, 4U, 1U, 8U, 6U, 5U, 5U, 2U, 1U, 6U, 3U, 2U, 3U, 8U, 4U, 1U, 8U, 5U, 2U, 3U, 4U, 8U, 7U, 6U, 5U, 6U, 2U, 6U, 7U, 3U, 3U, 7U, 8U, 1U, 4U, 8U };


glEnableVertexAttribArray(0);

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



glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertex_index) * sizeof(unsigned short), &vertex_index[0], GL_STATIC_DRAW);


glBufferData(GL_ARRAY_BUFFER, temp_vertices.size() * sizeof(glm::vec3), &temp_vertices[0], GL_STATIC_DRAW);

glUseProgram(SHADERPROGRAM);
glDrawElements(GL_TRIANGLES, sizeof(vertex_index) , GL_UNSIGNED_SHORT, (void*)0);


}

}

我现在真的不知道,我已经尝试了很长时间。索引直接来自 obj 文件,顶点也是如此。我也尝试关闭剔除但没有成功,我也尝试添加手动索引量甚至试图抵消它们。

为立方体导入顶点工作得很好,但是当我尝试制作索引立方体时,哎呀。

最佳答案

我在您的代码中发现了 2 个问题:

1.) 元素索引从 0 而不是 1 开始。

要么递减vertex_index中的所有顶点索引数组或在 temp_vertices 的开头添加一个“虚拟”顶点坐标, 解决问题。

2.) 第二个参数或 glDrawElements 是索引的数量而不是索引缓冲区的大小(以字节为单位):

glDrawElements(GL_TRIANGLES, sizeof(vertex_index), GL_UNSIGNED_SHORT, (void*)0);
glDrawElements(GL_TRIANGLES, sizeof(vertex_index)/sizeof(short), GL_UNSIGNED_SHORT, (void*)0);

但我建议将索引放在 std::vector<short> 中并使用 std::vector::size() .


进一步使用WIDTHHEIGHT设置投影矩阵时,用于计算视口(viewport)的纵横比。

除此之外,您的代码工作正常。我使用了以下投影和 View 矩阵

glm::mat4 view = glm::lookAt(
glm::vec3(2.0f, 2.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f));
glm::mat4 projectionmatrix = glm::perspective(
glm::radians(90.0f), (float)WIDTH / (float)HEIGHT, 0.1f, 10.0f);

glPolygonMode

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

生成如下图

关于c++ - 立方体 OPENGL 上缺少面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54491216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com