Полигон opengl против полосы треугольников с использованием списков отображения

(Я использую PyOpenGL, а мой ноутбук работает под управлением OpenGL 2.1)

Я слышал, что OpenGL рисует треугольники намного быстрее, чем многоугольники, но также то, что использование списков отображения сокращает накладные расходы. Могу ли я получить какую-либо скорость, преобразовывая свои модели в полосы треугольников, если они в настоящее время находятся в многоугольниках (треугольники, квадраты и другие) и использую glBegin(GL_TRIANGLE_STRIP) для рисования вместо glBegin(GL_POLYGON), если я все равно использую списки отображения? Список отображения автоматически все триангулирует?

У меня есть модели примерно с 50 лицами в формате obj, и список составлен с помощью этого кода:

treelist = glGenLists(1)
glNewList(treelist, GL_COMPILE)
for s in OBJ.treeobjs:
    for face in s.faces:
        verts, normals, texcoords = face

        glBegin(GL_POLYGON)
        for i in range(len(verts)):
            glNormal3fv(s.normals[normals[i]])
            if texcoords[i] > 0:
                glTexCoord2fv(s.texcoords[texcoords[i]])
            glVertex3fv(s.vertices[verts[i]])
        glEnd()
glEndList()

и нарисован с помощью:

glCalllist(treelist)

Но если бы я хотел преобразовать все в полосу треугольников (триангуляция в блендере проста), мне пришлось бы использовать другой формат, чем obj?


person Matt Majic    schedule 03.01.2016    source источник
comment
Немного педантично, но тем не менее: OpenGL не рисует треугольники быстрее, чем многоугольники, потому что это спецификация; он только определяет, что происходит, и что делают вызовы API, и ничего не реализует. Тем не менее, большая часть оборудования сегодня отображает только треугольники, а более сложные формы раскладываются на них. Если вы используете OpenGL 2+, вам следует использовать буферы вершин вместо списков отображения.   -  person Colonel Thirty Two    schedule 03.01.2016
comment
Включает ли буферы вершин использование glDrawArrays? Пример VBO в Википедии использует glDrawArrays вместе с glBindBuffer, но я могу использовать glDrawArrays отдельно.   -  person Matt Majic    schedule 03.01.2016


Ответы (1)


Формат obj не поддерживает треугольные полосы. Не используйте GL_POLYGON или отображайте списки, поскольку они фактически устарели. Не занимайтесь зачисткой треугольника, если у вас нет веской причины для повышения производительности.

Предполагая, что вы можете триангулировать все в блендере, загрузить треугольники в VBO и проиндексировать их с помощью glDrawElements. Если вам нужно нарисовать много моделей, попробуйте объединить свои модели в один большой VBO.

person Taylor    schedule 03.01.2016
comment
Полоски треугольников лучше, чем неоптимизированный список треугольников. Хотя оптимизированный список треугольников обычно может превзойти полосы, вам все равно нужно оптимизировать этот список. - person Nicol Bolas; 03.01.2016
comment
Я не могу найти спецификацию glDrawIndices - это просто еще одна версия glDrawArrays и glDrawElements? - person Matt Majic; 03.01.2016