2016-08-31 5 views
1

Я изучаю opengl от супербезопасного 6-го издания, и я не могу изобразить треугольник из следующего кода, приведенного в книге.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_postion вместо gl_Position
  • out vec4 color недостающее полу двоеточие out vec4 color;
  • glDeleteVertexArrays(1, &vertex_array_object); дважды появляется в функции отключения

Дальше руды, функция init() отсутствует в классе my_application. Следует, в частности, позвонить sb6::application::init().

Если это все еще не помогает, кажется, что книга хранит хранилище со всеми его образцами here. Возможно, они все исправит.

+0

Нет, ничего не меняет. –

+0

Существует еще одна опечатка во втором шейдере (отсутствующая полуколока) –

+0

исправлена ​​обе из них, но все равно не помогает. –

Смежные вопросы