Анимированные радиусы точек с помощью CUDA и OpenGL

Я пытаюсь реализовать облако точек с OpenGL и CUDA, где радиусы точек должны меняться по размеру с течением времени на основе некоторых данных, связанных с ними.

Поскольку я совершенно новичок в OpenGL и CUDA, мне довольно сложно достичь этой цели. Изучив основы OpenGL, GLSL и CUDA, я совершенно не понимаю, какие части программы должны выполняться.

Моя идея заключалась в следующем:

  • Используйте VBO с позициями вершин
  • Используйте VBO с радиусами вершин
  • Используйте VBO с вершинными неопределенностями. На основе этих данных радиусы вершин должны изменяться анимированным образом.
  • Вычислить радиус всех вершин в ядре CUDA в каждом кадре
  • Вызов glDrawArrays для рендеринга всех точек и использования вершинного шейдера, который получает все данные из массивов в качестве входных данных.

Прежде всего... разумно ли использовать для этой цели шейдеры CUDA и GLSL вместе? Поскольку я читал кое-что об использовании того или другого, я не уверен в этом.

Второй вопрос: какие части программы будут выполняться на процессоре, а какие на графическом процессоре? Имеет ли смысл вычислять данные в ядре, а затем передавать их обратно в функцию отображения OpenGL для их рендеринга?


person Schnigges    schedule 04.01.2013    source источник


Ответы (1)


Прежде всего... разумно ли использовать для этой цели шейдеры CUDA и GLSL вместе? Поскольку я читал кое-что об использовании того или другого, я не уверен в этом.

Нет, это не разумно. Если ваша цель получить изображение - используйте OpenGL. Если ваша цель — выполнить тяжелые вычисления (умножить большие матрицы и т. д.) — используйте CUDA.

Вы можете вычислить радиус всех вершин в вершинном шейдере вообще без CUDA. Используйте юниформ-переменную для передачи информации о времени в шейдер. Чистый подход OpenGL будет намного быстрее, так как не нужны запуски ядра и дополнительная передача данных.

Второй вопрос: какие части программы будут выполняться на процессоре, а какие на графическом процессоре? Имеет ли смысл вычислять данные в ядре, а затем передавать их обратно в функцию отображения OpenGL для их рендеринга?

Шейдеры GLSL и ядра CUDA выполняются на графическом процессоре. Другой код - на CPU. Если в пайплайне рендеринга можно все просчитать (а можно), то смысла в запусках CUDA нет.

person Oleg Titov    schedule 04.01.2013