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

StackOverflow https://stackoverflow.com/questions/1435715

  •  07-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

faq OpenGL на " Тестирование отсечения, отбраковки и видимости " ; говорит это:

  

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

Продолжайте читать остальную часть этой ссылки, все это имеет отношение.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top