2015-02-06 4 views
1

Как обычно люди рисуют несколько объектов в OpenGL 3.3+? У меня есть 2 объекта: ландшафт и сфера. Для каждого объекта у меня есть 2 массива (вершин и индексов). Я попытался установить различные VBO и IBO (как это):OpenGL рисование нескольких объектов

glEnableVertexAttribArray(0); 
    glEnableVertexAttribArray(1); 
    glEnableVertexAttribArray(2); 

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); 
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12); 
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20); 

    glBindBuffer(GL_ARRAY_BUFFER, m_VBO); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO); 
    glDrawElements(GL_TRIANGLES, (size-1)*(size-1)*6, GL_UNSIGNED_INT, 0); 



    glBindBuffer(GL_ARRAY_BUFFER, m_VBOsphere); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBOsphere); 
    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); 

    glDisableVertexAttribArray(0); 
    glDisableVertexAttribArray(1); 
    glDisableVertexAttribArray(2); 

но выглядит как вычисляет GPU/рисовать все только после закрытия этой функции, и я вижу только сферу. И что же мне делать?

+0

Я не вижу здесь проблем. Просто, чтобы убедиться, что если вы прокомментируете 3 линии рендеринга сфер, ландшафт визуализируется отлично? – HolyBlackCat

+0

@HolyBlackCat Да. – user3051029

ответ

2

Похоже, вы неправильно поняли последствия привязки буфера и правильную последовательность вызовов.

Вы ожидали, что в этой последовательности, вызов Жеребьевка бы получить его вершины из VBO с идентификатором m_VBO:

glBindBuffer(GL_ARRAY_BUFFER, m_VBO); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO); 
glDrawElements(GL_TRIANGLES, (size-1)*(size-1)*6, GL_UNSIGNED_INT, 0); 

Это не так, как это работает. Текущая привязка GL_ARRAY_BUFFER абсолютно не влияет на призыв к розыгрышу.

Вы должны иметь право привязать VBO при вызове glVertexAttribPointer(). Помимо прямых аргументов, которые задают значения для установки соответствующего атрибута (format, stride и т. Д.), Этот вызов также указывает, что в качестве источника данных атрибута используется связанный с ним VBO.

Таким образом, вам нужны glVertexAttribPointer() звонки по каждому объекту, и позвоните им после, связывая соответствующий VBO.

последовательность Вызов затем:

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glEnableVertexAttribArray(2); 

glBindBuffer(GL_ARRAY_BUFFER, m_VBO); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12); 
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO); 
glDrawElements(GL_TRIANGLES, (size-1)*(size-1)*6, GL_UNSIGNED_INT, 0); 

glBindBuffer(GL_ARRAY_BUFFER, m_VBOsphere); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12); 
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBOsphere); 
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0); 

glDisableVertexAttribArray(0); 
glDisableVertexAttribArray(1); 
glDisableVertexAttribArray(2); 

Если вы хотите, чтобы уменьшить количество настройки вызовов, необходимо перед каждым вызова отрисовки, посмотреть Vertex массива объектов (ВАО).

+0

Большое спасибо, ваш ответ действительно помог! – user3051029