Разработка игр OpenGL - сцены, которые выходят далеко в поле зрения - PullRequest
1 голос
/ 17 сентября 2009

Я работаю над 2d игрой. Представьте себе самолет XY, и вы персонаж. Когда ваш персонаж ходит, появляется остальная часть сцены.

Представьте, что плоскость XY достаточно велика, и за пределами вашего текущего вида есть другие символы.

Вот мой вопрос, с opengl, если эти объекты не отображаются вне текущего представления, они съедают время обработки?

Кроме того, каковы некоторые подходы, чтобы избежать визуализации частей сцены, которые не видны. Если у меня есть куб, который находится на расстоянии 1000 единиц от моей текущей позиции, я не хочу, чтобы этот объект отображался. Как я мог заставить opengl не рендерить это.

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

Ответы [ 5 ]

7 голосов
/ 17 сентября 2009

OpenGL faq в «Обрезке, отбраковке и проверке видимости» говорит следующее:

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

Иди и прочитай остальную часть этой ссылки, все это актуально.

3 голосов
/ 17 сентября 2009

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

Если вы организуете свои объекты в разумную иерархию, тогда вы можете отбирать большие участки сцены только с одним флажком.

0 голосов
/ 18 сентября 2009

Базовый драйвер может выполнять некоторые выборочные действия, но вы не можете зависеть от этого, поскольку он не является частью стандарта OpenGL. Может быть, драйвер вашего компьютера делает это, но, возможно, кто-то другой (кто может запустить вашу игру) этого не делает. Лучше всего делать это самостоятельно.

0 голосов
/ 18 сентября 2009

«единственный выигрышный ход - не играть»

Каждый glVertex и т. Д. Будет ударом по производительности независимо от того, будет ли он в конечном итоге отображаться на вашем экране. Единственный способ обойти это - не рисовать (то есть отбирать) объекты, которые никогда не будут визуализированы.

самый распространенный метод - привязать усеченный просмотр к камере. Соедините это с octtree или quadtree в зависимости от того, является ли ваша игра 3d / 2d, так что вам не нужно проверять каждый отдельный игровой объект на предмет усеченного конуса.

0 голосов
/ 18 сентября 2009

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

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

Очевидно, что в сложной игре вам не нужно будет делать это для каждого крошечного объекта, поэтому типично сгруппировать их, либо иерархически (например, вы не рендерите оружие, если вы уже определили, что вы не отображать персонажа, который его держит), пространственно (например, разделив мир на сетку / квадри / / 1005 * октри и отклонив любой объект, который, как вы знаете, находится в пределах зоны, которую вы уже определили, в настоящее время невидимым), или чаще всего комбинацией обоих.

...