Рендеринг разных спрайтов OpenGL в каждой вершине

Основной вопрос: с помощью OpenGL можно ли заставить шейдерную программу использовать один вызов glDrawArrays (с GL_POINTS) для рисования разных спрайтов в каждой вершине?

Больше информации: у меня есть настольная программа OpenGL (использующая SharpGL в приложении WPF), которая может отображать тысячи 2D-треков. Частично, трек представляет собой серию точек с отметками времени, и часть точек отображается в зависимости от промежутка времени вокруг изменяемого CurrentTime. Другие свойства каждой точки определяют цвет точки. Каждый трек связывает свой массив вершин, массив цветов и массив меток времени и вызывает glDrawArrays для рендеринга своих точек. Шейдерная программа сделает все остальное.

Недавно я начал использовать точечные спрайты, чтобы дать различным типам дорожек разные символы для своих точек. Я хотел бы дать разные точки на дорожке разные символы в зависимости от других атрибутов каждой точки. Я хотел бы сделать это с помощью одного вызова glDrawArrays для каждого трека. Таким образом, мысль состоит в том, что массив спрайтов сделает свое дело (применяя разные спрайты к каждой вершине). Это возможно? Я пропускаю лучшее решение?

1 ответ

Решение

Конечно. OpenGL автоматически генерирует текстурные координаты от 0,0 до 1,0 для каждого спрайта, но нет причины, по которой ваш фрагментный шейдер не может их изменить. Я бы поместил все спрайт-изображения в один большой текстурный атлас и передал атрибуты, которые определяют, какое изображение использовать в фрагментный шейдер.

В OpenGL 3.3 или выше, есть встроенная переменная gl_PrimitiveID, которую вы можете использовать в фрагментном шейдере, это счетчик, увеличиваемый для каждой нарисованной точки, линии или треугольника. (Это немного сложнее с геометрическими или тесселяционными шейдерами.) Это также может быть полезно.

Надеюсь это поможет.

Другие вопросы по тегам