Реплицируйте в пространстве объект с положением и ориентацией из ядра GPU - PullRequest
0 голосов
/ 24 января 2011

Контекст

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

Цель

Я хотел бы нарисовать один и тот же объект - а именно, роящуюся частицу, может быть простым треугольником в 2D - N раз в разных позициях и с разными ориентацияминаиболее эффективным способом, зная, что:

  • объект всегда точно такой же

  • положения и ориентации рассчитываются на GPU и, таким образом,хранится в памяти графического процессора

  • количество частиц N может быть большим

Текущее решение

Пока, чтобы избежатьотправляя данные обратно в ЦП, я сохраняю массивы положения и ориентации в VBO и использую:

glBindBuffer(GL_ARRAY_BUFFER, position_vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, 0);

glBindBuffer(GL_ARRAY_BUFFER, velocity_vbo);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, 0, 0);

glDrawArrays(GL_POINTS, 0, N);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

, чтобы нарисовать набор точек с цветовой кодировкой скорости без копирования массивов обратно в ЦП.

Я хотел бы сделать что-то вроде рисования полного объекта вместо простой точки, используя аналогичный способ , т.е. без копирования VBO в ЦП.

В основном я хотел бысохранить на графическом процессоре модель объекта (список отображения?a Vertex Array?) и использовать положения и ориентации на графическом процессоре для рисования объекта N раз без отправки данных обратно в CPU .

Возможно ли это и как?Иначе, как мне это сделать?

PS: мне нравится держать код в чистоте, поэтому я бы лучше отделил проблемы с отображением от роящегося ядра.

1 Ответ

1 голос
/ 24 января 2011

Я полагаю, что вы можете сделать это с помощью геометрического шейдера (доступно в OpenGL 3.2). См. этот учебник для конкретной информации.

В вашем случае вам нужно сделать тип ввода и тип вывода геометрического шейдера равным GL_POINTS и GL_TRIANGLES соответственно, а в вашем геометрическом шейдере испустить 3 вершины вашего треугольника для каждой вершины входящей точки.

...