OpenGL 程序不渲染

OpenGL Program Does Not Render

我有一个 Mac 运行 OS X Yosemite 使用 GLFW 3 和 OpenGL 4.1。我有这个程序:

#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/string_cast.hpp>
#include <stdio.h>

#include "myglutils.hpp"

int main() {
    if (!setupGLFW()) return 1;
    setupApple();

    GLFWwindow* window = glfwCreateWindow(640, 480, "Perspective", 0, NULL);
    if (!window) {
        fprintf(stderr, "Failed to create window.\n");
        glfwTerminate();
        return 0;
    }

    glfwMakeContextCurrent(window);

    if (!setupGLEW()) return 1;

    glClearColor(0.2, 0.0, 0.8, 1.0);

    const GLfloat vertices[] = {
        -1.0, -1.0,
         1.0, -1.0,
         0.0,  1.0
    };

    const GLchar* vert_shader =
    "#version 410 core\n"
    "in vec2 pos;"
    "uniform mat4 MVP;"
    "void main() {"
    "    gl_Position = MVP * vec4(pos, 0.0, 1.0);"
    "}";

    const GLchar* frag_shader =
    "#version 410 core\n"
    "out vec4 color;"
    "void main() {"
    "    color = vec4(1.0, 0.0, 0.0, 1.0);"
    "}";

    GLuint shader = getShader(vert_shader, frag_shader);

    GLuint vbo;
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(GLfloat), vertices, GL_STATIC_DRAW);

    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);

    GLuint MVPID = glGetUniformLocation(shader, "MVP");

    glm::mat4 perspective = glm::perspective(45.0, 4.0 / 3.0, 0.1, 100.0);
    glm::mat4 view = glm::lookAt(glm::vec3(4.0, 3.0, 3.0), glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0));
    glm::mat4 MVP = perspective * view;

    while (!glfwWindowShouldClose(window) && glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS) {
        glClear(GL_COLOR_BUFFER_BIT);
        glUseProgram(shader);
        glUniformMatrix4fv(MVPID, 1, GL_FALSE, &MVP[0][0]);
        glBindVertexArray(vao);
        glDrawArrays(GL_TRIANGLES, 0, 6);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glDeleteVertexArrays(1, &vao);
    glDeleteProgram(shader);
    glfwTerminate();

    return 0;
}

函数 setupGLFW()setupApple()setupGLEW() 不是问题所在。 getShader() 也不是。我觉得我的错误很愚蠢,比如忘记了一个简单的 OpenGL 函数调用。我想要做的是以 3D 角度绘制一个三角形。

注意:该程序编译完美,但只显示空蓝屏。

此代码中存在许多问题。最主要的是你从不启用顶点属性数组。您需要在设置代码中添加 glEnableVertexAttribArray() 调用:

glBindVertexArray(vao);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);

此外,glDrawArrays() 的参数不正确:

glDrawArrays(GL_TRIANGLES, 0, 6);

第三个参数是顶点数。因为你只有 3 个顶点,所以它应该是:

glDrawArrays(GL_TRIANGLES, 0, 3);

此外,除非在代码中解决了这一点,而您没有 post,否则您需要确保您使用的属性位置与程序匹配。您在代码中使用 0,但您不能指望位置为零而不采取任何进一步操作。解决此问题的最简单方法是在着色器代码中使用 location 布局限定符:

"layout(location=0) in vec2 pos;"

这会将位置设置为 0,与您的代码匹配。