Предыстория. Так получилось, что моя юность пришлась на время появления 3д игр. Впервые увидев спектрумовский Total Eclipse я сразу стал считать 3д вершиной технологий. Вскоре появились IBM-совместимые компьютеры с известными Вольфенштейном и Думом. Я был впечатлен. Имея склонность к программированию я начал пробовать повторить их. Была середина девяностых, у меня был медленный QuickBASIC, 5х86 комп и ноль опыта. Ничего не вышло. Ну, почти ничего.
Наши дни. И вот в 2016-ом я подумал: а что, теперь у меня есть опыт, почему бы не поставить себе такой челлендж? А именно написать софтварный растеризатор с нуля. Софтварный тут означает что изображение строится силами CPU, не задействуя видео ускоритель. Прямо как и делались те самые шутеры девяностых.
Задача была поставлена. Я начал с несложных тестов быстродействия: залить память фиксированным цветом и отобразить ее. На экран я выводил функцией StretchDIBits, у нее много аналогов и ее работа здесь просто отправить мой буфер на экран. И первые же тесты показали что с быстродействием плохо. В 1920х1080 даже простая заливка цветом и оправка на экран уже просаживала фпс до 200. А ведь мне надо было формировать 3д и не цвет заливать, а текстурированные полигоны.
И я решил, что единственный вариант это рендер без overdraw. Тут надо пояснить, что основная масса советов по написанию своего рендера сводится к текстурированию полигона, а сами полигоны предлагается выводить от дальнего к ближним, один за другим. Я и сам так делал в девяностые, пытаясь повторить Дум.
И этот вариант был отброшен по двум причинам. Во первых, если у нас в сцене несколько полигонов один за другим, отрисовка от дальних к ближним даст overdraw, иными словами пиксель мы будем перекрашивать несколько раз. Во вторых, отрисовка по полигонам будет вызывать частые кэш-промахи по экранному буферу. Ведь треугольники расположены произвольно.
Итого, я решил писать растеризатор как линейный цикл по экранному буферу. В один проход, последовательно. Организовав полигоны и текстуры в памяти самым остроумным образом я смог этого добиться. Стоит сказать, что однопроходный растеризатор помимо прочего хорошо распараллеливается, заметно лучше чем по-полигонное закрашивание.
В процессе написания движка я устроил фестиваль, где предложил повторить предложенную сцену на обычных GPU движках. К моей радости, иногда софтовый рендер даже опережал.
Вот тут: www.gamedev.ru/code/forum/?id=219212
Это было вдохновляюще и я решил идти дальше.
А что, почему бы не сделать мечту до конца и не написать шутер? Вот прямо шутер из девяностых!
Решив так, я стал выбирать основные моменты реализации. Первым делом подумал о типе монстров. В ранних шутерах, это Вольфы, Думы, Херетик с Хексеном — враги были сделаны в виде 2д билбордов. В шутерах поздних начиная с Квейка враги уже полигональные, в полном 3д. И дело такое, мне 2д враги Херетика и Хексена нравились гораздо более, чем враги Квейков. Было свое очарование в 2д рисовке. Хотя 2д требовало существенно дольше работы, ведь требовалось рисовать врага со всех сторон, я выбрал его. 2д билборд, рисованый.
Скриншот: 2д билборд vs полное 3д.
Также требовалось решить как создавать игровые уровни. Игры тех лет обычно имели свой редактор вершин, но я решил идти иначе. Я подумал, что чем писать свой редактор 3д, проще сделать загрузку моделей из .obj. Ведь редактор лучше к примеру Блендера я вряд ли бы написать смог. И скажу что решение это принесло пользы цельный вагон: я не был стеснен в объектах игрового уровня совершенно. Моделя что хочу несмотря что Блендер осваивал впервые.
Касаемо арта я мудрить не стал. В Хексене есть набор карт с осенью и туманом, я любил их тогда и теперь без раздумий начал с подобного стиля. Коричневая листва, осень, туман, вечер. А дальше завертелось: приобретя первый опыт с Блендером начал вспоминать яркие образы из своих снов и отражать их в игре. Так появился уютный подвал с трубами, потом ночь с сухими деревьями, смотрящими в небо.
В итоге работа над проектом принесла море радости. Это не идеальная игра, ни в коем случае, вы должны это знать. Но время пока я делал ее — тонна фана и позитива, плюс исполнение детской мечты сделать свой шутер девяностых.
Саму игру я выложил в Стим, так получилось что мне нужны деньги. Собственно, как и всегда. Если есть желание, буду рад любой поддержке: и отзывам об игре и критике и просто любым добрым словам.
Играйте в шутеры!
Ссылка на игру, Autumn Night 3D Shooter: store.steampowered.com/app/581730/Autumn_Night_3D_Shooter
Автор: sb3d