2015-04-21 20 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。還要確保你的着色器編譯正確,如果不確保你打印錯誤信息。

最後,檢查視口。