Как визуализировать нетривиальные частицы в OpenGL
Вопрос
У меня есть система частиц, в которой позиции и различные свойства хранятся в объекте буфера вершин.Значения постоянно обновляются ядром CUDA.Сейчас я просто визуализирую их, используя GL_POINTS, в виде плоских кругов.Что меня интересует, так это рендеринг этих частиц в более сложных вещах, например, в 3D-анимационных моделях птиц.Я пытаюсь выяснить, какой подход будет лучшим.Для разговора скажем, что анимация модели птицы состоит из 3 кадров (положение крыльев и что-то еще)
Я вижу, как загружаются модели в списки отображения и перебираются все частицы при перемещении, вращении и т. д. матрицы, а затем вызывается список отображения.Это не кажется идеальным подходом, потому что для этого потребуется перенести все данные о частицах на хост из графического процессора только для выполнения матричных операций и отправки обратно в графический процессор (если только я не могу вызвать функции рисования из ядра cuda?? ?)
Я мало что знаю о шейдерах, смогут ли они справиться с чем-то подобным?
На данный момент я в основном ищу совета о том, каким путем следовать, но если вы знаете какие-либо статьи или учебные пособия, посвященные этой теме, спасибо.
Я работаю с OpenGL изначально в 64-разрядной версии Windows 7 с C++.Я не использую GLUT
Решение
Вероятно, вы захотите использовать:EXT_draw_instanced.На самом деле я никогда не использовал Instancing, но большинство современных графических процессоров (я думаю, GF6 и выше) позволяют вам передать графическому процессору модель и список точек и заставить его рисовать модель в каждой точке.
Я погуглю еще немного информации и посмотрю, что получится....
Ну, это официальная спецификация, и похоже, что у них есть руководство по ней.
Другие советы
Вам придется проявить творческий подход, чтобы сделать что-то подобное.Если вы использовали CUDA для вычисления положения и вращения в 2–3 компонентных плавающих текстурах, а затем запускали «индекс» вместе с каждой вершиной и увеличивали его на 1 для каждого экземпляра геометрии, то вы могли бы написать шейдер, который загружает текстуры, а затем использует текстуру вершинного шейдера. поиск, чтобы выбрать соответствующий пиксель из двух текстур и построить матрицу преобразования.Затем вы преобразуете вершины сетки с помощью построенной вами матрицы преобразования.