2017-01-31 3 views
1

Je ne peux rien dessiner sur mon écran gl. Cela efface juste l'écran. Voici mes classes Main, Display et Cube.OpenGL 3.3 ne peut rien dessiner

main.cpp

Display d(800, 600, "Hi"); 
while (!d.IsClosed()) { 
    d.Clear(); 
    d.Update(); 
} 
return 0; 

display.cpp

Constructor et glew glfw initialise.

void Display::Update() { 
    glfwPollEvents(); 
    m_shader->UseProgram(); 
    m_renderer->Render(*m_cube); 
    glfwSwapBuffers(m_window); 
} 

fonction UseProgram est de la classe Shader et juste glUseProgram(m_programID);.

Aussi m_renderer->Render() est juste appels Render fonction de l'objet dans le paramètre.

cube.cpp

void Cube::Init() { 
//cube vertices - colors 
GLfloat data[] = { 
    -0.5f, 0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 
    -0.5f, -0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, -0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, 0.5f, 0.0f, m_color.r, m_color.g, m_color.b, m_color.a, 

    -0.5f, 0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a, 
    -0.5f, -0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, -0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a, 
    0.5f, 0.5f, -0.5f, m_color.r, m_color.g, m_color.b, m_color.a 
}; 

//cube indices 
GLuint indices[] = { 
    //front 
    0, 1, 2, 
    0, 2, 3, 

    //top 
    4, 0, 3, 
    4, 3, 7, 

    //bottom 
    1, 3, 6, 
    1, 6, 2, 

    //left 
    4, 3, 1, 
    4, 1, 0, 

    //right 
    3, 2, 6, 
    3, 6, 7, 

    //back 
    4, 5, 6, 
    4, 6, 7, 
}; 

m_vertexCount = sizeof(indices)/sizeof(GLuint); 

//Generate buffers 
glGenVertexArrays(1, &m_vaoID); 
glGenBuffers(1, &m_vboID); 
glGenBuffers(1, &m_eboID); 

//Bind vertex array object 
glBindVertexArray(m_vaoID); 

//Bind vertex buffer object 
glBindBuffer(GL_ARRAY_BUFFER, m_vboID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); 
glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GL_FLOAT), (GLvoid*)0); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT))); 

//Unbind vertex buffer object 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

//Bind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 
//Unbind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

//Unbind vertex array object 
glBindVertexArray(0); 
} 

fonction Init() est appelée de constructeur. C'est tout le code d'initialisation du cube. Juste des tableaux de liaison et de désengagement.

void Cube::Render() { 
glBindVertexArray(m_vaoID); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID); 
glDrawElements(GL_TRIANGLES, m_vertexCount, GL_UNSIGNED_INT, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 
} 

Je ne peux pas comprendre ce problème. Cela ne montre rien à l'écran. Si vous voulez, je peux poster ma classe Shader aussi.

+0

Pouvez-vous montrer la classe et la source du shader? Vous pouvez également supprimer 'glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);' in 'Init()' et un autre appel dans 'Render()' car VAO enregistre le tampon d'index lié. – Nazar554

Répondre

2

Les paramètres de la foulée sont incorrects. Chaque départ de position consécutif 7 s'éloigne du début du dernier. Idem pour les couleurs. Le code correct serait

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (GLvoid*)0); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (GLvoid*)(3 * sizeof(GL_FLOAT))); 

Une autre chose est que vous Dissocier le tampon d'index avant la déliant VAO, ainsi vous enlever de manière efficace la liaison. Les dernières lignes de la configuration VAO doivent être:

//Bind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboID); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 

//Unbind vertex array object 
glBindVertexArray(0); 

//Unbind Element buffer object 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

De plus, la liaison/déliaison de la GL_ELEMENT_ARRAY_BUFFER dans la fonction Render() doivent être supprimés.

+0

Merci. Quand je change la valeur de la foulée, elle fonctionne correctement. – Stradivarius