Выбор треугольников в профиле ядра OpenGL при использовании glDrawElements - PullRequest
4 голосов
/ 31 января 2012

Я рисую сетку треугольников с помощью glDrawElements и хотел бы иметь возможность выбирать / выбирать треугольник с помощью щелчка мыши.Сетка из треугольников может быть очень большой.

В OpenGL с фиксированной функцией есть возможность использования GL_SELECT: http://content.gpwiki.org/index.php/OpenGL:Tutorials:Picking .. Однако меня интересует только использование основного профиля OpenGL.

Другой возможностью было бы использование «цветовой кодировки»:

http://www.lighthouse3d.com/opengl/picking/index.php?color1

http://www.opengl.org/resources/faq/technical/selection.htm

.. но, насколько я знаю, это невозможноуказывать на треугольник информацию еще при использовании glDrawElements?

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

У кого-нибудь есть предложения о том, как лучше выбирать при использовании glDrawElements в профиле ядра OpenGL?

Ответы [ 3 ]

5 голосов
/ 31 января 2012

Что касается подхода «цветового кодирования», вы можете использовать gl_PrimitiveID для заполнения буфера (кодов) с цветовой кодировкой, используя подходящий фрагментный шейдер, это в основном даст вам индекс нарисованного треугольника.

Что касается выбора на основе ЦП, вы можете использовать существующую библиотеку, которая обрабатывает структуры ускорения и пересечения лучей, например, Bullet или Код операции .

«Лучший» вариант для вас зависит от вашего варианта использования, трудно сказать.

3 голосов
/ 31 января 2012

Попробуйте посмотреть с этой точки зрения: OpenGL предназначен только для рисования вещей.Сбор должен быть сделан по-другому.Если вы настаиваете на использовании OpenGL для этого (не лишено смысла), используйте FBO с целочисленным 16-битным вложением одноканального цветового буфера, в которое вы визуализируете идентификатор объекта.Выборка сводится к считыванию одного пикселя для идентификатора.

Наконец, я мог бы сделать выборку на основе процессора, стреляя лучом выбора через местоположение мыши, но это было бы довольно медленно, так как я предполагаю, что мне придетсяпреобразовать треугольники на процессоре, поэтому я бы предпочел решение на основе графического процессора.

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

2 голосов
/ 31 января 2012

Что ж, вы действительно можете предоставить информацию о треугольнике для вызова DrawElements.Затем вам нужно будет предоставить соответствующие массивы (бывший COLOR_ARRAY, TEXTURE_COORD_ARRAY и т. Д., Теперь обычно называемый VertexAttribArrays).Это, вероятно, было бы самым простым решением, если вы настаиваете на графическом процессоре.

Однако, обычно, путь может быть - запустить луч из точки щелчка в вашу сцену.Следовательно, вам нужно будет не трансформировать каждый треугольник, а рассчитать тест пересечения между вашим лучом и вашими треугольниками.Если луч пересекается, вы попадаете в него, если нет.Это действительно может дорого обойтись, если вы сделаете это грубой силой.

Однако, как правило, ваши треугольники содержатся в некоторой пространственной структуре данных (то есть ваш граф сцены будет / может / должен иметь несколько представлений)как октри (например, http://en.wikipedia.org/wiki/Octree). Это позволит получить ответ о столкновении в нескольких тестах. Кроме того, вы можете принять во внимание конечный размер, который треугольник будет занимать на экране (поэтому было бы совершенно бессмысленно выбирать субпиксель).треугольники в большинстве случаев).

И если вы действительно хотите получить фантазию, вы также можете поместить весь процесс в графический процессор (один из примеров, который звучит интересно, например, http://blog.xeolabs.com/ray-picking-in-scenejs,, но будетеще больше, когда вы используете google).

Лично мне проще всего реализовать решение b) Software Ray Picking, затем a) и, наконец, выбор GPU.Начните с самого простого, улучшайте его, если считаете, что оно недостаточно быстрое.Не стоит слишком увлекаться преждевременной оптимизацией (например, на моем iPhone отлично работает подбор лучей;).Удачи и удачи с вашим выбором.

...