Выберите объект в OpenGL при выполнении преобразований в вершинном шейдере - PullRequest
0 голосов
/ 19 ноября 2018

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

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

Тем не менее, я пытаюсь перенести все преобразования в GPU и при этом осознал, что я бы тогда отказался от обновленного доступа к вершинам в CPU (поскольку CPU все еще думает, что вершины не являются преобразованные). Как это сделать, чтобы мне не пришлось вручную выполнять преобразования на процессоре, а также в вершинном шейдере?

1 Ответ

0 голосов
/ 19 ноября 2018

Независимо от того, где вы выполняете свои преобразования, у вас обычно будет матрица модели, которая описывает, где каждый объект находится на сцене.Вместо того, чтобы преобразовывать каждый объект в мировое пространство просто так, чтобы вы могли проверить его пересечение с лучом мирового пространства, вы также можете преобразовать луч в пространство объектов каждого объекта путем преобразования луча с помощью матрицы обратной модели.

Одна общая проблема с трассировкой лучей заключается в том, что по мере увеличения вашей сцены тестирование методом грубой силы каждого объекта будет становиться все более медленным.Вы можете использовать ускоряющие структуры, такие как Octree или Bounding Volume Hierarchy, чтобы ускорить процесс.Совершенно другой подход, когда дело доходит до выбора, будет просто визуализировать буфер идентификатора, то есть буфер, который имеет то же разрешение, что и текущий визуализированный кадр, и для каждого пикселя сохраняет идентификатор объекта, который виден в этом пикселе.Затем вы можете просто прочитать значение пикселя под курсором, чтобы узнать, по какому объекту вы ударили, без необходимости трассировки лучей.Рендеринг буфера идентификатора может быть выполнен как отдельный проход или может быть просто добавлен как дополнительная цель рендеринга к уже выполненному вами проходу, например, предварительное заполнение буфера глубины или просто при рендеринге сцены, если вы делаете только один проход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...