Технологии графики в современных играх, часть 1: Новомодные свистелки-перделки
Часть 1: Новомодные свистелки-перделки
Вступление
Ты вступление не читаешь. Тебе оно не интересно.
Мне тоже не интересно описывать, что я за хрен с горы и нафига тут вылез. Но надо.
Короче, крути вниз.
Всем привет.
Наблюдая в недавнем стриме по MATRIX: Path of Neo за тем, как Вася с Максом рассуждают на тему LOD'ов, я понял одну интересную вещь: в современных играх меню с настройками графики представляет собой что-то совершенно непотребное. Оно либо жутко кастрировано, либо открывает для пользователя такую простыню непонятных слов, в которой и чёрт ногу сломит.
Ладно, я — сам работаю в игрострое. Так что мне-то понятно, какая настройка за что отвечает. Но порой тоже не без трудностей. А вот простых игроков, наверное, при чтении всех этих названий одолевает тихий ужас.
Причём, мир не стоит на месте, и новые графические «фичи» появляются каждый год, а то и месяц. Недавно — вон, свет увидел TressFX.
Так что дальше будет только больше, и без посторонней помощи разобраться во всём этом техническом безобразии в скором времени уже просто не получится.
Разработчики игр упрощают это дело, как могут, по максимуму убирая из меню всё лишнее. Вот только беда в том, что это вовсе не «лишнее», и надобность той или иной технологии зависит от того, насколько мощное у игрока железо.
В консолях это самое железо известно заранее, и игроделы могут просто сами подобрать оптимальные параметры, скрыв их от глаз игроков. Но вот сделать такое для ПК — в принципе невозможно.
Тем временем, меню всё разрастается и разрастается…
Не удивлюсь, если через пару лет в сингле какого-нибудь ААА-шутера в туториал добявят объяснение графических настроек. А пока — я постараюсь помочь всем интересующимся сориентироваться во всём этом многообразии.
Сразу извиняюсь за возможно «не такой» формат повествования.
Вообще, это далеко не первый мой рассказ на подобную тему. Но обычно подобные темы я обсуждаю с другими такими же «CG-гиками» (коллегами по цеху). А вот в блогах на SG — я пишу впервые. Так что местами могу «не попасть» в то, как тут принято.
Постараюсь не разводить нудятину и осветить тему без излишних технических подробностей. Так что надеюсь обойти стороной всякие вертексные/пиксельные шейдеры, шейдерные модели, graphics pipeline и т.п. Но если что — ссаными тряпками прошу не закидывать.
Как говорится, «это мой первый пост, не судите строго».
Итак, ближе к делу. Рассказ о технологиях пойдёт в порядке их «свежести». А начнём с…
AMD TressFX
Эта технология — просто идеальный пример одного тренда, который прослеживается в игровой индустрии испокон веков. Суть его вот в чём: игровая индустрия сама по себе не придумывает практически никаких технологий.
Просто время идёт, мощности железа растут. И со временем, пускай и с какими-то упрощениями, становится возможным делать в реалтайме то, что раньше было доступно только в «тяжёлом» рендере… ну, то есть, в том, что геймеры именуют «CGI-роликами».
Иными словами, практически все технологии, появившиеся в играх — всего лишь упрощённое заимствование того, что уже давным-давно широко используется в кино и изучено вдоль и поперёк.
Собственно, что такое TressFX? А очень просто: это всего лишь готовый кусок программного кода от AMD, с помощью которого можно считать волосы на видеокарте.
Вообще 3D-шники умеют делать волосы уже много-много лет. Ты их не раз видел во всяких 3D-мультиках.
Просто раньше это делалось на проце и требовало этих самых процов дофига. Естественно, ни о каком реалтайме — и речи быть не могло.
Поэтому в играх причёски в любом случае делались такими полигональными «лоскутками», на которых волосы были просто текстурой.
Предыдущие картинки взяты из легендарного в среде 3D-шников making-of'а модели «Varga» от Paul Tosca.
В самом making-of'е картинок ещё больше, и есть gif'ки, позволяющие посмотреть модельку со всех сторон.
А теперь гигагерцы выросли, видюхи растолстели. И игровые программисты могут просто взять этот готовый TressFX и воткнуть его в игру: волосы будут считаться в реалтайме на GPU. Считай, ничего делать не надо: покрутил пару параметров, настроил длину — и очередная пара косичек готова.
Причём, на видеокарте считается не только то, как эти волосы выглядят, но и их физика. То есть, как движется каждый волосок.
В будущем это даст гораздо большую реалистичность стрижек у персонажей: они будут выглядеть, прям как настоящие. Но пока что видюхи попросту не настолько сильные, чтоб держать в кадре хотя бы две таких причёски.
Ну то есть даже на топовом Радеоне на расчёт одной такой шевелюры уходит столько же ресурсов, сколько на всю остальную сцену. В результате — игра тормозит, а волосы глючат (и выглядят хуже, чем сделанные по старинке). Что недавно вышедшая Лара наглядно продемонстрировала.
Так что на сегодняшний момент TressFX нужна не столько игрокам, сколько разработчикам. Это банально проще: не париться с созданием геометрии и текстур, а считать волосы по физике, «в лоб».
Интересующимся: мини-разбор TressFX 2.0 (на русском)
GPU Particles (частицы на видюхе)
Всё очень просто: видеокарта лучше справляется с задачами, которые легко распараллелить.
Ну то есть, считать много всего однотипного — это к видюхе. Считать что-то одно сложное — это к процу.
В DirectX 11 появилась такая штука (DirectCompute), которая позволяет разработчикам игр самостоятельно считать на GPU практически что угодно.
Естественно, благодаря этому те вещи, которые сами по себе хорошо параллелятся — первым же делом и были перенесены с проца на видюху. Что позволило увеличить детализацию этих «вещей» в несколько раз.
Ярчайший пример — системы частиц. У нас в кадре есть дофига маленьких-маленьких объектов. Вроде песчинок, снежинок, капель воды… Так вот. Раньше мы их считали на проце, поэтому приходилось исхитряться. Например, рисуя вместо одной частицы текстуру, где их 100.
А теперь — мы их считаем на видюхе, так что можем делать это по-честному. Вместе со всей физикой. Это позволяет нам ворочать в кадре буквально миллионами частиц, создавая просто ошеломительные эффекты.
Интерактивное онлайн-демо с адским числом частиц прямо в браузере (требуется DX11 + нужно установить Unity Web Player)
Некоторые считают, что GPU-частицы, как и другие новомодные фичи — исключительно прерогатива DX11. На самом деле — современный OpenGL может всё то же самое, а местами — даже больше. В чём легко убедиться, погуглив на ютубе.
Так что...
Тот факт, что современные игры выпускаются с упором на DirectX — это даже не какой-то заговор Мелко-Мягких, а банальная инерция игроделов.
С технической точки зрения ничто не мешало уже FarCry 3 или Crysis 3 работать не на DirectX, а на OpenGL. А он, вообще-то, кросс-платформенный. То есть, разработчики один раз пишут шейдер, который одинаково отработает и на Windows, и на MacOS, и на Linux.
А учитывая, какие операционки используются на PS4 и грядущем Steam Machines — улавливаешь мысль? Очень скоро произойдёт…
Ну да ладно, это уже совсем другая история.
Voxel Cone Tracing
Или, по-русски, воксельная коническая трассировка.
За этим страшным названием скрывается технология для расчёта рассеянного освещения (indirect illumination). Что такое «рассеянное освещение»? Проще будет показать.
Видишь, на скриншотах свет попадает только на одну стенку и шторы. Но, отразившись от них (рассеявшись), он освещает всю остальную сцену. При чём, свет от зелёной шторы окрашивает всё в зелёный цвет, а от красной — в красный.
В реальной природе свет распространяется так же. Но в играх до последнего времени это было невозможно.
К сожалению, я пока что не встречал ни одного упоминания о том, чтобы какая-то игра использовала эту технологию. Даже в Battlefield, насколько мне известно, её не стали использовать, хотя поначалу хотели (ещё аж в BF3).
Но с недавним приходом консолей нового поколения — я очень надеюсь, что скоро она окажется в мэйнстриме.
Tesselation
Если ты более-менее интересуешься графоном, то я уверен, что уж это слово ты слышал.
Вот только, как я заметил, многие игроки не до конца понимают смысл этой технологии. Большинство считает, что это «такая штука», которая позволяет вместо плоского пола усыпать его камнями. И всё.
Вообще, да. Но она может не только это.
Сама по себе тесселяция пришла в DX11 из того же самого «тяжёлого рендера», из которого пришли и волосы, под ручку с рассеянным светом. К счастью, в отличие от TressFX эта технология гораздо лучше применима.
Что она делает? А очень просто: интерактивно, прямо во время игры разбивает один большой полигон на кучу маленьких. По сути, благодаря ей можно сделать так, чтоб количество полигонов в кадре всегда было примерно одинаковым. Независимо от того, насколько сильно мы приблизились к поверхности.
Объект очень далеко? Ну и отрисовывается в виде исходного кубика.
Камера наехала вплотную? Каждую исходную плоскость разбиваем 100500 раз.
Что это нам даёт? Ну, вообще-то, сама по себе тесселяция ничего не даёт. Но зато, если её комбинировать с другими технологиями — можно сделать тот самый «ГРАФОН!!!111», на который фапают графодрочеры.
В самом простом случае — да, можно добавить к тесселяции другую технологию (vector displacement), которая по специальной текстуре рельефа «выдавит» точки на тесселированом объекте. Это позволит добавить, собственно, рельеф, сделав прям-таки фотореалистично детализированный уровень.
Но ведь двигать точки на поверхности можно не только по заранее сделанной фиксированной текстуре. Вместо текстуры величину смещения можно получать по какому-нибудь хитрому алгоритму. То есть прямо во время игры, при отрисовке каждого кадра для каждой точки вычисляется, куда её сместить… хм, не совсем понятно, наверное?
Давай так. Вот у текстуры — есть разрешение. Рано или поздно, когда ты приблизишься — увидишь пиксели. А у алгоритма разрешения нет. То есть, приближать/отдалять можно сколько угодно, не теряя при этом ни детализации, ни производительности. Таким способом (он называется procedural displacement) можно из одной плоскости… выдавливать целые ландшафты. И сколь близко бы ты на него ни смотрел — он всегда будет очень детализированным.
Мыслим шире: выдавливать ландшафт можно не только для какого-то одного уровня, но даже
Можешь прикинуть такие масштабы в новом Масс Эффекте?
Или такой пример. Представь, что при замерзании твоего персонажа на нём прямо по форме тела вырастают сосульки. Не внезапно появляются изниоткуда, а именно вырастают. Причём разработчикам для этого достаточно всего лишь 1 раз сделать материал с этим алгоритмом, и потом можно его применять вообще на любой объект.
На любой. То есть, целые уровни можно замораживать, просто накинув на все объекты этот материал.
И алгоритм для смещения может быть любым. Например, он может учитывать текущее время и благодаря этому заставлять этот рельеф двигаться. Ну допустим, у персонажа прямо будет видно, как пульсирует вена.
В общем, тесселяция напару с процедурным дисплейсментом открывает для разработчиков прям-таки безграничный арсенал выразительных средств.
Кроме того, использование тесселяции позволяет вообще отказаться от технологии LOD (Level of Detail), о которой я упоминал в начале. Проще говоря, разработчики за те же деньги смогут сделать больше объектов на уровне. То есть, не только сами объекты при близком разглядывании будут более детализированными, но и уровни в целом будут более разнообразными. Но это только если делать игру исключительно с расчётом на DX11 и соответствующее железо.
Так что если твой комп тянет тесселяцию — лучше по умолчанию её включать. Игра так будет не только более красивой, но и работать может быстрее.
Realtime Ambient Occlusion
Ещё её называют «contact shadows» (контактные тени).
Эта технология имитирует мягкие тени во «впадинках». Как она работает — объяснить будет сложно, да и не нужно. Главное — что для тех точек экрана, которые на уровне находятся в углах или очень близко с которыми находится поверхность другого объекта — рисуется затенение.
Технология также пришла из «старшей» графики, где она называется просто Ambient Occlusion (АО).
В играх она бывает нескольких видов:
SSAO
Расшифровывается как Screen-Space Ambient Occlusion — AO в пространстве экрана.
«в пространстве экрана» — это лишь означает способ, которым оно вычисляется. Он сложный и запутанный, так что тут его не объяснишь. Просто именно он позволил считать АО в реалтайме, поэтому попал в название. В наши дни практически любая игра поддерживает SSAO. И если комп тянет — его лучше включить, потому что этот эффект почти не отжирает ресурсов, но при этом существенно повышает реализм.
HBAO
Horizon Based Ambient Occlusion — AO на основе горизонта.
Реализация SSAO от NVIDIA. Если сравнивать с простым SSAO — кой-чего улучшили, кой-чего ухудшили.
Чтоб корректно сравить разные виды SSAO в статье — надо смотреть «чистый» AO (на белых объектах) и с совершенно одинаковых ракурсов. Но я, к сожалению, таких сравнений не нашёл. Придётся на словах.
Избавились от одних артефактов и тем самым сделали алгоритм более физически корректным. Но появились другие артефакты. Ни те, ни другие не описать словами. Но вот в отличие от SSAO, HBAO «дёргается» при движении камеры, что есть совсем не гуд.
имхо, если выбирать между SSAO и HBAO — первое лучше.
Но в скором времени нвидия разработала слегка усовершенствованную версию — HBAO+. Она избавилась от артефактов «простой» HBAO и практически лишилась «шума». Правда, требует более свежую видюху — GTX 660 и выше. Зато работает немного быстрее.
Обычно HBAO медленнее, чем SSAO. Но в некоторых играх с некоторыми видеокартами от NVIDIA — работает быстрее. На видеокартах от AMD — точно медленнее.
Интересующимся: статья от самой NVIDIA
HDAO
High Definition Ambient Occlusion — AO высокого разрешения.
Реализация от AMD. Картинка натуральнее, чем с HBAO. Что лично меня как поклонника AMD/ATI — радует.
Но вот со скоростью — те же непонятки. На видюхах от AMD — быстрее, чем HBAO, но медленне, чем SSAO. На видюхах от нвидии — бывает по-разному. В том числе бывает, что HDAO быстрее, чем «родной» HBAO.
В общем, обычно HDAO/HBAO — медленнее и качественнее, чем SSAO. Качество картинки в любом случае улучшается так: SSAO — HBAO — HBAO+ — HDAO (хотя лично я считаю, что первые два надо поменять местами). Но вот какой вариант быстрее — проще самому попробовать в игре.
Как-то так. На сегодняшний день — это все технологии, которые я могу причислить к относительно новым.
Пока что практически ни одна из них не используется широко. Но именно их существование подталкивает игровую индустрию вперёд. Разработчики игр видят те возможности, которые открывают эти новомодные «фичи». Но они вынуждены ориентироваться на среднестатистическое железо, поэтому пока не спешат внедрять всё и сразу.
Игроки же потихоньку это самое железо обновляют, приближая тот момент, когда все эти технологии станут «стандартным набором» и тем самым спровоцируют появление новых.
В общем, как всегда: поживём — увидим.
Bonus: DirectX 11 vs OpenGL 4
Многие годы DirectX царственно восседал на троне неоспоримого лидера по графическим прибамбасам. Чем Microsoft и жила. В эпоху Windows XP «играть в игры» было практически синонимом «пользоваться Windows». Да что уж там, ситуация сохраняется по сей день. Когда говорят «ПК», то по умолчанию подразумевается Windows 7 со встроенным в неё DirectX'ом.
На консолях есть свои графические библиотеки — но на то они и консоли. А на ПК безраздельно правит DirectX…
Однако в последнее время эта его «безраздельность» нехило так пошатнулась. Дело в том, что, действительно, OpenGL всегда не дотягивал до возможностей DirectX, из-за чего игроделы выбирали последнего. OGL всегда «как бы мог» всё то же самое, но со скрежетом. Всегда проигрывал по скорости. Всегда «не дотаягивал» по качеству итоговой картинки или количеству параметров.
Всегда.
До релиза OpenGL 4.
С его появлением в индустрии, можно сказать, пройдена точка невозврата. Если сравнивать DX11 и OGL 4 — то выясняется, что в конкретно этих двух версиях уже начинает лидировать OpenGL. Не с диким отрывом, нет. Потихоньку-помаленьку… вот тут рендерится быстрее, вот там возможностей больше, вот здесь код чище.
Но в сумме набирается, что сегодняшний OGL не только не уступает по возможностям перед DirectX, но в чём-то даже превосходит. Об этом я вскользь упоминал в разделе про GPU-партиклы. Но решил на этом остановиться поподробнее.
Ведь, пробежавшись взглядом по статье, я заметил, что все описанные в ней технологии, кроме TressFX, есть параллельно и на DX, и на OGL. А аналог TressFX в принципе можно сделать и на нынешнем OGL.
Относительно недавно даже появился специальный игровой движок — Unigine. Его, как говорится, «killing feature», на которую упирают создатели — это то, что он обеспечивает совершенно идентичную картинку на всех платформах. На Windows он использует DirectX, на остальных — OpenGL.
Собственно, та самая демка, которая демонстрирует прелести тесселяции, которую все видели — она сделана на Unigine:
С появлением движка Unigine — на ютубе стали вылазить сравнительные сплит-скрин бенчмарки одной и той же сцены на DX и на OGL. И, глядя на них, начинаешь замечать едва видимые, но отличия. Вот тут свет считается точнее, вот там расфокус размывается правильнее, вот здесь тесселяция плотнее, а линзовые эффекты физически корректнее.
А потом выясняется, что на некоторых конфигурациях OGL ещё и быстрее.
В общем, все и так поняли, что я хочу сказать. Оставлю свои эмоции в стороне и просто предоставлю одно из таких видео:
На этом первая часть моего рассказа заканчивается.
Часть 2: Апофеоз Past-Gen'а
Лучшие комментарии
Тут уж я ничего сделать не могу.
Большинство мешей и текстур — приходят ко мне от других людей, а сам я делаю только совсем элементарные болванки-заготовки для эффектов.
И ассеты из того проекта, в котором я занят сейчас — показывать нельзя.
Так что стримы «для всех» проводить — вряд ли получится. Не на чем. И не та у меня специализация, которая будет интересна и понятна массам.
Если интересно — то
Надеюсь, статья попадёт в Игрозор, вполне заслуживает.
Такой реакции я не ожидал, конечно.
Его придумала DICE для BF3 (до того, как все крутые прогеры шейдеров разбежались по другим студиям). И, что немаловажно, поделилась разработкой с коммьюнити игроделов.
Я собирался рассказать об этой технологии в другой части, потому что она чересчур технична.
Но если не терпится — то вот презентация от самих DICE.
В современных играх эта фича используется почти во всех. Например, она есть в последнем Saints Row. Но не у всех получается добиться с её помощью таких шедевральных результатов.
Красота The Last Of Us — это заслуга не технологий, а художников. Я лично ненавижу истории про зомби, но то, что Last Of Us — это шедевр, бесспорно.
в теории — да, PS3 в принципе способна ворочать фичами OpenGL 4. Но просто ей мощей не хватит. Плюс к тому, ядра Cell, со всеми вытекающими (я про аццкий геморрой).
2. Понт стиммашина — не в технических особенностях, а в социальных. У американцев принято для игр покупать консоль. Так что исключительно по этой причине стим-играм в американский рынок путь заказан. Но вот если валв сможет как-то стандартизировать конфигурации SM (допустим, всего 3 стандартных модели: супер-крутой СМ, средненький и бюджетный) — «тупые америкосы» ломанутся за ними вместо этих ваших плоек и иксбоксов. Потому что уже со старта библиотека игр такая, что, как говорится, «жопой жуй».
Соответственно, и разрабы начнут делать крутые эксклюзивы для стима (эксклюзивы уровня Mass Effect и GTA5). То есть, делать их на OGL вместо DX и чисто-консольных библиотек.
3. Раньше эти срачи не имели смысла. Потому что OGL объективно сосал у DX'а (ты что-то попутал про «превосходство OGL'а»). Его защищали только линуксоиды, у которых просто не было DX'а.
И сейчас эти срачи смысла не имеют. Потому что OGL 4 объективно нагибает DX11. Тут холивары могут быть только на почве технической неосведомлённости.
4. ходят слухи, что...
Скриншоты, собственно, из сценки с сиграффа. И — да, на 10 блогов хватит. :)
Но «глубокая диванная аналитика» этой технологии, мне кажется, тут никому не впёрлась
И Костя даже правильно мой ник прочитал.
В общем, я рад, что на SG тема понравилась. Уже работаю над продолжением.
И за плюсы тоже спасибо.
Кстати, плюс за хорошее уточнение. :)
В нормальных меню настроек это уже давно делают. В том же Portal 2 прежде чем менять настройку в первый раз игра показывает пользователю её описание.
Для несведущих присутствуют пресеты.
В любом случае, не минус — и то хорошо. Так что продолжению — быть.
Правда, на неделе у меня — работа. Поэтому выкроить время, чтоб спокойно сесть за продолжение — получится только к выходным. Заодно посмотрю на неделе, как вновь прибывшие отзовутся. Вдруг это только первая волна радости, а потом — набегут и заминусуют.
Так что в течение недели — внимаю новым отзывам и в зависимости от этого, если что, подкорректирую формат изложения. В выхи — если не загонят в минус, засяду за продолжение.