Игра мечты

Уже много лет я медленно, но верно(?) делаю свою игру мечты Прерываясь иногда на разнообразные левые проекты, моя верность к тру хоррору с элементами головоломки - не угасает

История начиналась так

Когда-то во времена мезозоя (примерно 20010 год) я начал изучать Blitz3D Отличный движок если ты решил войти в геймдев, а твоих познаний в программировании хватает на написание echo "Hello world"... На изучение самых основ ушло примерно пару месяцев, и через этот короткий срок я уже знал не только простые логические операции, но и циклы, массивы данных итд, благодаря постоянным работам в 3ds max, в котором я делал 3д модельки для блица, я более менее обучился основам 3д моделирования. Тогда я понял, что программирование может быть не занудным сидением и разбором алгоритмов, а более менее интересным и творческим процессом. Свои потуги в геймдеве я особо никому не показывал, а программирование уехало в далекий и глубокий ящик на N лет.

Первый блин вертексом

Спустя N лет, году этак в 2011 я решился возродить свой мини проект, ессесно это был убер убийца gta (на тот момент 4) Ничего сложного я сделать и не пытался. Был Blitz3D, к нему я прикрутил PhysX для обработки физики, взял стандартный пример машинки на физиксе, и принялся обтачивать все. Машинка взята из конверта для Gta sa ( о моддинге гта са я еще напишу, целая часть моей жизни), домики и модельки брал из тех же конвертов. Дабы все было "КРАСИУО", я прикрутил библиотеку FastExt. На тот момент мой старичок на Celeron 1.7Ghz и Mx440 вполне себе выдавал 30фпс при таком сетапе, и графика мне казалась вполне приемлемой ! Вертесные светильники для фар, тени которые проезжают через все, цикл дня и ночи который менял небо и амбиент, ну чем не гта 4 ? :D
Видео первых билдов сей поделки

Надо больше эффектов

Графика была конечно не плохая, но хотелось больше, поэтому я стал экспериментировать с разными эффектами. Как работают POST эффекты я и не знал, поэтому пытался сделать какой никакой рельеф да блеск, и хотя мелкие тесты работали, глобально идея провалилась. Эффект бампа со спекуляром делался через блендинг текстур и не мог принимать свет, а спекуляр был направлен фиг знает куда, поэтому я забил на эту идею, хотя пара видео с того времени тоже осталась.

Новое железо

Тут нужно сказать, что я переехал на новое железо, моего старика заменил ноутбук. Acer 6930g, на борту Core 2 Duo t6500, 4гб оперативки и Radeon 4650. а на дворе Core I3 i5 i7 :D Конечно не верх технологий, но именно он развязал мои руки, и открыл мир недоступных на от момент шейдерных эффектов ! Вот только блиц их не умел...

Одной машинкой сыт не будешь, поэтому я убил месяц, но написал нормальный контроллер для игрока от первого лица. А так же начал пилить систему оружия, но дальше статической модели пушки и кода стрельбы дело не зашло, ибо моделировать я умел, а вот анимировать нет.

Xors3D

Пару месяцев я играл с водичкой из FastExt и отражениями в Ashadow, и принципе все было хорошо но как всегда что то мне не нравилось - АЛЬЯСИНГ, он убивал мои глаза я был готов на все что бы его убрать. Переходить на другой двиг ввиду незнакомого синтаксиса не очень хотелось, на форумах я увидел его... XORS3D Первый смотр меня немного отпугнул, добавлять в начале каждой команды X было не трудно, но после перевода некоторых проектов на него, появились некоторые проблемы с камерой, освещением, текстурами итд. А уж про то что физика не работала никак я говорить не буду.

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

Притирки

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

Портировал свой старый мега гта

Даже пытался сделать свой портал 3

Знакомство которое изменило жизнь

Жизнь шла своим чередом, идея хоррора витала в голове и облаках, но я понимал, что не потяну один, поэтому просто забил. На одном из форумов по Gta я познакомился с человеком под ником PetkaGTA, он пилил свой прект под названием SaRender. Его проект являлся модом, и добавлял шейдеры в гта са, а эти шейдеры творили что-то невообразимое - тени, тонна света, отражения! И все это добавляло огромных возможностей (как мне казалось на тот момент). Я списался с ним и попросил о помощи, подкорректировать пару вещей в шейдере, да скинуть код снега =D

Общаясь с петькой некоторое время я поделился с ним идеей своего проекта и она похоже понравилась ему ! Первое время он говорил о деферрреде но при этом подчеркивая что это будет сложно и долго, и я сопротивлялся его разработке. Поэтому я делал движок, а петька запилил вроде не плохое освещение на Forward рендере.

Отложенная жизнь

Форвард меня конечно устраивал, но скорость игры не радовала, а почти полное отсутствие гибкости удручало. Поэтому через N времени я пришел к выводу - деферреду БЫТЬ ! Найдя нужные команды для МРТ (Multiple Render Target) я написал основу кода которая создавала текстуры, рендерила туда то что скажет шейдер а потом передавала это добро на полноэкранные квады, где второй шейдер должен был творить свои дела. Из семпла мрт который бал в поставке ксорса, петька написал шейдер который выдавал простой гбуффер, Альбедо и карта нормалей с глубиной в альфа канале. Дальше все он же написал шейдер готорый работал с гбуффером и делал светильники которые чуть позже рисовались на квады. Сказать что это было красиво? нет.. Но зато какой потанцевал! В шейдерах я на тот момент смыслил никак, поэтому все правки вносились петькой. Первая версия деферреда не умела в цвет светильников, имела баги, немного странный спекуляр (полосы на нем были, артефакт сжатия нормали). Ну и естественно система материалов отсутствовала.

Каждый день 24/7 мы сидели в скайпе и работали над игрой. Освещение становилось все сложнее и интереснее, а я понял весь потенциал шейдеров и начал изучать их. В Deferred я залезть вообще боялся, ибо такие конструкции я никогда не видел, а от одного их упоминания у меня подкашивались ноги и темнело в глазах.
А вот на простые вещи как пост эффекты я быстро приловчился! Сохраняем картинку в текстуру, делаем ее темнее, умножаем на текстуру пыли и добавляем к экрану - DirtyLens ГОТОВ =D

Сам движок не терпел сильных изменений, все что менялось это система загрузки карты и динамических объектов. По мелочи дорабатывался код управления игроком да добавлялись фичи типо триггеров

Я дорабатывал движок а петька по-тихому работал со светом, были поправлены проблемы с нормалями, а самое главное были добавлены тени ! На них было убито много времени, но оно того стоило. Картинка заиграла цветами и заимела контраст, а в купе с красивой медией выдавала графику хорошего уровня.

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

Развал

Раздел в разработке

Становление на путь шейдерный

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

Со временем я стал осваиваться в деферреде, понял, как оно работает, как должно работать, начал смотреть какие техники используют другие движки и как это смотрится.
Первым своим эффектом я добавил Box projected cubemap. Код конечно подсмотрел в гугле, но реализация в деферреде потребовала больших усилий от меня, а так же сильных изменений кода. Результат не заставил себя ждать. Классные отражения, которые не тормозили пк! Конечно было одно но, они не работали если сдвинуть их хотя бы на единицу, и это была проблема которую я не мог решить, поэтому тупо забил.

Первым действительно крупным обновлением деферреда от меня оказался код спотлайта. Я убил на него пару вечеров, но после вымучивания и корректировки всего, и вся он заработал. Профит такого уровня сильно прибавил мне сил и желания работать! Конечно можно сказать что в одном из видео выше спотлайты тоже присутствуют, но они были кривыми и с очень острыми краями, смысла в доработке такого спотлайта я не видел. Тем более я не понимал как он работает ибо код был написан петькой.

Второе крупное обновление - система прозрачных объектов. То чем я долбил петьку целыми днями, я смог сделать сам. В этом деле советами помог очень хороший человек с булки - Mr F. Благодаря ему я понял многие ошибки, которые были в коде, и фиксил их. С его советов я собсно и совершил прозрачный прорыв и получил те самые желанные прозрачные поверхности.

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

Ну и обновления по мелочи, по типу нового меню

Переломный момент наступил когда фпс на моем пк стал проседать до 35.. А код стал на столько громоздким что редактор подтапливал при листании. Это был провал.

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

Возрождение

Спустя пару месяцев отдыха я вернулся к проекту и принял самое правильное решение - переписать деферред с нуля. Работа заняла несколько недель но это стоило того. Я полностью избавился от полноэкранных квадов для света, был написан свой вариант гбуффера в котором были места для материалов, убраны артефакты нормалей, многие эффекты получили оптимизацию. Была добавлена нормальная система материалов, обновлены все алгоритмы для обрисовки света на экране. Тени наконец были оптимизированы до нормального уровня!
От старого кода не осталось ничего, деферред сиял на свету и издавал аромат свеже купленной мебели. Переписание деферреда подняло мои скилы работы с шейдерами до невиданного уровня (в сравнении с тем, что было =) А самое главное это производительность! Старые сцены показывали пятикратный прирост в фпс, и при заполнении светом и эффектами он почти не падал !

Свет работал, все было красиво, но дико не удобно.
Свет создавался предельно просто, в папке с игрой лежал текстовый фалик в котором было имя и цвет пресета. Я шел в 3ds max, создавал кубик, ставил ему имя пресета и двигал его куда надо на карте. после чего карту экспортировал в игру и смотрел что получилось. Если не понравился свет то шел в макс, двигал кубик, экспортировал, смотрел. Такая система работала год и вроде проблем не имела, но удобство у такого способа как у велосипеда с квадратными колесами.
Поэтому было принято решение - писать редактор.

Первый прототип редактора не умел ничего интересного. Создан из семпла ксорса, все что можно сделать - создать светильник и выбрать его пресет.

Второй прототип был на много интереснее.
Я полностью отказался от системы пресетов и сделал полноценный редактор параметров света, теперь можно было создавать редактировать удалять свет. Так же в редакторе появился раздел физики, где можно было накидать объектов, настроить их массу, сделать ломаемым, сделать дверью, заставить крутится итд.

Последняя версия редактора на данный момент не сильно изменилась, был добавлен редактор системы отражений, а также параметры для света и физики. ну и более удобное управление вращением и перемещением объектов

Так же по-тихому пилил эффекты, например, такие вот лучи.

Разобрался с алгоритмами наэкранных отражений

Сделал офигительной но при этом Фейковый объемный свет

Ну и последний мой подвиг - SSAOa