2016-08-31 2 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이 오류를보고하지 않을 때만 다른 사람에게 도움을 요청해야합니다. 셰이더 컴파일 로그를 가져 오는 방법에 대한 정보는 [Here 's] (https://www.opengl.org/wiki/Shader_Compilation)를 참조하십시오. –

답변

0

은 오타의 커플이 될 것 같다 : gl_Position

  • out vec4 color의 대신

    • gl_postion 누락 된 세미콜론 out vec4 color;
    • glDeleteVertexArrays(1, &vertex_array_object);는 셧다운 기능에 두 번 표시했다

    기타 ore, init() 함수가 클래스 my_application에 없습니다. 특히 sb6::application::init()으로 전화해야합니다.

    여전히 도움이되지 않는다면,이 책은 모든 샘플이있는 저장소를 유지 관리하고있는 것으로 보입니다. here. 어쩌면 그들은 모든 것을 거기에서 바로 잡을 것입니다.

  • +0

    아니요, 변경하지 않습니다. –

    +0

    두 번째 쉐이더에 또 다른 오타가 있습니다 (누락 된 세미콜론) –

    +0

    두 개가 모두 수정되었지만 여전히 도움이되지 않습니다. –

    관련 문제