Как вы определяете, когда объект отображается на экране в OpenGL? - PullRequest
1 голос
/ 09 марта 2010

Я чрезвычайно новичок в OpenGL. Я пишу программу, которая отображает летающий 3D текст на экране. Мне нужно знать, когда определенная текстовая строка появляется (рисуется) на экране и видна пользователю. Программа должна определить, какие текстовые строки отображаются. (Примечание: хотя моя проблема связана с текстом, его можно обобщить для любого объекта OpenGL).

Сначала я подумал, что могу использовать механизм выбора OpenGL, но пока я видел только примеры, где область выбора ориентирована на взаимодействие с пользователем. Я хочу знать, какие объекты отображаются во всей области окна. Это заставляет меня думать, что я на неправильном пути ... Я что-то упустил?

Любые предложения приветствуются.

Ответы [ 4 ]

2 голосов
/ 09 марта 2010

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

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

Примечание: использование выбора OpenGL не обязательно подразумевает использование gluPickMatrix. Вы можете визуализировать сцену «как есть» и запросить визуализированные имена (выбор альтернативы не поддерживается в OpenGL 3).

Объекты запросов просты в использовании и легки. Выбор - еще одно хорошее решение для большинства аппаратных средств, но более схематичное, чем объекты запросов.

0 голосов
/ 09 марта 2010

Вы можете попробовать механизм OpenGL feedback . В этом режиме OpenGL генерирует фрагменты и передает их в буфер обратной связи. Если что-то вырезано, фрагменты не будут созданы. Когда текст станет видимым, вы найдете соответствующий фрагмент в буфере фрагментов.

Эта ссылка должна помочь вам начать.

Вот еще одна ссылка, Вопрос 10.010 кажется особенно релевантным для того, что вы хотите.

0 голосов
/ 09 марта 2010

Проведите координаты вашего объекта через матрицы проекции и просмотра модели , чтобы получить координаты экранного пространства. Сравните вывод X / Y с экстентами экрана, чтобы выяснить, отображается ли текст на экране.

0 голосов
/ 09 марта 2010

хм, это на самом деле в 3D? или это просто 2D текст на экране в 2D пространстве? в этом случае я бы просто отслеживал это вручную. как именно вы рисуете свой текст?

Как правило, вы делаете это с «проверкой усечённости», когда вы просто делаете объем для камеры и проверяете, находитесь ли вы в ней 3d-объектах.

...