Лучший метод отбора OpenGL для рендеринга старых игр? - PullRequest
3 голосов
/ 01 мая 2011

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

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

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

Изображение: http://i.stack.imgur.com/duc2I.png

Ответы [ 2 ]

6 голосов
/ 01 мая 2011

Есть две разные вещи, которые нужно учитывать: Вы просто хотите, чтобы это выглядело правильно, то есть удаление скрытой поверхности?Тогда простое глубинное тестирование сделает работу;накладные расходы заключаются в том, что вы обрабатываете геометрию, которая вообще не отображается на экране.Однако, если это (очень) старая игра, из которой вы взяли данные, очень вероятно, что полная карта со всеми ее активами имеет меньше полигонов, чем то, что видно в современных играх на скриншоте.В этом случае вы не столкнетесь с какими-либо проблемами с производительностью.

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

Однако эти вычисления полностью выходят за рамки OpenGL или любого другого 3D-растеризации API (например, Direct3D)- их задача - рисовать треугольники на экране, используя сложные методы растеризации;нет управления объектами, нет функций более высокого уровня.Так что это зависит от вас, чтобы реализовать это.

Типичный подход заключается в использовании структуры пространственного подразделения.Наиболее популярными являются деревья Kd , октреи и деревья BSP .Деревья BSP пространственно очень эффективны, но тяжелее в вычислениях.Лично я предпочитаю гибрид / комбинацию дерева Kd и октри, так как их легко модифицировать для отслеживания динамических изменений в сцене.Деревья BSP гораздо тяжелее для обновления (обычно требуется полная перерасчет).

При таком пространственном структурировании очень легко определить, находится ли точка в определенной области интереса.Также очень просто выбрать узлы в дереве с помощью геометрических ограничений, таких как плоскости.Это делает реализацию грубого отсечения усеченного контура очень простой: каждый использует плоскости отсечения усеченного конуса, чтобы выбрать все узлы в дереве внутри плоскостей.Чтобы облегчить жизнь графическим процессорам, вы можете отсортировать узлы от дальних до удаленных;опять же, вам помогает древовидная структура, поскольку вы можете рекурсивно сортировать дерево, что приводит к почти оптимальной сложности O (n log (n)).

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

1 голос
/ 01 мая 2011

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

Это уже сделано самим усечением.Дальняя плоскость установила ограничение расстояния камеры до объекта, который будет отображаться.

Посмотрите на glFrustum .

...