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

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

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



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

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

Результат


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



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



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

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


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

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



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

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





Части


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

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

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



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



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



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

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

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



Заключение


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

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

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


  1. Brightori
    29.11.2018 18:35
    +7

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


    1. Leopotam
      29.11.2018 18:51
      +1

      На десктопе ОК, на мобилках — неприменимо.


      1. AlexanderG
        30.11.2018 14:01

        Да и для десктопа с повсеместностью отложенного освещения решение так себе.


    1. Revertis
      29.11.2018 18:54
      +3

      Хорошо, что их не 11 на самом деле, а только три. Не 44 мегабайта, а 12.


      1. SmallSnowball
        29.11.2018 22:51

        Да и сжать можно, никто шумы на ковре рассматривать не будет. Так что еще меньше будет


        1. Revertis
          29.11.2018 22:53

          А разве можно сжимать в видеопамяти?


          1. SmallSnowball
            30.11.2018 00:05

            Да, для ридонли текстур без проблем. Используется блочная компрессия.
            Для DirectX11: docs.microsoft.com/en-us/windows/desktop/direct3d11/texture-block-compression-in-direct3d-11
            Для OpenGl тоже поддержка есть


  1. Alex_ME
    29.11.2018 18:59
    +2

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


  1. QDeathNick
    29.11.2018 19:10
    +1

    1996 тоже случайное число?


  1. iOrange
    29.11.2018 19:25

    <зануда>
    Я так понял, что это 11 слоев. Каждый прямоугольник = 2 треугольника (полигона). Итого — 22 полигона.
    </зануда>


    1. sergof
      29.11.2018 19:41
      +1

      В Блендере полигоны не только треугольные. Наверное поэтому 11 слоев = 11 четырехугольных полигонов.


      1. iOrange
        29.11.2018 21:13
        +1

        Возможно, но автор, все же, пишет про игру, а все графические API используют треугольники для отрисовки.

        Но это я уже перебарщиваю с занудством, извините )


        1. AllexIn
          30.11.2018 09:44

          Полигон — это полигон. Плоский многоугольник. Количество вершин не определено.
          Треугольник — это треугольник. Правильно считать треугольниками. Но по количеству полигонов автор не соврал.


          1. iOrange
            30.11.2018 18:35

            Да, я согласен. Перезанудствовал. Профдеформация.


        1. BingoBongo
          30.11.2018 13:42

          все графические API используют треугольники для отрисовки.
          GL_QUAD: я для вас что, шутка?


          1. AllexIn
            30.11.2018 13:49

            Там всё равно на выходе тругольники. Просто прозрачно для пользователя.
            Там неслабый такой оверхед при использовании квадов, потому что большинство(все?) драйверов тупо переделывают сами буффер в буффер трианглов.


            1. BingoBongo
              30.11.2018 13:53

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


              1. AllexIn
                30.11.2018 13:55

                Нет. GL_QUADS depricated начиная с 3. Так что актуальных API с квадами нету.


                1. BingoBongo
                  30.11.2018 14:00

                  GL_QUAD всегда доступен за счет обратной совместимости как и всякие glBegin/glEnd (по крайней мере, под Desktop).


                  1. AllexIn
                    30.11.2018 15:06

                    Mac OS X — это десктоп? Там нет Legacy OpenGL.
                    Плюс если вы используете OpenGL 4, то тоже не можете получить доступ к этим методам.
                    Так что хоть Legacy OpenGL и существует, его нельзя отнести к актуальным API.


          1. iOrange
            30.11.2018 18:34
            +2

            Нет, не шутка. Я выше даже извинился за занудство, но не могу не ответить.

            Дело в том что нативно квады не поддерживаются еще со времен 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. dimkss
    29.11.2018 19:32
    +1

    Идея интересная, жаль видео результата нету.


  1. kisskin
    29.11.2018 20:13
    +9

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


    1. 8street
      29.11.2018 21:26
      +3

      Да, ворс как будто бы требует уменьшения масштаба текстуры раза в 2 или 4.


    1. AlexanderG
      30.11.2018 14:03

      В нескольких играх видел поля, сделанные именно таким способом.


  1. sanchezzzhak
    29.11.2018 21:31

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


  1. Slavik_Kenny
    29.11.2018 22:01

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



    1. Slavik_Kenny
      29.11.2018 22:02

      Кстати анимированный мех тоже есть как один из вариантов этого шейдера.


    1. zagayevskiy
      30.11.2018 13:46

      Всегда было интересно, как в этом можно увидеть мех. Аналогичный вопрос к «ковру» из статьи.

      Он состоит всего из одиннадцати полигонов и выглядит как натуральный ковер!

      нет, не выглядит…


      1. Slavik_Kenny
        30.11.2018 14:09

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

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


  1. lgorSL
    29.11.2018 22:47
    +1

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


  1. Psychosynthesis
    29.11.2018 22:49

    [offtop]

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

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

    [/offtop]


  1. ArsenCh
    29.11.2018 22:51

    Так был реализован фейковый дисплейс в октан ренедер, по крайней мере, до версии 4



  1. mkrvrmn
    30.11.2018 00:06
    +1

    Впервые видел такое еще в Tony Hawk's Pro Skater 4, помню, как в свои 11 лет восхищался изяществом и простотой решения.Недавно использовал аналогичную технику для рендера губчатого материала. Просто, быстро и легко настраивается


  1. AlB80
    30.11.2018 09:21

    В игре Ил-2 2001 года леса такие были.


  1. AllexIn
    30.11.2018 09:45

    Для травы и ковров — ОК. Потому что нельзя сбоку посмотреть.
    Мех так делать нельзя, видно будет косяки на взгляде сбоку.


  1. Brenwen
    30.11.2018 10:44

    Давным давно в самом первом Ил-2 похожим образом был реализован лес: отдельными слоями кроны деревьев, стволы и тень. Выглядело очень реалистично, пока на него не упадешь.


    1. Happy_Forever
      30.11.2018 10:53

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


  1. AlexSpirit
    30.11.2018 12:51

    >>Он состоит всего из одиннадцати полигонов и выглядит как натуральный ковер!

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


  1. engine9
    30.11.2018 13:27

    Другая техника, но по сути похожая.

    туториал картинкой


    1. marsermd
      30.11.2018 15:31
      +1

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


  1. GromGT1
    30.11.2018 15:57

    У вас нет случайно примера вашего ковра с рисунком. (как рисунки смотрятся)


    1. AllexIn
      30.11.2018 16:29

      Этот ковер за 10 минут повторяется в любом редакторе.
      Сделайте да посмотрите.