2017-02-28 81 views
0

我有我的OpenGL - 你好三角演示在这里,但我不能让它的工作。有人知道问题出在哪里吗?我能够编译和运行代码,但三角形不显示。它只打开带有灰色背景的窗口。OpenGL - 你好三角没有出现

#include <glew/glew.h> 
#include <glfw/glfw3.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main() { 

    if (!glfwInit()) { 
     fprintf(stderr, "Failed to initialize GLFW\n"); 
     return -1; 
    } 

    GLFWwindow* window = glfwCreateWindow(800, 800, "Anton Tutorials - Hello Triangle", NULL, NULL); 
    if (window == NULL) { 
     fprintf(stderr, "Failed to open GLFW window.\n"); 
     glfwTerminate(); 
     return -1; 
    } 
    glfwMakeContextCurrent(window); 

    glewExperimental = GL_TRUE; // Needed in core profile 
    const GLenum err = glewInit(); 

    if (err != GLEW_OK) { 
     fprintf(stderr, "Failed to initialize GLEW\n"); 
     fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); 
     return -1; 
    } 

    // Enable depth-testing 
    glEnable(GL_DEPTH_TEST); 
    // Depth-testing interprets a smaller value as "closer" 
    glDepthFunc(GL_LESS); 

    //Defining vertices for triangle       
    GLfloat points[] = { 
     0.0f, 0.5f, 0.0f, 
     0.5f, -0.5f, 0.0f, 
     -0.5f, -0.5f, 0.0f 
    }; 

    //Vertex buffer object creation 
    GLuint vbo = 0; 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW); 

    //Vertex attribute object creation 
    GLuint vao = 0; 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 
    glDisableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); 

    //Loading shaders - Vertex shader 
    const char* vertex_shader = 
     "#version 410\n" 
     "in vec3 vp; " 
     "void main() {" 
     " gl_Position = vec4 (vp, 1.0);" 
     " }"; 

    GLuint vs = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vs, 1, &vertex_shader, NULL); 
    glCompileShader(vs); 

    //Loading shaders - Fragment shader 
    const char* fragment_shader = 
     "#version 410\n" 
     "out vec4 frag_colour; " 
     "void main() {" 
     " frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);" 
     " }"; 

    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fs, 1, &fragment_shader, NULL); 
    glCompileShader(fs); 

    //Attach shaders 
    GLuint shader_programme = glCreateProgram(); 
    glAttachShader(shader_programme, fs); 
    glAttachShader(shader_programme, vs); 
    glLinkProgram(shader_programme); 

    //RenderLoop 
    while (!glfwWindowShouldClose(window)) 
    { 
     glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glUseProgram(shader_programme); 
     glBindVertexArray(vao); 

     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glfwPollEvents(); 
     glfwSwapBuffers(window); 
    } 

    glfwTerminate(); 
    return 0; 
} 
+2

'glBufferData(GL_ARRAY_BUFFER,sizeof(points)...'第二个参数不是数组的大小y,但是字节数。使用'9 * sizeof(float)' – Ripi2

回答

0

您需要启用'vp'属性。

在你的代码前面,你这样说:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); 

如果你的副总裁着色器变量的变化的布局位置,这可能现在不再有效。

这将是更好地做到这一点:

GLint vpAttr = glGetAttribLocation(shader_programme, "vp"); 
glVertexAttribPointer(vpAttr, 3, GL_FLOAT, GL_FALSE, 0, NULL); 

然后启用属性:

glEnableVertexAttribArray(vpAttr); 

否则,你应该明确地设置在顶点着色器VP的布局位置,这样你就可以理直气壮使用0:

"layout (location=0) in vec3 vp;"