OpenGL第一个立方体渲染不起作用

Posted

技术标签:

【中文标题】OpenGL第一个立方体渲染不起作用【英文标题】:OpenGL First Cube Render Not Working 【发布时间】:2018-03-01 06:55:27 【问题描述】:

我已经为我的立方体设置了所有顶点和索引,我的 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);

如果需要,这些是我使用的立方体 vetices 和索引:

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 并启用了深度缓冲,但没有别的。还有什么我需要启用、禁用或修改的吗,因为我很困惑为什么在我的投影的剔除中什么都不会渲染。

【问题讨论】:

一目了然,立方体实际上在相机的视野中吗? :) 如果您将 -3 转换为 Z 轴并且立方体是从 -1 到 1,并且您以错误的方式“查看”,您应该看不到它。 【参考方案1】:

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 来设置视图矩阵。尝试类似:

 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 ) );

【讨论】:

感谢您的帮助,我还意识到,每次我在 CPU 上通过设置 model = glm::mat4() (我将其更改为 glm:: mat4(1)) 这导致了为什么在 GPU 上没有渲染任何东西,在我来 *** 寻求帮助之前,我尝试使用 glUseProgram 对我的代码进行投影和排序等每次迭代。感谢您的帮助!

以上是关于OpenGL第一个立方体渲染不起作用的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 深度测试不起作用

OpenGL累积缓冲区不起作用

OpenGL 渲染在 Linux 机器上不起作用(Windows 渲染)---可能与 cmake 脚本有关(参见更新)

使用 openGL ES 2.0 结合其他线条绘制功能的字体渲染(Freetype)不起作用

我的 opengl 代码应该显示多个立方体,但只显示一个正方形

颜色在开始示例opengl中不起作用