2017-02-28 7 views
0

ここにOpenGL - Hello Triangleデモがありますが、動作しません。誰が問題がどこにあるのか知っていますか?私はコンパイルとコードを実行することができますが、三角形は表示されません。グレーの背景を持つウィンドウのみを開きます。OpenGL - Hello triangleが表示されない

#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)...'第2引数はarraのサイズではありませんyが、バイト数です。 '9 * sizeof(float)'を使う – Ripi2

答えて

0

「vp」属性を有効にする必要があります。

以前のコードで、あなたがこれを言う:

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

あなたのVPシェーダ変数の変更の配置場所であれば、これは今、もはや有効であるかもしれません。

これを行う方が良いでしょう。そして、属性有効

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;" 
関連する問題