OpenGL Комплектование из большого набора - PullRequest
3 голосов
/ 02 августа 2011

Я пытаюсь, в JOGL, выбрать из большого набора визуализированных четырехугольников (несколько тысяч). У кого-нибудь есть рекомендации?

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

Я видел этот пост OpenGL GL_SELECT или ручное обнаружение столкновений? и нашел его полезным. Однако моей программе может потребоваться до нескольких минут, чтобы завершить рендеринг полного набора, поэтому я не думаю, что рисование 2x (для выбора цвета) является опцией.

В настоящее время я рисую с вызовами glBegin / glVertex ... / glEnd. Учитывая, что я переключился на пакетный рендеринг на GPU с vao и vbo, вы думаете, что я получу ускорение, достаточно большое, чтобы облегчить выбор цвета?

Если нет, учитывая все рекомендации против с использованием GL_SELECT, вы думаете, стоило бы мне его использовать?

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

Извините за все вопросы. Мой главный вопрос заключается в том, какой хороший способ выбрать из большого набора четырехугольников, используя OpenGL (JOGL)?

Ответы [ 4 ]

2 голосов
/ 05 августа 2011

Лучший способ выбрать из большого количества четырехугольников не может быть легко определен.Мне не очень нравятся выбор цвета или подобные методы, потому что они кажутся непрактичными для большинства ситуаций.Я никогда не понимал, почему существует так много учебных пособий, ориентированных на людей, которые являются новичками в OpenGl, или даже на программирование, нацеленных на сбор, который просто бесполезен почти для всего.Например: попробуйте получить пиксель, на который вы щелкнули, в карте высот: невозможно.Попробуйте найти точную сетку в модели, по которой вы щелкнули: Непрактично.

Если у вас большое количество четырехугольников, вам, вероятно, потребуется хорошее пространственное разбиение или, по крайней мере (лучше) граф сцены.Хорошо, вам это не нужно, но это очень помогает.Посмотрите некоторые уроки для графов сцен для получения дополнительной информации. Полезно знать, начинаете ли вы с 3D-программирования, потому что вы знакомитесь со многими концепциями, а не только с кодом OpenGl.

Так что же делать сейчасначать с какой-то комплектации?Возьмите обратную матрицу вашей модели (iirc с glUnproject(...)) в той позиции, где находится курсор мыши.С ориентацией вашей камеры вы можете теперь направить луч в вашу пространственную структуру (или граф сцены, который содержит пространственную структуру).Теперь проверьте наличие столкновений с вашими квадроциклами.У меня в настоящее время нет ссылки, но если вы ищете обратную матрицу просмотра модели, вы должны найти несколько страниц, которые объясняют это лучше и более подробно, чем это было бы практично сделать здесь.

С помощью этой техники на основе лучевого вещания вы будетев состоянии найти свой квад в O (log n), где n - это количество квадов, которые у вас есть.С некоторой эвристикой, основанной на точной компоновке вашего приложения (ваш вопрос слишком общий, чтобы быть более конкретным), вы можете значительно улучшить его в большинстве случаев.

Простая пространственная структура для этого, например, является квадродеревом.Однако вы должны начать с радиопередачи, чтобы полностью понять эту технику.

0 голосов
/ 28 августа 2012

Я только что реализовал выбор цвета, но glReadPixels здесь медленно (я читал здесь, что это может быть плохо для асинхронного поведения между GL и CPU).

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

Возможно, вы также захотите записать глубину в буфер обратной связи преобразования, чтобы вы могли найти самую верхнюю скрытую сетку. Этот подход также хорошо работает с инстансингом (дополнительно записывают идентификатор экземпляра в буфер)

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

0 голосов
/ 03 августа 2011

Я использую решение, которое я позаимствовал у DirectX SDK, есть хороший пример того, как обнаружить выбранный многоугольник в объекте буфера верстекста.

Тот же алгоритм хорошо работает с OpenGL.

0 голосов
/ 02 августа 2011

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

Если у вас большой набор квадов, возможно, вы можете сгруппировать квады по пробелам, чтобы избежатьтестирование всех четырехугольниковНапример, вы можете сгруппировать квады в два блока и проверить, какой из них вы

...