2015-11-22 2 views
1

Я изучаю этот учебник http://learnopengl.com/#!Getting-started/Hello-Triangle, и проблема с этими учебниками заключается в том, что нет полного примера кода, и его трудно поддаться. Мой код работает успешно, но мой треугольник пустой/белый. И я думаю, что некоторые функции вызывается дважды, и программа все еще может работать успешно, если я удалю некоторые из этих команд.Почему мой треугольник белый?

// SHADERS 
GLuint VBO; 
GLuint VAO = 0; 
GLuint program; 
GLuint vertexShader; 
GLuint fragmentShader; 

const char* vertexShaderSource = 
    "#version 330" 
    "layout (location = 0) in vec3 position;" 
    "void main(){" 
    "gl_Position = vec4(position.x, position.y, position.z, 1.0);" 
    "}"; 
const char* fragmentShaderSource = 
    "#version 330" 
    "out vec4 color;" 
    "void main(){" 
    "color = vec4(1.0, 0.5, 1.0, 1.0);" 
    "}"; 

void compileShaders() { 
    vertexShader = glCreateShader(GL_VERTEX_SHADER); // pravi vertex shader 
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); // Odredjuje izvor vertex shadera 
    glCompileShader(vertexShader); // kompajlira shader 

    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(vertexShader, 1, &fragmentShaderSource, NULL); 
    glCompileShader(fragmentShader); 
} 

void linkShaders() { 
    program = glCreateProgram(); // pravi program ID 

    // Linkuje shaderse i program 
    glAttachShader(program, vertexShader); 
    glAttachShader(program, fragmentShader); 
    glLinkProgram(program); 

    glUseProgram(program); // koristi program 

    // Brise shaderse jer vise nisu potrebni i tako oslobadja memoriju 
    glDeleteShader(vertexShader); 
    glDeleteShader(fragmentShader); 

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); 
    glEnableVertexAttribArray(0); // MISLIM DA JE OVO VISAK 
} 

void initVBO() { 
    GLfloat vertices[] = { 
     -0.5f, -0.5f, 0.0f, 
     0.5f, -0.5f, 0.0f, 
     0.0f, 0.5f, 0.0f 
    }; 

    glGenBuffers(1, &VBO); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 
} 

void initVAO() { 
    glGenVertexArrays(1, &VAO); 
    glBindVertexArray(VAO); 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); 
} 

void Init() { 
    glClearColor(0.20, 0.63, 0.67, 1.0); 
    glViewport(0, 0, WIDTH, HEIGHT); 

    compileShaders(); 
    linkShaders(); 
} 

void Render() { 
    glClear(GL_COLOR_BUFFER_BIT); 

    initVAO(); 
    initVBO(); 

    glUseProgram(program); 

    glBindVertexArray(VAO); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    glBindVertexArray(0); // oslobadja momoriju 

    glutSwapBuffers(); 
} 
+2

Вы уверены, что ваш код увенчался успехом? Вы нигде не проверяете ошибки. –

+0

Нет, ошибок нет. – iUuax

+2

Как вы проверяете ошибки? –

ответ

3

Ваши шейдеры не должны компилироваться. В результате у вас нет действующей программы. В зависимости от профиля GL-контекста и фактической реализации GL вы получите разные результаты. С драйверами nvidia вы обычно видите белый треугольник в этом сценарии.

Причина, по которой ваши шейдеры недействительны, заключается в том, что вы забыли добавить новую строку \n после директивы #version 330. Вы используете синтаксис C/C++ для конкатенации строк путем объединения "string1" "string2". Тот факт, что у вас есть символ новой строки вне кавычек совершенно не имеет значения, строка, которую вы указываете в

#version 330layout (location = 0) in vec3 position;[...] 

все в одной строке, и это не является допустимым заявление препроцессора ...

Вы всегда должен проверить состояние компиляции ваших шейдеров и статус ссылки вашей программы. И вы всегда должны запрашивать журналы данных компилятора и компоновщика. Посмотрите на the OpenGL wiki artice about shader compilation, чтобы узнать, как это сделать.

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