Начну с того, что в 2025 году я начал активно искать работу. Хотелось найти что-то удалённое, в идеале — программистом: сайты, веб-приложения, backend, всё такое. Но пока ищешь работу, всё равно нужно чем-то занимать голову.

И тут я вспомнил, что с детства мне был интересен моддинг.

Скачал S.T.A.L.K.E.R., чтобы просто убить время, побегать по Зоне, вспомнить атмосферу. Но в процессе поймал себя на мысли: а почему бы не попробовать сделать мод самому?

Сначала это звучало как обычная идея “на вечер”. Но чем дальше я разбирался, тем сильнее понимал, что меня интересует не просто добавить новый костюм, пушку или пару правок в конфиги. Мне стало интересно залезть глубже — в сам движок и рендер.

Проблематика OGSR R4

Я ходил по Зоне, и в целом всё было здорово. Атмосфера на месте,Но при этом постоянно бросались в глаза ограничения.

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

Туман, конечно, создаёт настроение, но это не уровень современных игр вроде RDR2, где атмосфера буквально состоит из света, воздуха, влажности, глубины и сложного взаимодействия окружения с освещением.

И самое забавное: на моей RTX 5070M игра нулевых годов на ультра-настройках выдаёт примерно 80–100 FPS, да ещё и со статтерами. С одной стороны, вроде бы много. С другой — это S.T.A.L.K.E.R., а не современный AAA-проект с огромными сценами, физикой, толпами NPC и продвинутым global illumination. Возникает логичный вопрос: почему так?

Я начал разбираться и вспомнил, что уже не раз читал: DirectX 10 и DirectX 11 в оригинальных играх серии в своё время во многом добавлялись не как полностью переосмысленная архитектура, а скорее как быстрый технологический апгрейд. В том числе и для того, чтобы на коробке можно было написать про поддержку новых графических API.

Конечно, за годы моддеры сделали огромную работу. Особенно ребята из OGSR. Они многое улучшили, переделали, почистили и привели в более живое состояние. R4 — это уже не просто “тот самый старый рендер”. Это сильно доработанная часть движка, которая дала S.T.A.L.K.E.R. вторую жизнь.

Но фундамент всё равно остаётся старым.

Проблема R4 не в том, что он “плохой”. Проблема в том, что он вырос из архитектуры, которая изначально не проектировалась под современные сцены, современные GPU и современные способы работы с графикой. Это не новый дом, построенный с нуля. Это скорее старый дом, который много раз ремонтировали, укрепляли, достраивали, меняли проводку, перекрашивали стены и ставили новые окна. Жить можно. Иногда даже красиво. Но если в какой-то момент ты хочешь надстроить ещё десять этажей — начинаются вопросы к фундаменту.

Даже такая, казалось бы, простая вещь, как трава до горизонта или лужа воды в которую стрляешь, превращается в проблему. На первый взгляд: ну что там трава? Несколько полигонов, шейдер, текстура, альфа, ветер — и всё. Но когда таких объектов становятся десятки и сотни тысяч, старый подход начинает захлёбываться. Упираешься не только в видеокарту, а в организацию данных, draw calls, culling, загрузку ресурсов, синхронизацию, работу CPU с GPU и общую архитектуру рендера.


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


Деревья — GPU-куллинг + indirect

Похожая история. tree_cull.comp: один поток на дерево, тест bounding sphere против фрустума, выжившие атомарно дописывают VkDrawIndexedIndirectCommand в свою секцию буфера. Дальше — один vkCmdDrawIndexedIndirectCount на группу. CPU не перебирает деревья в цикле и не строит дроколлы.

Трава целиком на GPU

В оригинале детейл-объекты (трава, мелочь) распаковываются и куллятся на CPU каждый кадр — cache_Decompress. Это и есть потолок дальности.

Я выкинул это и переложил всё на один compute-шейдер (detail_generate.comp):

  • трава генерируется процедурно прямо на GPU из слотов уровня + запечённого heightmap (вместо хранения готовых инстансов);

  • там же — frustum + distance + occlusion-куллинг по HZB;

  • видимые инстансы stream-compaction'ом складываются в SSBO посекционно по типу объекта, и тут же пишутся indirect-команды отрисовки.

CPU траву вообще не трогает — отсюда и дальность. CRandom заменён на xorshift32 (детерминированный, ~в 2 раза быстрее хеша на умножениях), так что раскладка стабильна между кадрами. Бонусом — trail map: примятая под игроком трава

Скриншоты немного с разных этапов разработки, но уже сейчас многое работает. Более того — это уже проходимо.

И да, трава до горизонта теперь совершенно не проблема.

CPU↔GPU синхронизация без столлов

То, что в статье названо «синхронизацией CPU и GPU», на практике — это CFrameRingAllocator: один большой персистентно-замапленный буфер (VMA), порезанный на регионы по числу кадров в полёте. Каждый кадр — bump-аллокатор в своём регионе: CPU пишет в текущий, GPU читает прошлый, гонок нет и vkMapMemory каждый кадр не дёргается. Один буфер обслуживает и UBO, и SSBO; если память host-coherent — флашей тоже нет.

Мелочь, которая убирает фризы

Дисковый кэш пайплайнов (vk_pipeline_cache.bin): VkPipelineCache сериализуется на диск и на следующем запуске даёт warm-start. UUID-заголовок драйвера/GPU инвалидирует кэш сам при смене железа, так что грузить его всегда безопасно. Барьеры — через Synchronization2 с автоматическим выводом stage/access из layout, без ручной расстановки.

Работы, конечно, впереди ещё очень много. Это всё ещё не финальный релиз, не “готовый продукт” и не магическая кнопка “сделать S.T.A.L.K.E.R. современным”. Но фундамент уже есть, и он постепенно становится всё крепче.

Для меня этот проект важен не только как технический эксперимент. Я думаю, что если довести Vulkan-рендер до нормального состояния, он может дать OGSR и вообще X-Ray-моддингу новый запас прочности.

S.T.A.L.K.E.R. — это игра, которую до сих пор любят не из-за количества полигонов. Её любят за атмосферу, за ощущение опасного живого мира, за эту странную смесь тоски, свободы, грязи, одиночества и любопытства. И было бы круто, если бы технически она могла жить дальше не только на энтузиазме моддеров, но и на более современном фундаменте.

Даже если я сам не доведу всё до идеала, я надеюсь, что кто-то другой сможет подхватить эту работу и донести её дальше.

Потому что задача здесь не просто “переписать рендер на Vulkan”.

Задача — дать Зоне шанс оставаться актуальной ещё много лет.

Комментарии (0)