Как бороться с рендером сложной (полу)прозрачной геометрии

Дошли на днях руки разровнять рендеринг деревьев в нашей игре; пост по мотивам внутренних доков для артистов.

Ahtung!

Внутри большие картинки и всякие буквы.

Суть проблемы

Прозрачную геометрию, как всем известно, рендерят с сортировкой полигонов (по расстоянию до камеры). Т.е. есть случаи, когда можно обойтись и без сортировки, но для объектов более-менее нетривиальной формы придётся полигоны посортировать.

Попадаются, однако, ну очень тяжёлые случаи, когда никакая сортровка не помогает.
Вот, например, такая ёлочка:

http://dragon.firevector.com/temp/ObjectPartSorting-Comparision.png

Решение

Чтобы ёлочка выглядела так, как на картинке справа, нужно рендерить её геометрию в определённом порядке -- ярус за ярусом.
Вот такими частями, в таком порядке :

http://dragon.firevector.com/temp/ObjectPartSorting-Tiers.png
Сортировать, соответственно, по группам.

Т.е. все полигоны одного яруса сортируются независимо от полигонов всей остальной модели; модель по-прежнему рендерится за один draw-call, просто треугольнички разложены по другому.

Реализация

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

Дальше самое интересное (или занудное/сложное) -- нужно как-то разделить полигоны по группам в 3д-редакторе и протянуть эту информацию в игру.

В случае нашего движка, всё получилось достаточно безпроблемно. Статическая геометрия делается в Modo, сохраняется, соответственно, в LWO; в формате LWO изначально есть поддержка всяческой группировки вершин/рёбер/полигонов -- part'ы и selection-set'ы в частности.
Т.е. артист просто назначает полигонам part'ы (именуя так чтобы они были в нужном порядке) и далее на стадии пре-процесса меша треугольники укладываются в том порядке, как указано в part'ах (part'ы отсортированы по именам, т.е. порядок гарантирован). LWO рулит :)

В случае использования 3д-макса/майки/ксюхи и собственных экспортёров придётся дописать поддержку part'ов и/или selection-set'ов.
В COLLADA, к слову говоря, эта инфа тоже не попадает; в-принципе, можно добавить custom-profile на poly-data, если очень захочется. И ещё сильно подозреваю, что в случе с экспорта из майки ситуация сильно получше (не проверял).

И последний нюанс -- оптимизацию под vertex-cache нужно тоже делать не для всех треугольников разом, а по part'ам.

P.S.

Почему бы просто не использовать альфа-тест?
Во-первых, Выглядит некрасиво.

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

Последняя правка: вт, 19/07/2011 - 16:27
Submitted by BLK Dragon on

Комментарии

Спасибо, интересно и познавательно.

Submitted by DekaSoft on

Спасибо за практический совет!

Quote:
BLK Dragon писал(а):
Во-вторых, с учётом текущих тенденций GPU-строения, альфа-тест становиться настолько жутко неэффективным/нежелательным, что пора про него забывать.

А вот с этого места по-подробнее Smile интересно очень.
Submitted by MaxImuS on
А вот с этого места по-подробнее Smile интересно очень. Ну в новых PowerVR (PSP2,iPhone4+,iPad2+, короче все мобильные устройтсва по-факту) альфа-тест сильно не рекомендуется юзать, вплоть до того что вместо рендера квада с альфа-тестом лучше рендерить полигон с непрозрачной частью и второй полигон с альфа-блендом.
Submitted by BLK Dragon on
Quote:
BLK Dragon писал(а):
вместо рендера квада с альфа-тестом лучше рендерить полигон с непрозрачной частью и второй полигон с альфа-блендом.

То бишь отдаем на тест как можно меньше... понятненько. На счет того, что мобилки не дружат с альфа-тестом - это я уже стал немного замечать. Вообщем, нужно стараться правильно выстраивать рендер и не лепить все в одно, надеясь, что gpu и так все разрулит, так?
Submitted by MaxImuS on
Вот ведь черт побери. Я же про alpha-test говорил в докладе на который тут все ругались что он очевидный... эх

Чтобы добавить - проблема хуже - на desktop'aх и проч. alpha-test просто портит z-cull [ну понятно вобщем что zcull это такоей недо-TBDR ;-)), плюс учитывая что вся эта штука преобрахуется унутры в шейдер - скорее всего получится какой-нить if+discard - а это тоже оптимайзу не помогает ни разу

Submitted by discouraged_one (не проверено) on
Вообщем, нужно стараться правильно выстраивать рендер и не лепить все в одно, надеясь, что gpu и так все разрулит, так? Да вроде как всегда надо было правильно выстраивать рендер без надежды что GPU сам всё разрулит :)
Submitted by BLK Dragon on
Quote:
discouraged_one писал(а):
Вот ведь черт побери. Я же про alpha-test говорил в докладе на который тут все ругались что он очевидный... эх
Чтобы добавить - проблема хуже - на desktop'aх и проч. alpha-test просто портит z-cull [ну понятно вобщем что zcull это такоей недо-TBDR ;-)), плюс учитывая что вся эта штука преобрахуется унутры в шейдер - скорее всего получится какой-нить if+discard - а это тоже оптимайзу не помогает ни разу

Про доклад твой помню, бес паники Smile В докладе ты говорил про мобильные устройства в основном, а у меня возник вопрос, почему альфа-тест так плох вообще (то бишь на десктопах). Теперь из комментов вижу в чем засада, спасибо.
Submitted by MaxImuS on
Quote:
BLK Dragon писал(а):
Да вроде как всегда надо было правильно выстраивать рендер без надежды что GPU сам всё разрулит :)

Ты смеешься, а мне с этим жить - есть люди, которым я не могу до сих пор объяснить, что эта очевидная простая вещь "спасает утопающих" Smile Для них за один фрейм отрисовать более >100 текстур Sprite'ом 8й версии (который ни хрена не оптимайз в нутри, дубовый как пробка), а потом сильно удивляются, это ж чего она так тормозит на слабых машинах... казуальная игра, итит... а требования как для кризиса :''(
Submitted by MaxImuS on
Ты смеешься, а мне с этим жить Так я и не смеюсь.
Сам регулярно подобное наблюдаю, только обычно картина гораздо забавнее т.к. приходиться утрамбовывать всё это в консоль.
Submitted by BLK Dragon on

Спасибо за статью.

Submitted by Victor on
Quote:
Victor писал(а):
Спасибо за статью.
Ну, до статьи это несколько не дотягивает :)
Submitted by BLK Dragon on

GameDev.by