2016-08-31 12 views
1

私はsuperbible第6版からOpenGLを学んでいて、私は本の中の次のコードから三角形を描くことはできません。OpenGL-三角形が表示されていませんか?

#include <iostream> 
#include "externalErrorFix.h" 
#include "sb6.h" 


GLuint compile_shaders(void) 
{ 
    GLuint vertex_shader; 
    GLuint fragment_shader; 
    GLuint program; 

    //GLSL shader sources 
    static const GLchar *vertex_shader_source[] = 
    { 
     "#version 430 core             \n" 
     "                 \n" 
     "void main(void)             \n" 
     "{                 \n" 
     " const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0), \n" 
     "         vec4(-0.25, -0.25, 0.5, 1.0), \n" 
     "         vec4(0.25, 0.25, 0.5, 1.0)); \n" 
     "                 \n" 
     " gl_postion = vertices[gl_VertexID];        \n" 
     "}                 \n" 
    }; 
    static const GLchar *fragment_shader_source[] = 
    { 
     "#version 430 core        \n" 
     "            \n" 
     "out vec4 color;        \n" 
     "void main(void)        \n" 
     "{            \n" 
     " color = vec4(0.0, 1.0, 0.0, 1.0);   \n" 
     "}            \n" 
    }; 

    //create and compile vertex shaders 
    vertex_shader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vertex_shader, 1, vertex_shader_source, NULL); 
    glCompileShader(vertex_shader); 

    //create and compile fragment shader 
    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fragment_shader, 1, fragment_shader_source, NULL); 
    glCompileShader(fragment_shader); 

    //create a program attach shaders and link it 
    program = glCreateProgram(); 
    glAttachShader(program, vertex_shader); 
    glAttachShader(program, fragment_shader); 
    glLinkProgram(program); 

    glDeleteShader(vertex_shader); 
    glDeleteShader(fragment_shader); 

    return program; 
} 


class my_application : public sb6::application 
{ 

private: 
    GLuint render_program; 
    GLuint vertex_array_object; 

public: 

    void startup() 
    { 
     render_program = compile_shaders(); 
     glGenVertexArrays(1, &vertex_array_object); 
     glBindVertexArray(vertex_array_object); 
    } 
    void shutdown() 
    { 
     glDeleteVertexArrays(1, &vertex_array_object); 
     glDeleteProgram(render_program); 
     glDeleteVertexArrays(1, &vertex_array_object); 
    } 
    void render(double currentTime) 
    { 
     const GLfloat color[] = { 0.0f,0.2f,0.0f,1.0f }; 
     glClearBufferfv(GL_COLOR, 0, color); 

     glUseProgram(render_program); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 
     //glPointSize(10.0f); 
    } 

    /* 
    // First program 
    void render(double currentTime) 
    { 
     const GLfloat color[] = { 
            (float)sin(currentTime) * 0.5f + 0.5f, 
            (float)cos(currentTime) * 0.5f + 0.5f, 
            0.0f,1.0f 
           }; 

     glClearBufferfv(GL_COLOR, 0, color); 
    }*/ 
}; 
DECLARE_MAIN(my_application); 
+0

まず、OpenGLコードのエラーチェック方法を学ぶ必要があります。 Ghislainがあなたに指摘していることは、コンパイルログがより迅速かつ完全にあなたに伝えることができることです。 OpenGLがエラーを報告していない場合にのみ、他の人に助けを求める必要があります。 シェイダーのコンパイルログを取得する方法については、こちらをご覧ください(https://www.opengl.org/wiki/Shader_Compilation)。 –

答えて

0

は、タイプミスのカップルがあるようです:gl_Position

  • out vec4 colorの代わりに

    • gl_postion不足しているセミコロンout vec4 color;
    • glDeleteVertexArrays(1, &vertex_array_object);は、シャットダウン機能に2回出現してい

    さらに鉱石、init()関数がクラスmy_applicationに存在しません。特にsb6::application::init()を呼び出す必要があります。

    まだ助けがなければ、その本はすべてのサンプルがあるリポジトリを維持していると思われます。hereたぶん彼らはそこにあるすべてのものを修正したでしょう。

  • +0

    いいえ、何も変わりません。 –

    +0

    2番目のシェーダ(セミコロンがありません)に別のタイプミスがあります。 –

    +0

    が両方とも修正されていますが、まだ助けにはなりません。 –

    関連する問題