2014-02-02 1 views
0

Я написал утилиту SpriteBatch, которая может совместно использовать спрайты и визуализировать их, используя GL_TRIANGLES (6 вершин на спрайт). Я также хотел бы иметь возможность рисовать другие примитивы, такие как GL_LINES, используя аналогичный метод. Как мне собрать эту другую геометрию вместе? Было бы неплохо иметь классы пакетов для каждого из этих типов?У меня есть SpriteBatch, но как насчет дозирования геометрии?

ответ

0

Для любого примитивного типа, который не подключен (например, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN), вы можете упаковать столько независимых геометрий, сколько хотите, в один и тот же буфер и нарисовать их за один раз, при условии, что матрицы, цвета, текстуры и т. Д. Являются одна и та же. Если у вас есть подмножества, которые нужно визуализировать по-разному, вы все равно можете собрать все геометрии в один и тот же буфер, а затем использовать glDrawRangeElements, чтобы отображать только часть в то время.

Если вам нужен более конкретный ответ, вам нужно уточнить, что вы пытаетесь сделать.

Уточнение относительно «несвязанных независимых геометрий»: Это применимо только в том случае, если вы действительно хотите отобразить все геометрии за один раз. Вы все равно можете собрать все геометрии вершин для любого примитивного типа (т. Е. Даже GL_TRIANGLE_FAN) в том же буфере, а затем просто отобразить правильный диапазон буфера с помощью glDrawRangeElements.

Пример: Вы хотите, чтобы ro отображал треугольник с четырьмя вершинами (A, B, C, D) и треугольник из трех вершин (E, F, G). Вы могли бы построить свои буфера следующим образом:

  • буфер вершин: [А, В, С, D, Е, F, G]
  • индекса буфер: [0, 1, 2, 3, 4, 5, 6]

Затем, чтобы сделать вентилятор треугольник, вы назвали бы

glDrawRangeElements(GL_TRIANGLE_FAN, 0, 3, 4, GL_UNSIGNED_INT, 0); 

и нарисовать треугольник, вы назвали бы

glDrawRangeElements(GL_TRIANGLES, 4, 6, 3, GL_UNSIGNED_INT, 0); 
+0

Вы, похоже, сильно ударили по голове. Я хотел упаковать их все в один VBO, но я быстро отклонил это, потому что я не думал, что можно было отобразить некоторых с GL_TRIANGLES, некоторые с GL_LINES, а затем еще с GL_TRIANGLES. Мне нужно будет проверить glDrawRangeElements. – Dooskington

+0

Имейте в виду, что по производительности не обязательно лучше иметь один огромный буфер вершин (хотя наличие тонны крошечных буферов также неэффективно). Возможно, вам захочется прочитать, например http://www.opengl.org/wiki/Vertex_Specification_Best_Practices – smani

0

Я думаю, что это также стоит отметить, что вы можете добиться расширенного дозирования с геометрическим инстансом, созданным с помощью AKA рендеринга. Проверьте ссылки: 1, 2.

С геометрическим instancing вы можете не только упаковать несколько объектов в один VB, но и нарисовать их все с помощью одного вызова рисования.

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