Как стать автором
Обновить

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

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

image

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

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

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

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

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

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

image

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

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

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

image

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

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

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

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

Играйте в шутеры!

image
Теги:
Хабы:
+49
Комментарии27

Публикации