OpenGL程序无法渲染

时间:2015-09-25 01:49:19

标签: c++ opengl 3d glsl glfw

我有一台运行OS X Yosemite的Mac,带有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()也不是。RewriteBase / RewriteRule ^subfolder/(.*) http://library.provider.com/$1 [NC,P] 。我觉得我的错误就像忘记一个简单的OpenGL函数调用一样愚蠢。我想要做的是以3D角度画一个三角形。

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

1 个答案:

答案 0 :(得分:3)

此代码中存在许多问题。主要的一点是你从不启用顶点属性数组。您需要在设置代码中添加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);

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

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

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