无法使用OpenGL创建彩色三角形

时间:2015-04-21 00:49:23

标签: c++ opengl graphics

我跟随open.gl并且我已经进入渲染阶段,但我的三角形没有出现在屏幕上。只有一个黑盒子。

我在Win7上,最新的驱动程序和一切,VS2013。

为了方便起见,我把代码放在这里:

#define GLEW_STATIC

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

using namespace std;


int main() {
    glfwInit();

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr);

    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    glewInit();

    float vertices[] = {
        0.0f, 0.5f,
        0.5f, -0.5f,
        -0.5f, -0.5f
    };

    GLuint vbo;
    glGenBuffers(1, &vbo);

    glBindBuffer(GL_ARRAY_BUFFER, vbo);

    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    const char* vertexShaderCode =
        "#version 150\n"
        "in vec2 position;"
        "void main() {"
        "   gl_Position = vec4(position, 0.0, 1.0);"
        "}";

    const char* fragmentShaderCode =
        "#version 150\n"
        "out vec4 outColor;"
        "void main() {"
        "   outColor = vec4(1.0, 1.0, 1.0, 1.0);"
        "}";

    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderCode, NULL);
    glCompileShader(vertexShader);

    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderCode, NULL);
    glCompileShader(fragmentShader);

    GLuint shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);

    glBindFragDataLocation(shaderProgram, 0, "outColor");

    glLinkProgram(shaderProgram);
    glUseProgram(shaderProgram);

    GLint posAttrib = glGetAttribLocation(shaderProgram, "position");

    glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);

    glEnableVertexAttribArray(posAttrib);

    GLuint vao;
    glGenVertexArrays(1, &vao);

    glBindVertexArray(vao);

    while(!glfwWindowShouldClose(window)) {  
        glfwPollEvents();
        glfwSwapBuffers(window);

        glDrawArrays(GL_TRIANGLES, 0, 3);
    }

    glfwTerminate();
}

2 个答案:

答案 0 :(得分:2)

在指定顶点布局之前绑定VAO

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);

答案 1 :(得分:0)

检查所有glFw命令是否失败。对于调试,请在每个OpenGL命令后检查glGetError。还要确保您的着色器已正确编译,如果没有确保您打印错误消息。

最后,检查视口。