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

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

    Comments 27

      +1
      Выглядит игра красиво, а кстати BLOOD видели? Фишка с замедлением понравилась. Пока не купил, только ролик посмотрел.
      Организовав полигоны и текстуры в памяти самым остроумным образом я смог этого добиться
      я не спец по движкам, но не про BSP-дерево ли речь? Вообще, можно больше технических деталей?
        +1
        Спасибо.
        Больше деталей можно, но их реально много. Наверное это уже задача даже не отдельной статьи, а цикла статей. Поэтому здесь технические моменты даны в общем виде, я обозначил самые основные решения.
        +1
        Здорово. Наверное у вас неплохие шансы идти в геймдев :)
          +4
          Автор и так в геймдеве поуши. У него несколько достаточтоно известных, хоть и нишевых проектов на стиме, которые прошли гринлайт, когда там еще был фильтр по качеству.

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

            п.с. Само собой первым делом посмотрю Путь золота и стали
              0
              Спасибо за такую поддержку конечно.
              Однако я хочу чтобы ценили сами игры, и если они не оч то я против покупок ради поддержки. Это не совсем честно я думаю.
          0
          Хочу видео посмотреть, есть?
            +2
            Основное видео есть на самой странице игры в Стиме.
            Но если что, вот оно-же на ютубе:

            +++
            0
            Прелестно!
              0
              Забавно. По процессору мой комп требованиям удовлетворяет, но заявленную Windows 7 на нем запустить так и не удалось (хоть и в виртуалке).
                –1
                На 32-битной XP игра обязана работать. А вот про 64-битную не уверен, возможно Стим в этом случае подсунет 64-битный билд игры, а он вероятно уже начиная с семерки только.

                Если вдруг кто-то скачает из под 64-бит XP, скажите, как там. Вопрос главным образом в том, какой билд Стим дает для этой операционки.
                +7
                Публикацию по хорошему надо размещать в хабе «Я пиарюсь». Потому что касательно разработки игр тут практически ничего.
                  +7
                  По хорошему надо не статью переносить, а дополнить её до полноценного материала.
                  Полагаю автору это просто нафиг не надо… И это печально.
                  +2
                  Итого, я решил писать растеризатор как линейный цикл по экранному буферу. В один проход, последовательно. Организовав полигоны и текстуры в памяти самым остроумным образом я смог этого добиться.

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

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

                        Инструменты я использовал такие: Code::Blocks, Gimp, Blender, Aufacity, Sleepy.
                        Связь с системой через: WINAPI либо через SDL2 для нативных линукс билдов. Которые однако в Стиме использовать не стал.
                          0
                          большое спасибо за подробный ответ :-)
                            0
                            А вы пробовали собирать ее на разных компиляторах? Не возникало ли проблем с этим? Я чего спрашиваю, мне интересно, насколько совместимы все эти компиляторы между собой и со стандартом. Не знаю как в стандарте, а вот в учебниках многие важные нюансы опущены, что не внушает оптимизма. Например, я так и не нашел подробной таблички с правилами видимости при наследовании классов для переменных и методов. И вообще, прикручивать объекты к кросс-платформенному ассемблеру мне до сих пор не кажется удачной идеей.
                              0
                              Я собирал на всех перечисленных, но я пишу код не используя многих возможностей с++. У меня ведь небольшие проекты одного человека, поэтому для сложной структуры классов нет особых причин.
                          0
                          ну если отбросить тот факт что движок самописный от этой игры ничего не остается, т.е. лет 20 назад, возможно это было бы кому-то интересно, а сейчас?
                            +2
                            А почему нет. Шутан, бодрый, бегай-стреляй. Я сам играю в такие, те же Дум и Херетик. Отдохнуть за ураганным экшеном, мне кажется это всегда хорошо.
                              0
                              а видели рекламные ролики Strafe и что в итоге за игра вышла? Вам бы такую рекламу :)
                              +1
                              А сейчас это глоток чистого воздуха для тех, кто отказался покупать новый комп в том числе потому что эта железка, если не сломается, должна прекрасно выполнять те же самые функции и через десять лет, что бы там ни говорили маркетологи с их запланированным устареванием. Раздражает, что на новые более мощные компы пишут программы с ровно тем же функционалом, но отжирающие в разы больше ресурсов, чувствуется какой-то обман. Хоть и понятно, что купить новую железку и навязать ее потребителю дешевле, чем оплачивать дополнительный труд программистов.
                                0
                                вообще не имеет никакого отношения к этой игре, есть сотни игр которые запустяться на старом железе, я уверен это далеко не лучшая из них.
                                  +1
                                  Со старыми играми проблема, что все что нравятся, уже играны все, или почти все. А эта в стиле хексен (который мне нравится) и новая. Я вот horizon zero dawn недавно прошел, а на компе у меня gtx980, но я бы вполне поиграл и в такое. Была бы под линукс выложена, было бы вообще шикарно.
                              0
                              ооо, ностальгическое чувство тошноты от переиграния (посмотрел видео), 20 лет прошло а до сих пор пробивает.

                              Only users with full accounts can post comments. Log in, please.