2015-09-25 3 views
-1

У меня Mac работает OS X Yosemite с GLFW 3 и OpenGL 4.1. Я получил эту программу:Программа OpenGL не визуализируется

#include <glm/gtc/matrix_transform.hpp> 
#include <glm/gtx/string_cast.hpp> 
#include <stdio.h> 

#include "myglutils.hpp" 

int main() { 
    if (!setupGLFW()) return 1; 
    setupApple(); 

    GLFWwindow* window = glfwCreateWindow(640, 480, "Perspective", 0, NULL); 
    if (!window) { 
     fprintf(stderr, "Failed to create window.\n"); 
     glfwTerminate(); 
     return 0; 
    } 

    glfwMakeContextCurrent(window); 

    if (!setupGLEW()) return 1; 

    glClearColor(0.2, 0.0, 0.8, 1.0); 

    const GLfloat vertices[] = { 
     -1.0, -1.0, 
     1.0, -1.0, 
     0.0, 1.0 
    }; 

    const GLchar* vert_shader = 
    "#version 410 core\n" 
    "in vec2 pos;" 
    "uniform mat4 MVP;" 
    "void main() {" 
    " gl_Position = MVP * vec4(pos, 0.0, 1.0);" 
    "}"; 

    const GLchar* frag_shader = 
    "#version 410 core\n" 
    "out vec4 color;" 
    "void main() {" 
    " color = vec4(1.0, 0.0, 0.0, 1.0);" 
    "}"; 

    GLuint shader = getShader(vert_shader, frag_shader); 

    GLuint vbo; 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(GLfloat), vertices, GL_STATIC_DRAW); 

    GLuint vao; 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL); 

    GLuint MVPID = glGetUniformLocation(shader, "MVP"); 

    glm::mat4 perspective = glm::perspective(45.0, 4.0/3.0, 0.1, 100.0); 
    glm::mat4 view = glm::lookAt(glm::vec3(4.0, 3.0, 3.0), glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0)); 
    glm::mat4 MVP = perspective * view; 

    while (!glfwWindowShouldClose(window) && glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS) { 
     glClear(GL_COLOR_BUFFER_BIT); 
     glUseProgram(shader); 
     glUniformMatrix4fv(MVPID, 1, GL_FALSE, &MVP[0][0]); 
     glBindVertexArray(vao); 
     glDrawArrays(GL_TRIANGLES, 0, 6); 

     glfwSwapBuffers(window); 
     glfwPollEvents(); 
    } 

    glDeleteVertexArrays(1, &vao); 
    glDeleteProgram(shader); 
    glfwTerminate(); 

    return 0; 
} 

Функции setupGLFW(), setupApple() и setupGLEW() не проблема. Также нет getShader(). Я чувствую, что моя ошибка - это что-то глупое, как забывание простого вызова функции OpenGL. То, что я пытаюсь сделать, это нарисовать треугольник под углом 3D.

Примечание: эта программа отлично компилируется, но отображает только пустой синий экран.

ответ

3

В этом коде есть ряд проблем. Главное, что вы никогда не включаете массив атрибутов вершины. Вам нужно будет добавить glEnableVertexAttribArray() вызов в коде установки:

glBindVertexArray(vao); 
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL); 
glEnableVertexAttribArray(0); 

Кроме того, аргументы glDrawArrays() не являются правильными:

glDrawArrays(GL_TRIANGLES, 0, 6); 

3-й аргумент число вершин. Поскольку у вас есть только 3 вершины, она должна быть:

glDrawArrays(GL_TRIANGLES, 0, 3); 

Кроме того, если это не позаботятся в коде вы не отправлял, вы должны убедиться, что местоположение атрибута вы используете соответствует программе. Вы используете 0 в коде, но вы не можете рассчитывать на то, что местоположение будет нулевым без каких-либо дальнейших действий. Самый простой способ исправить это использовать location макет спецификатор в коде шейдера:

"layout(location=0) in vec2 pos;" 

Это позволит установить местоположение 0, соответствующий код.

+0

большое вам спасибо! – Jerfov2

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