Как софтрендер писал да игру написал

в 17:38, , рубрики: Gamedev, games, indie game, Steam, разработка игр

Предыстория. Так получилось, что моя юность пришлась на время появления 3д игр. Впервые увидев спектрумовский Total Eclipse я сразу стал считать 3д вершиной технологий. Вскоре появились IBM-совместимые компьютеры с известными Вольфенштейном и Думом. Я был впечатлен. Имея склонность к программированию я начал пробовать повторить их. Была середина девяностых, у меня был медленный QuickBASIC, 5х86 комп и ноль опыта. Ничего не вышло. Ну, почти ничего.

image

Наши дни. И вот в 2016-ом я подумал: а что, теперь у меня есть опыт, почему бы не поставить себе такой челлендж? А именно написать софтварный растеризатор с нуля. Софтварный тут означает что изображение строится силами CPU, не задействуя видео ускоритель. Прямо как и делались те самые шутеры девяностых.

Задача была поставлена. Я начал с несложных тестов быстродействия: залить память фиксированным цветом и отобразить ее. На экран я выводил функцией StretchDIBits, у нее много аналогов и ее работа здесь просто отправить мой буфер на экран. И первые же тесты показали что с быстродействием плохо. В 1920х1080 даже простая заливка цветом и оправка на экран уже просаживала фпс до 200. А ведь мне надо было формировать 3д и не цвет заливать, а текстурированные полигоны.

И я решил, что единственный вариант это рендер без overdraw. Тут надо пояснить, что основная масса советов по написанию своего рендера сводится к текстурированию полигона, а сами полигоны предлагается выводить от дальнего к ближним, один за другим. Я и сам так делал в девяностые, пытаясь повторить Дум.

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

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

В процессе написания движка я устроил фестиваль, где предложил повторить предложенную сцену на обычных GPU движках. К моей радости, иногда софтовый рендер даже опережал.
Вот тут: www.gamedev.ru/code/forum/?id=219212

image

Это было вдохновляюще и я решил идти дальше.
А что, почему бы не сделать мечту до конца и не написать шутер? Вот прямо шутер из девяностых!

Решив так, я стал выбирать основные моменты реализации. Первым делом подумал о типе монстров. В ранних шутерах, это Вольфы, Думы, Херетик с Хексеном — враги были сделаны в виде 2д билбордов. В шутерах поздних начиная с Квейка враги уже полигональные, в полном 3д. И дело такое, мне 2д враги Херетика и Хексена нравились гораздо более, чем враги Квейков. Было свое очарование в 2д рисовке. Хотя 2д требовало существенно дольше работы, ведь требовалось рисовать врага со всех сторон, я выбрал его. 2д билборд, рисованый.

Скриншот: 2д билборд vs полное 3д.
image

Также требовалось решить как создавать игровые уровни. Игры тех лет обычно имели свой редактор вершин, но я решил идти иначе. Я подумал, что чем писать свой редактор 3д, проще сделать загрузку моделей из .obj. Ведь редактор лучше к примеру Блендера я вряд ли бы написать смог. И скажу что решение это принесло пользы цельный вагон: я не был стеснен в объектах игрового уровня совершенно. Моделя что хочу несмотря что Блендер осваивал впервые.

Касаемо арта я мудрить не стал. В Хексене есть набор карт с осенью и туманом, я любил их тогда и теперь без раздумий начал с подобного стиля. Коричневая листва, осень, туман, вечер. А дальше завертелось: приобретя первый опыт с Блендером начал вспоминать яркие образы из своих снов и отражать их в игре. Так появился уютный подвал с трубами, потом ночь с сухими деревьями, смотрящими в небо.

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

Саму игру я выложил в Стим, так получилось что мне нужны деньги. Собственно, как и всегда. Если есть желание, буду рад любой поддержке: и отзывам об игре и критике и просто любым добрым словам.
Играйте в шутеры!

Ссылка на игру, Autumn Night 3D Shooter: store.steampowered.com/app/581730/Autumn_Night_3D_Shooter

image

Автор: sb3d

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js