gpt4 book ai didi

c++ - OpenGL 第一个立方体渲染不工作

转载 作者:行者123 更新时间:2023-11-30 03:25:21 26 4
gpt4 key购买 nike

我已经为我的立方体设置了所有顶点和索引,我的 GLFW 和 GLEW 每次运行都完美地初始化,我的着色器编译和运行得很好。每当我尝试将立方体的顶点乘以解析到着色器中的矩阵时,每次运行应用程序时我都看不到任何东西。我尝试了透视投影和正交投影,但似乎没有任何效果。这是我的代码片段。 glCall 也只是一个用于调试 OpenGL 调用的定义。

while (!glfwWindowShouldClose(window)) 
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glm::mat4 model = glm::mat4();
glm::mat4 view = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, -3.0f));
//glm::mat4 proj = glm::ortho(-8.0f, 8.0f, -6.0f, 6.0f);
glm::mat4 proj = glm::perspective(glm::radians(45.0f), 800.0f/600.0f, 1.0f, 100.0f);
glUniformMatrix4fv(glGetUniformLocation(shader, "proj"), 1, GL_FALSE, &proj[0][0]);
glUniformMatrix4fv(glGetUniformLocation(shader, "view"), 1, GL_FALSE, &view[0][0]);
glUniformMatrix4fv(glGetUniformLocation(shader, "model"), 1, GL_FALSE, &model[0][0]);

glCall(glUseProgram(shader));
glCall(glBindVertexArray(cube.VAO));
glCall(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cube.IBO));
glCall(glDrawElements(GL_TRIANGLES, cube.indexCount, GL_UNSIGNED_INT, 0));

glfwSwapBuffers(window);
glfwPollEvents();
}

这也是我的着色器代码:

#SHADER vertex
#version 430

layout(location = 0) in vec3 position;

uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;

void main()
{
gl_Position = proj * view * model * vec4(position, 1.0f);
}

#SHADER fragment
#version 430

layout(location = 0) out vec4 color;
uniform vec4 colour;

void main()
{
color = vec4(vec3(1.0, 0.5, 0.31) * vec3(1.0, 1.0, 1.0), 1.0);
}

这些是我在需要时使用的立方体顶点和索引:

GLfloat vertices[24] = {
// 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
};
GLint indices[36] = {
// front
0, 1, 2,
2, 3, 0,
// top
1, 5, 6,
6, 2, 1,
// back
7, 6, 5,
5, 4, 7,
// bottom
4, 0, 3,
3, 7, 4,
// left
4, 5, 1,
1, 0, 4,
// right
3, 2, 6,
6, 7, 3
};

除非我只将着色器中的位置乘以正交投影矩阵而不乘以其他任何东西,否则我总是无法在屏幕上显示任何内容。我已经设置了 ViewPort 和 Enabled Depth Buffering,但没有其他设置。还有什么我需要启用、禁用或修改的吗,因为我很困惑为什么在我的投影剔除中什么都不会呈现。

最佳答案

glUniform*当前程序对象

指定统一变量的值

这意味着 glUseProgram 必须在 glUniformMatrix4fv 之前完成:

GLint locPrj = glGetUniformLocation( shader, "proj" );
GLint locView = glGetUniformLocation( shader, "view" );
GLint locModel = glGetUniformLocation( shader, "model" );

.....

glUseProgram(shader);

glUniformMatrix4fv(locPrj, 1, GL_FALSE, &proj[0][0]);
glUniformMatrix4fv(locView, 1, GL_FALSE, &view[0][0]);
glUniformMatrix4fv(locModel, 1, GL_FALSE, &model[0][0]);


要设置单位矩阵,您应该使用 glm::mat4(1.0f);

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


此外,我建议使用 glm::lookAt , 用于设置 View 矩阵。尝试类似的东西:

 glm::mat4 view = glm::lookAt( 
glm::vec3( 2.0f, -5.0f, 2.0f ),
glm::vec3( 0.0f, 0.0f, 0.0f ),
glm::vec3( 0.0f, 0.0f, 1.0f ) );

关于c++ - OpenGL 第一个立方体渲染不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49044154/

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