Как сделать 3D выбор / подбор с помощью OpenGL - PullRequest
9 голосов
/ 22 августа 2011

У меня есть некоторые объекты на сцене, некоторые могут перекрывать другие.Когда я щелкаю мышью или перетаскиваю, чтобы получить прямоугольник выделения, я хочу выбрать / выбрать только те объекты, которые я вижу с этой точки зрения.В настоящее время приложение использует режим рендеринга GL_SELECT, но, как мы знаем, он также выбирает скрытые объекты.Кроме того, я прочитал, что это не рекомендуется в OpenGL 3.

Есть два метода, которые в настоящее время мне нравятся.Во-первых, это выбор объекта с использованием обратного буфера (Красная книга, глава 14): установка цвета каждого объекта в соответствии с его идентификатором объекта и считывание цвета пикселей из буфера заднего кадра.Второй - это запросы окклюзии (superbible, 4-е изд, глава 13).

Другие исключенные мной подходы - это просмотр значений min / max z в буфере выбора и выполнение пользовательского обнаружения луча / объекта вне GL.

У меня есть несколько вопросов: 1) Если GL_SELECT устарел в недавнем OpenGL, какие альтернативы предполагается использовать разработчикам?2) Я только когда-либо читал об окклюзионных запросах, используемых для ускорения рендеринга.Могут ли они быть использованы для выбора / выбора, и есть ли недостатки?3) Существующее приложение имеет несколько вызовов glColorXXX.Если я пошел по маршруту обратного буфера и использовал glColorMask (FALSE, FALSE, FALSE, FALSE), это эффективно превратит вызовы glColourXXX в вызовы, которые не имеют никакого эффекта, что позволит мне контролировать цвет в одном месте при рендеринге в режиме выбора.?4) Какой маршрут лучший / канонический?

1 Ответ

3 голосов
/ 31 августа 2011

Я решил реализовать выборку, используя задний буфер.Вот моя попытка ответить на мои вопросы:

Если GL_SELECT устарел в недавнем OpenGL, какие альтернативы предполагается использовать разработчикам?
Я думаю, что лучше не использовать OpenGL, чтобы сделатьэто задача, но использовать структуры пространственного ускорения, как предложено в комментариях к исходному вопросу, как user camera85.

Я когда-либо читал только об окклюзионных запросах, используемых для ускорения рендеринга.Могут ли они быть использованы для выбора / выбора, и есть ли недостатки?
Я уверен, что они могли бы, но нужно было бы знать все объекты, которые они хотят запросить на окклюзию до начала розыгрыша.Используя задний буфер и выбор цвета, можно просто посмотреть, что находится под курсором или внутри прямоугольной области, и отфильтровать оттуда.

Существующее приложение имеет несколько вызовов glColorXXX.Если я пошел по маршруту обратного буфера и использовал glColorMask (FALSE, FALSE, FALSE, FALSE), это эффективно превратит вызовы glColorXXX в вызовы, которые не имеют никакого эффекта, что позволит мне контролировать цвет в одном месте при рендеринге в режиме выбора.?
Ответ - нет.Вызов glColorMask () со всеми параметрами GL_FALSE не означает, что вызовы glColor3ub () (например) не будут обрабатываться.Он просто указывает фильтр / маску для цветов непосредственно перед тем, как они записываются в буфер цвета.Первоначально предполагалось установить цвет для идентификатора объекта, а затем вызвать glColorMask (), чтобы игнорировать все последующие вызовы glColorXXX ().Эта стратегия обречена, так как цвет, представляющий идентификатор объекта, также будет замаскирован.

4) Какой маршрут является лучшим / каноническим? Я бы сказал, что выбор цвета заднего буфера равен как правило, лучше, так как не требует настройки запросов окклюзии до / во время розыгрыша.

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