Комментарии 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 при рендеринге леса? Допустим, у нас лес:
5 видов деревьев,
У каждого 3 LOD-а,
Каждое в 1 индивидуальный материал.
В итоге, выходит 15 независимых вариантов. Если у нас 4 каскада теней, то в худшем случае у нас выходит 5*3*4 = 60 draw call чисто на тени. А это довольно много!
Батчинг, конечно, может собрать кучу всего, но LOD-ы и прозрачность довольно сильно стреляют в коленку. Как с этим борется XRay?
Статья помечена как "сложная". И, видимо, основная сложность в грамматике автора 😁
Но в чем отказать невозможно, так это в полезности. Очень захватывающая статья. Спасибо!
Поэтому сцена разбивается на несколько «каскадов» (вложенных областей разного размера), и для каждого рендерится своя карта теней.
Для каскадов обычно разбивают по глубине фрустум камеры, поэтому области получаются не вложенные, а только частично пересекающиеся, ну кроме случаев, когда камера плюс-минус параллельна солнцу.
Сделал два каскада $4096 \times 4096$ (на 25 и 60 метров вокруг камеры) плюс дальнюю карту теней.
Это какой-то оверкилл. К примеру, в Detroit Become Human до 4 каскадов 1440х (чаще 2-3).
А скажите, в вашем рендере решается проблема практически всех игр с фонариком – когда подходишь вплотную к стене (прочитать какую-нибудь газетку на ней, если разработчики сделали там достаточную детализацию), она оказывается жутко пересвеченной. Из той же оперы – упираешь фонарик в какой-нибудь угол или груду коробок – и освещенным оказывается лишь узенькая полосочка, а вокруг тьма, хоть глаз выколи.

Virtual Shadow Maps для S.T.A.L.K.E.R. на Vulkan Как я научил солнце двигаться плавно в forward‑рендере за недорого