2015-04-21 21 views
0

我跟着open.gl,我已经到了渲染阶段,但是我的三角形没有出现在屏幕上。只有一个黑匣子。无法用OpenGL创建彩色三角形

我在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

绑定VAO 您指定的顶点布局前:

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

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

非常感谢!该教程没有提到这一点。 –

0

检查所有GLFW失败的命令。对于每个OpenGL命令之后的调试,请检查glGetError。还要确保你的着色器编译正确,如果不确保你打印错误信息。

最后,检查视口。