Обновить

Комментарии 7

Рендер теней и в целом освещение в сталкерах всегда были головной болью. Сейчас в основном их пытаются подменять ReShade'ом или при помощи Screen Space Shaders, но эффект нестабильный - да и артефактов хватает, он все-таки работает поверх движка.
Респект за переписывание Xray, которому в этом году уже 19 лет

P.S. Чисто теоретически - насколько сложно данные решения переносить между различными версиями движка (Monolith от Anomaly, OGSR Engine, оригинал, OpenXray, Advanced Xray, etc)? И решает ли сам по себе переход на Vulkan проблему малопоточности Xray, или все равно нужны движковые правки?

Переносить наработки между Monolith и OGSR и т.д. на самом деле довольно запарно. Местами — особенно: например, в Monolith некоторые вещи прямо в графическом движке управляются через Lua, и разобраться в этом — отдельная история. Что касается логического движка — за годы сообщество его местами довольно сильно прокачало, так что жить можно. А его бутылочное горлышко в виде слабой многопоточности частично решается переносом рендера на GPU. Собственно, поэтому многое из рендера я перевёл на полный GPU-driven (на текущий момент — трава, статика, деревья, освещение)Это частично снимает нагрузку с CPU и обходит узкое место движка.

Очень классная статья! Не скажу что понял всё, но вопросы с CSM мне оказались интересны. Как специалиста - спрошу у вас сложное как раз по теме рендера :)

Как XRay борется со взрывным ростом Draw Call при рендеринге леса? Допустим, у нас лес:

  1. 5 видов деревьев,

  2. У каждого 3 LOD-а,

  3. Каждое в 1 индивидуальный материал.

В итоге, выходит 15 независимых вариантов. Если у нас 4 каскада теней, то в худшем случае у нас выходит 5*3*4 = 60 draw call чисто на тени. А это довольно много!

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

60 draw call чисто на тени. А это довольно много!

В Doom 2016 в UI каждый квадрат отдельным дроуколом рисовали и все равно это наиболее оптимизированый рендер того времени) Сам по себе draw call почти бесплатный.

Статья помечена как "сложная". И, видимо, основная сложность в грамматике автора 😁

Но в чем отказать невозможно, так это в полезности. Очень захватывающая статья. Спасибо!

Поэтому сцена разбивается на несколько «каскадов» (вложенных областей разного размера), и для каждого рендерится своя карта теней.

Для каскадов обычно разбивают по глубине фрустум камеры, поэтому области получаются не вложенные, а только частично пересекающиеся, ну кроме случаев, когда камера плюс-минус параллельна солнцу.

Сделал два каскада $4096 \times 4096$ (на 25 и 60 метров вокруг камеры) плюс дальнюю карту теней.

Это какой-то оверкилл. К примеру, в Detroit Become Human до 4 каскадов 1440х (чаще 2-3).

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации