Если вы умеете создавать реалистичное окружение, вроде реки из предыдущего материала, это круто. Но когда вы ограничены во времени и ресурсах, то лучше заняться механиками и геймплеем. А на прототипе окружение можно сделать и проще.
Поэтому, да, ковер из всего 11 полигонов. Просто, но изящно. Под катом перевод небольшого гайда.
Я думал о коврах. В частности, о красивом махровом из игры Event[0]:
Этот ковер загипнотизировал меня. Он выглядел великолепно: очень пушистый и мягкий. Это тот уровень, с которым я сравниваю все ковры.
Прямо сейчас я работаю над Skin Deep и вдруг осознал: в моей игре есть ковры. Мне нужно делать ковры!
Результат
Так выглядит финальный вариант:
А так ковер выглядит в редакторе моделей:
Он состоит всего из одиннадцати полигонов и выглядит как натуральный ковер! В общем, я доволен.
Как это работает
Я не знаю, как разработчики Event [0] делали свои ковры, но у меня была идея о возможном способе. Я вспомнил, что читал статью о технике создания меха в Shadow of Colossus. Всегда было любопытно попробовать это самостоятельно. И этот ковер стал отличным поводом.
Мой ковер состоит из нескольких слоев:
Каждый слой является плоской поверхностью. Текстура — это пучок точек, представляющих волокна ковра. Когда вы плотно складываете слои друг на друга, создается иллюзия пушистого ковра.
Вот анимации складывания слоев:
Части
Я использовал одиннадцать плоских поверхностей. Одиннадцать — рандомное число. Думаю, можно использовать и меньше — все равно будет выглядеть хорошо.
И три текстуры, каждая из которых 1024?1024.
Текстура для пяти нижних слоев:
Для трех средних:
И для трех верхних слоев:
Важно отметить:
- Чем выше текстура, тем более пустой она становится. Это дает волокнам ковра некоторое изменение по высоте.
- Темные пятна накладываются на каждую текстуру. Это придает иллюзию потертых областей и спутанных волокон.
- Нижние текстуры темнее верхних. Этот эффект тоже создает иллюзию реального ковра.
Технику можно использовать для создания шерсти животных, травы, листвы — пробуйте.
Заключение
В детстве отец сказал мне, чем больше движущихся частей у машины, тем выше вероятность, что с ней что-то пойдет не так. А вот молоток или отвертка почти никогда не сломаются. По своей сути, видеоигры — это та же машина с массой подвижных частей.
Мне нравится решение с ковром, потому что оно простое. Оно, как отвертка — не сломается и сработало бы даже в 1996 году. В этом есть что-то прекрасное.
Комментарии (44)
Alex_ME
29.11.2018 18:59+2
Этот ковер выглядит довольно плоским, а не состоящим из длинного ворса. Может быть, достаточно карты нормалей?
iOrange
29.11.2018 19:25<зануда>
Я так понял, что это 11 слоев. Каждый прямоугольник = 2 треугольника (полигона). Итого — 22 полигона.
</зануда>sergof
29.11.2018 19:41+1В Блендере полигоны не только треугольные. Наверное поэтому 11 слоев = 11 четырехугольных полигонов.
iOrange
29.11.2018 21:13+1Возможно, но автор, все же, пишет про игру, а все графические API используют треугольники для отрисовки.
Но это я уже перебарщиваю с занудством, извините )BingoBongo
30.11.2018 13:42все графические API используют треугольники для отрисовки.
GL_QUAD: я для вас что, шутка?AllexIn
30.11.2018 13:49Там всё равно на выходе тругольники. Просто прозрачно для пользователя.
Там неслабый такой оверхед при использовании квадов, потому что большинство(все?) драйверов тупо переделывают сами буффер в буффер трианглов.BingoBongo
30.11.2018 13:53Я знаю, что видеокарта рисует все равно треугольниками, но в API подаются квады, и речь шла про API.
AllexIn
30.11.2018 13:55Нет. GL_QUADS depricated начиная с 3. Так что актуальных API с квадами нету.
BingoBongo
30.11.2018 14:00GL_QUAD всегда доступен за счет обратной совместимости как и всякие glBegin/glEnd (по крайней мере, под Desktop).
AllexIn
30.11.2018 15:06Mac OS X — это десктоп? Там нет Legacy OpenGL.
Плюс если вы используете OpenGL 4, то тоже не можете получить доступ к этим методам.
Так что хоть Legacy OpenGL и существует, его нельзя отнести к актуальным API.
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.
sanchezzzhak
29.11.2018 21:31Добавить в шейдеры изменения цвета, и будет иллюзия ветра. Ну я себе это так теоретически представляю
Slavik_Kenny
29.11.2018 22:01Есть такая старая програмка от AMD — RenderMonkey, для написания шейдеров…
Такой шейдер для меха с тем-же принципом работы там является стандартным примером, и обойтись вполне можно одним полигоном (ака двумя треугольниками) для ковра и одной черно-белой текстурой.
zagayevskiy
30.11.2018 13:46Всегда было интересно, как в этом можно увидеть мех. Аналогичный вопрос к «ковру» из статьи.
Он состоит всего из одиннадцати полигонов и выглядит как натуральный ковер!
нет, не выглядит…Slavik_Kenny
30.11.2018 14:09Смотреть надо не в статике просто, а в динамике.
Когда ты в игре в помещении перестреливаешься с врагами то не разглядываешь ворсинки на ковре, как и убегая от медведя не разглядываешь его мех.
Но если тебе требуются очень качественные ковры или мех, то можно конечно их получить «как настоящие», но будет это не 60 раз в секунду, а один раз в пол часа — такие ФПС тебя тоже врятли устроят…
lgorSL
29.11.2018 22:47+1Не нужно там 11 текстур (и 3 тоже не нужно), достаточно одной, которая будет, например, в альфа-канале хранить высоту ворсинки (вряд ли ворсинка будет менять свой цвет с высотой, а если и будет, то можно сделать изменение для всех ворсинок сразу).
При рисовании просто сравнивать "высоту" текущего полигона с высотой ворсинки и на основении этого решать, рисовать её или нет.
Это позволит менять детализацию ковра на лету. Если он далеко — рисуем 2-3 прямоугольника, если близко и видом сбоку — то все 20.
Psychosynthesis
29.11.2018 22:49[offtop]
Может не совсем в тему, однако в местах, для этого предназначенных, ваша компания своих клиентов игнорирует, поэтому напишу тут, чтобы все видели.
Так вот было бы совсем замечательно, если бы вы ваших коллег, работающих над Роботами, к подходу, декларируемому вами в заключении тоже приучили. А то вроде бы и неплохая игра, но после обновлений этого года на всём, что старше двух лет тормозит по свински.
[/offtop]
ArsenCh
29.11.2018 22:51Так был реализован фейковый дисплейс в октан ренедер, по крайней мере, до версии 4
dimonoid
29.11.2018 23:26В gta 5 использовалась та же техника отрисовки травы.
www.google.ca/search?q=gta+5+grass&newwindow=1&client=ms-android-samsung-gn-rev1&prmd=ivsn&source=lnms&tbm=isch&sa=X&ved=2ahUKEwj5vbeNuPreAhUCslMKHQtFAhYQ_AUoAXoECAwQAQ&biw=412&bih=766#imgrc=SV1uv_zZmQtDMM
mkrvrmn
30.11.2018 00:06+1Впервые видел такое еще в Tony Hawk's Pro Skater 4, помню, как в свои 11 лет восхищался изяществом и простотой решения.Недавно использовал аналогичную технику для рендера губчатого материала. Просто, быстро и легко настраивается
AllexIn
30.11.2018 09:45Для травы и ковров — ОК. Потому что нельзя сбоку посмотреть.
Мех так делать нельзя, видно будет косяки на взгляде сбоку.
Brenwen
30.11.2018 10:44Давным давно в самом первом Ил-2 похожим образом был реализован лес: отдельными слоями кроны деревьев, стволы и тень. Выглядело очень реалистично, пока на него не упадешь.
Happy_Forever
30.11.2018 10:53Вот тоже хотел про это написать. Выглядело оно реалистично, пока не начнёшь пролетать над горой, на которой эти самые деревья растут — видно сбоку эти слои.
AlexSpirit
30.11.2018 12:51>>Он состоит всего из одиннадцати полигонов и выглядит как натуральный ковер!
Простите великодушно, но эти 11 полигонов совершенно не похожи на ЕГО ВОРСЕЙШЕСТВО.
Brightori
надо потестить ) выглядит прикольно, но думаю на практике 11 текстур с прозрачностями не такое уж и простое решение.
Leopotam
На десктопе ОК, на мобилках — неприменимо.
AlexanderG
Да и для десктопа с повсеместностью отложенного освещения решение так себе.
Revertis
Хорошо, что их не 11 на самом деле, а только три. Не 44 мегабайта, а 12.
SmallSnowball
Да и сжать можно, никто шумы на ковре рассматривать не будет. Так что еще меньше будет
Revertis
А разве можно сжимать в видеопамяти?
SmallSnowball
Да, для ридонли текстур без проблем. Используется блочная компрессия.
Для DirectX11: docs.microsoft.com/en-us/windows/desktop/direct3d11/texture-block-compression-in-direct3d-11
Для OpenGl тоже поддержка есть