Начну с того, что в 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”.
Задача — дать Зоне шанс оставаться актуальной ещё много лет.