2009-09-16 3 views
1

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

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

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

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

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

ответ

3

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

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

7

OpenGL faq на «Clipping, выбраковка и видимости тестирования» говорит, что это:

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

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

0

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

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

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

0

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

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^