Как визуализировать нетривиальные частицы в OpenGL - PullRequest
3 голосов
/ 18 февраля 2010

У меня есть система частиц, где позиции и различные свойства хранятся в объекте буфера вершин. Значения постоянно обновляются ядром CUDA. В настоящее время я просто рендеринг их, используя GL_POINTS как плоские круги. Что меня интересует, так это то, что эти частицы представляют собой более сложные вещи, такие как, например, трехмерные анимированные модели птиц. Я пытаюсь выяснить, какой будет лучший подход. Ради разговора, скажем, анимация модели птицы состоит из 3 кадров (положение крыльев, а что нет)

Я вижу загрузку моделей в списки отображения и циклическую переборку всех частиц при перемещении, вращении и т. Д. Матрицы, а затем вызов списка отображения. Это не кажется идеальным подходом, потому что это потребовало бы передачи всех данных частиц на хост из gpu только для выполнения матричных операций для возврата обратно в GPU (если я не могу вызвать функции рисования из ядра cuda ?? ?)

Я мало что знаю о шейдерах, смогут ли они справиться с чем-то вроде этого?

На данный момент я в основном ищу советы о том, какой путь выбрать, но если вам известны какие-либо статьи или учебные пособия, касающиеся этой темы, слава.


Я работаю с OpenGL изначально на Windows 7 64bit с c ++. Я не использую GLUT

Ответы [ 2 ]

4 голосов
/ 18 февраля 2010

Вы, вероятно, хотите использовать: EXT_draw_instanced.На самом деле я никогда не использовал Instancing, но большинство современных GPUS (я думаю, GF6 и выше) позволяют вам подавать GPU модель и список точек и заставлять ее рисовать модель в каждой точке.

Я буду гуглить еще немного информации и посмотрю, что у меня получится ....

Ну, это официальная спецификация, и похоже, что у них есть учебник по ней.

http://www.opengl.org/registry/specs/ARB/draw_instanced.txt

0 голосов
/ 18 февраля 2010

Вам нужно проявить изобретательность, чтобы сделать что-то подобное. Если вы использовали CUDA для вычисления положения и поворота в 2 3-х компонентных плавающих текстурах, а затем запустили «индекс» вместе с каждой вершиной и увеличили на 1 для каждого экземпляра геометрии, то вы могли бы написать шейдер, который загружает текстуры и затем использует текстуру вершинного шейдера поиск, чтобы выбрать соответствующий пиксель из 2 текстур и построить матрицу преобразования. Затем вы преобразуете вершины сетки с помощью созданной вами матрицы преобразования.

...