Предыстория. Так получилось, что моя юность пришлась на время появления 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
Поделиться с друзьями
-->

Комментарии (27)


  1. Rast1234
    09.05.2017 21:13
    +1

    Выглядит игра красиво, а кстати BLOOD видели? Фишка с замедлением понравилась. Пока не купил, только ролик посмотрел.

    Организовав полигоны и текстуры в памяти самым остроумным образом я смог этого добиться
    я не спец по движкам, но не про BSP-дерево ли речь? Вообще, можно больше технических деталей?


    1. sb3d
      09.05.2017 21:58
      +1

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


  1. Andrey_Volk
    09.05.2017 21:15
    +1

    Здорово. Наверное у вас неплохие шансы идти в геймдев :)


    1. AllexIn
      09.05.2017 21:43
      +4

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

      UPD:
      Как правило игры автора покупаю незадумываясь, просто чтобы поддержать его. Не уверен что когда нибудь созрею попробовать Путь золота и стали… Просто запускать боюсь. :) Но купил сразу после выхода.


      1. DenimTornado
        09.05.2017 23:01
        +2

        Вот такой должна быть реклама) Пошёл на Стим за играми автора))

        п.с. Само собой первым делом посмотрю Путь золота и стали


        1. sb3d
          10.05.2017 12:38

          Спасибо за такую поддержку конечно.
          Однако я хочу чтобы ценили сами игры, и если они не оч то я против покупок ради поддержки. Это не совсем честно я думаю.


  1. ukt
    09.05.2017 23:07

    Хочу видео посмотреть, есть?


    1. sb3d
      09.05.2017 23:31
      +2

      Основное видео есть на самой странице игры в Стиме.
      Но если что, вот оно-же на ютубе:

      +++


  1. datacompboy
    10.05.2017 00:00

    Прелестно!


  1. DinoAsm
    10.05.2017 00:38

    Забавно. По процессору мой комп требованиям удовлетворяет, но заявленную Windows 7 на нем запустить так и не удалось (хоть и в виртуалке).


    1. sb3d
      10.05.2017 12:35
      -1

      На 32-битной XP игра обязана работать. А вот про 64-битную не уверен, возможно Стим в этом случае подсунет 64-битный билд игры, а он вероятно уже начиная с семерки только.

      Если вдруг кто-то скачает из под 64-бит XP, скажите, как там. Вопрос главным образом в том, какой билд Стим дает для этой операционки.


  1. MrShoor
    10.05.2017 03:03
    +7

    Публикацию по хорошему надо размещать в хабе «Я пиарюсь». Потому что касательно разработки игр тут практически ничего.


    1. AllexIn
      10.05.2017 10:08
      +7

      По хорошему надо не статью переносить, а дополнить её до полноценного материала.
      Полагаю автору это просто нафиг не надо… И это печально.


  1. chirkin
    10.05.2017 08:39
    +2

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

    Иными словами, автор написал трассировщик лучей (ray tracing)? Странно, что в статье этот термин ни разу не появился.


  1. Leopotam
    10.05.2017 09:17
    +2

    Ничего не сказано о самой реализации. Самое простое, что приходит на ум — это S-buffer:
    https://www.gamedev.net/resources/_/technical/graphics-programming-and-theory/s-buffer-faq-r668
    http://graphicon.ru/html/2000/RENDERING/boreskoff.pdf


  1. kordenv
    10.05.2017 12:26

    спасибо за статью, скажите пожалуйста, а на чем написана игра? какой язык?


    1. sb3d
      10.05.2017 12:32

      Написана на с++. Язык на мой взгляд имеет плюс в том что существует много его реализаций. Компиляторы есть от Борланда, Ватком, GCC, Майкрософта, Интела, Кланг есть. Таким образом я не завишу от единственного источника, который мало ли что может выкатить. Грустные истории пользователей GameMaker'а подтвердят.

      Инструменты я использовал такие: Code::Blocks, Gimp, Blender, Aufacity, Sleepy.
      Связь с системой через: WINAPI либо через SDL2 для нативных линукс билдов. Которые однако в Стиме использовать не стал.


      1. kordenv
        10.05.2017 12:56

        большое спасибо за подробный ответ :-)


      1. DinoAsm
        10.05.2017 19:10

        А вы пробовали собирать ее на разных компиляторах? Не возникало ли проблем с этим? Я чего спрашиваю, мне интересно, насколько совместимы все эти компиляторы между собой и со стандартом. Не знаю как в стандарте, а вот в учебниках многие важные нюансы опущены, что не внушает оптимизма. Например, я так и не нашел подробной таблички с правилами видимости при наследовании классов для переменных и методов. И вообще, прикручивать объекты к кросс-платформенному ассемблеру мне до сих пор не кажется удачной идеей.


        1. sb3d
          11.05.2017 13:44

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


  1. 4c74356b41
    10.05.2017 12:38

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


    1. sb3d
      10.05.2017 12:42
      +2

      А почему нет. Шутан, бодрый, бегай-стреляй. Я сам играю в такие, те же Дум и Херетик. Отдохнуть за ураганным экшеном, мне кажется это всегда хорошо.


      1. Rast1234
        15.05.2017 09:46

        а видели рекламные ролики Strafe и что в итоге за игра вышла? Вам бы такую рекламу :)


    1. DinoAsm
      10.05.2017 19:21
      +1

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


      1. 4c74356b41
        11.05.2017 08:24

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


        1. lieff
          11.05.2017 11:25
          +1

          Со старыми играми проблема, что все что нравятся, уже играны все, или почти все. А эта в стиле хексен (который мне нравится) и новая. Я вот horizon zero dawn недавно прошел, а на компе у меня gtx980, но я бы вполне поиграл и в такое. Была бы под линукс выложена, было бы вообще шикарно.


  1. msts2017
    10.05.2017 13:12

    ооо, ностальгическое чувство тошноты от переиграния (посмотрел видео), 20 лет прошло а до сих пор пробивает.