company_banner

Его ворсейшество из 11 полигонов, ничего общего с настоящим

http://blendogames.com/news/post/2018-11-08-carpet_tech/
  • Перевод
  • Tutorial


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

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

Я думал о коврах. В частности, о красивом махровом из игры Event[0]:



Этот ковер загипнотизировал меня. Он выглядел великолепно: очень пушистый и мягкий. Это тот уровень, с которым я сравниваю все ковры.

Прямо сейчас я работаю над Skin Deep и вдруг осознал: в моей игре есть ковры. Мне нужно делать ковры!

Результат


Так выглядит финальный вариант:



А так ковер выглядит в редакторе моделей:



Он состоит всего из одиннадцати полигонов и выглядит как натуральный ковер! В общем, я доволен.

Как это работает


Я не знаю, как разработчики Event [0] делали свои ковры, но у меня была идея о возможном способе. Я вспомнил, что читал статью о технике создания меха в Shadow of Colossus. Всегда было любопытно попробовать это самостоятельно. И этот ковер стал отличным поводом.

Мой ковер состоит из нескольких слоев:



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

Вот анимации складывания слоев:





Части


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

И три текстуры, каждая из которых 1024×1024.

Текстура для пяти нижних слоев:



Для трех средних:



И для трех верхних слоев:



Важно отметить:

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

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



Заключение


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

Мне нравится решение с ковром, потому что оно простое. Оно, как отвертка — не сломается и сработало бы даже в 1996 году. В этом есть что-то прекрасное.

Pixonic

302,00

Разрабатываем и издаем игры с 2009 года

Поделиться публикацией
Комментарии 45
    +9
    надо потестить ) выглядит прикольно, но думаю на практике 11 текстур с прозрачностями не такое уж и простое решение.
      +3
      На десктопе ОК, на мобилках — неприменимо.
        +1
        Да и для десктопа с повсеместностью отложенного освещения решение так себе.
        +4
        Хорошо, что их не 11 на самом деле, а только три. Не 44 мегабайта, а 12.
      +6

      image
      Этот ковер выглядит довольно плоским, а не состоящим из длинного ворса. Может быть, достаточно карты нормалей?

        +3
        1996 тоже случайное число?
          +2
          <зануда>
          Я так понял, что это 11 слоев. Каждый прямоугольник = 2 треугольника (полигона). Итого — 22 полигона.
          </зануда>
            +1
            В Блендере полигоны не только треугольные. Наверное поэтому 11 слоев = 11 четырехугольных полигонов.
              +6
              Возможно, но автор, все же, пишет про игру, а все графические API используют треугольники для отрисовки.

              Но это я уже перебарщиваю с занудством, извините )
                +1
                Полигон — это полигон. Плоский многоугольник. Количество вершин не определено.
                Треугольник — это треугольник. Правильно считать треугольниками. Но по количеству полигонов автор не соврал.
                  +1
                  Да, я согласен. Перезанудствовал. Профдеформация.
                  0
                  все графические API используют треугольники для отрисовки.
                  GL_QUAD: я для вас что, шутка?
                    +5
                    Там всё равно на выходе тругольники. Просто прозрачно для пользователя.
                    Там неслабый такой оверхед при использовании квадов, потому что большинство(все?) драйверов тупо переделывают сами буффер в буффер трианглов.
                      –2
                      Я знаю, что видеокарта рисует все равно треугольниками, но в API подаются квады, и речь шла про API.
                        +4
                        Нет. GL_QUADS depricated начиная с 3. Так что актуальных API с квадами нету.
                          –3
                          GL_QUAD всегда доступен за счет обратной совместимости как и всякие glBegin/glEnd (по крайней мере, под Desktop).
                            +4
                            Mac OS X — это десктоп? Там нет Legacy OpenGL.
                            Плюс если вы используете OpenGL 4, то тоже не можете получить доступ к этим методам.
                            Так что хоть Legacy OpenGL и существует, его нельзя отнести к актуальным API.
                      +4
                      Нет, не шутка. Я выше даже извинился за занудство, но не могу не ответить.

                      Дело в том что нативно квады не поддерживаются еще со времен Glide, и даже если вы видите GL_QUAD — API за вас соберет его из треугольников.
                      К тому же, это deprecated и не является актуальным уже довольно давно.

                      Т.к. я сейчас залезу в серую зону легальности (ибо нельзя распространять части SDK от Sony), потому кат:
                      Заголовок спойлера
                      Я заменил некоторые латинские литеры оными из кирилицы, чтобы не вылезти в поиске

                      kРrimitivеTypеQuаdList — vеrticеs [N*4+0, N*4+1, N*4+2] аnd [N*4+0, N*4+2, N*4+3] rеndеr triаnglеs.


                      Снова прошу прощения за излишнее занудство, хотя в данном случае воспринимаю это больше как просветительную работу.
                +1
                Идея интересная, жаль видео результата нету.
                  +19

                  Честно говоря, больше на поле пшеницы похоже, чем на ковёр)

                    +5
                    Да, ворс как будто бы требует уменьшения масштаба текстуры раза в 2 или 4.
                      +1
                      В нескольких играх видел поля, сделанные именно таким способом.
                      0

                      Добавить в шейдеры изменения цвета, и будет иллюзия ветра. Ну я себе это так теоретически представляю

                        +1
                        Есть такая старая програмка от AMD — RenderMonkey, для написания шейдеров…
                        Такой шейдер для меха с тем-же принципом работы там является стандартным примером, и обойтись вполне можно одним полигоном (ака двумя треугольниками) для ковра и одной черно-белой текстурой.


                          0
                          Кстати анимированный мех тоже есть как один из вариантов этого шейдера.
                            +2
                            Всегда было интересно, как в этом можно увидеть мех. Аналогичный вопрос к «ковру» из статьи.
                            Он состоит всего из одиннадцати полигонов и выглядит как натуральный ковер!

                            нет, не выглядит…
                              +6
                              Смотреть надо не в статике просто, а в динамике.
                              Когда ты в игре в помещении перестреливаешься с врагами то не разглядываешь ворсинки на ковре, как и убегая от медведя не разглядываешь его мех.

                              Но если тебе требуются очень качественные ковры или мех, то можно конечно их получить «как настоящие», но будет это не 60 раз в секунду, а один раз в пол часа — такие ФПС тебя тоже врятли устроят…
                            +6

                            Не нужно там 11 текстур (и 3 тоже не нужно), достаточно одной, которая будет, например, в альфа-канале хранить высоту ворсинки (вряд ли ворсинка будет менять свой цвет с высотой, а если и будет, то можно сделать изменение для всех ворсинок сразу).
                            При рисовании просто сравнивать "высоту" текущего полигона с высотой ворсинки и на основении этого решать, рисовать её или нет.
                            Это позволит менять детализацию ковра на лету. Если он далеко — рисуем 2-3 прямоугольника, если близко и видом сбоку — то все 20.

                              +2
                              [offtop]

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

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

                              [/offtop]
                                0
                                Так был реализован фейковый дисплейс в октан ренедер, по крайней мере, до версии 4
                                    +2
                                    Впервые видел такое еще в Tony Hawk's Pro Skater 4, помню, как в свои 11 лет восхищался изяществом и простотой решения.Недавно использовал аналогичную технику для рендера губчатого материала. Просто, быстро и легко настраивается
                                      +4
                                      В игре Ил-2 2001 года леса такие были.
                                        0
                                        Для травы и ковров — ОК. Потому что нельзя сбоку посмотреть.
                                        Мех так делать нельзя, видно будет косяки на взгляде сбоку.
                                          +1
                                          Давным давно в самом первом Ил-2 похожим образом был реализован лес: отдельными слоями кроны деревьев, стволы и тень. Выглядело очень реалистично, пока на него не упадешь.
                                            0
                                            Вот тоже хотел про это написать. Выглядело оно реалистично, пока не начнёшь пролетать над горой, на которой эти самые деревья растут — видно сбоку эти слои.
                                            +4
                                            >>Он состоит всего из одиннадцати полигонов и выглядит как натуральный ковер!

                                            Простите великодушно, но эти 11 полигонов совершенно не похожи на ЕГО ВОРСЕЙШЕСТВО.
                                              +8
                                              Другая техника, но по сути похожая.
                                              туториал картинкой

                                                +5

                                                Да, это выглядит гораздо лучше, чем в статье)

                                                +1
                                                У вас нет случайно примера вашего ковра с рисунком. (как рисунки смотрятся)
                                                  –3
                                                  Этот ковер за 10 минут повторяется в любом редакторе.
                                                  Сделайте да посмотрите.
                                                  0
                                                  А ведь подобную технологию можно было б применять для решения давней проблемы многопользовательских шутеров — когда трава отрисовывается только в ближнем радиусе, а вдали — голый рельеф.

                                                  Ну, то есть, эта условность присутствует не только в многопользовательских и не только в шутерах — но в них это наиболее чувствительно для геймплея: залегание в траву становится не маскировкой, а «страусиным поступком». Но и в синглах как-то странно выглядит, когда всякую мелочь типа крыс вдали видно лучше, чем вблизи.

                                                  Так вот — решением было бы дублировать рельеф вторым слоем полигонов с текстурой, имитирующей тип растительности. С переменным отступом, отражающим среднюю высоту травы по зонам. Или даже несколько таких слоёв, как в этой статье. Правда, с малой детализацией — то есть практически с той же, с которой текстуры рельефа делают.

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

                                                  Разумеется, у этого решения есть свои подводные камни, но это уже нюансы.

                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                  Самое читаемое