Рендер Diablo3. Как это работает

Как устроены графические движки популярных игр с мировым именем? Какие технологии применяют разработчики в самых крупных игровых компаниях? Действительно ли, чтобы сделать красивую игровую графику необходимо применять самые передовые технологии современной 3D графики? На эти вопросы мы попробуем ответить на примере рендер части игры Diablo3, от компании Blizzard Entertainment.

Я давно занимаюсь в сфере игровой разработки, и мое хобби реверс-инжиниринг графических движков популярных игровых продуктов. Когда вышел долгожданный сиквел серии Diablo, я сразу захотел узнать, какие технологии использовали разработчики в своем детище.

Рендер игры построен на базе технологии Direct3D 9. Это позволяет покрыть более широкую аппаратную базу видеокарт, а те расширенные возможности, которые предлагает D3D 10 и 11 зачастую либо вовсе не нужны, либо реализуемы теми или иными способами в девятой версии.

Тени

Для всей статической геометрии уровня используются предрасчитанные лайтмапы. Да-да, старый добрый способ, который применяется со времен, когда 3D-акселераторы стали поддерживать мультитекстурирование.

Image

Лайтмапа просчитывается заранее в пакете 3Д моделирования (3ds max, Maya), либо собственным рейтрейсером в редакторе уровней. Одна такая текстура используется для нескольких игровых объектов, либо их частей, если объект крупный (например, террейн).

Для динамических объектов (монстры, фигурки персонажа) используются динамические тени выполненные по технологии “shadow map” (stencil shadows в наше время уже практически не используется). Разработчики решили отступить от классических канонов в этой сфере, и не использовали hardware shadows (текстуры которые могут быть использованы как буфера глубины, и поддерживающие аппаратный Percentage Closer Filtering – PCF), которые предлагают все популярные производителями видеокарт. Вместо этого, была применена технология Variance Shadow Maps. Она позволяет получить мягкие края путем стандартного размытия текстуры тени (для классических карт теней этот метод неприменим, так как усреднение значений глубины пикселя не имеет смысла). Подробности VSM я расписывать не буду (см. полезные ссылки в конце статьи), скажу лишь только, что для ее реализации необходимо хранить 2 значения: глубину пикселя и глубину пикселя в квадрате. Именно второе значение диктует довольно жесткие условия к точности хранения этой информации, поэтому была выбрана текстура формата A32B32G32R32 float. Размер ее при максимальных настройках качества теней 2048х2048.

Image

Процесс создания карты теней стандартный. Рисуем все объекты отбрасывающие тень (окклюдеры) в карту тени с позиции источника освещения. Размываем карту тени сначала по горизонтали, а затем по вертикали. При рендере объектов, которые должны получать тень (ресиверы), семплим шадоу мапу, определяем степень освещенности пикселя и соответственным образом затемняем финальный цвет. Семплинг карты теней должен происходить с билинейной фильтрацией. Аппаратная фильтрация формата A32B32G32R32F поддерживается далеко не всей линейкой shader model 3.0 capable видеокарт, поэтому она реализуется программно, в шейдере (хотя на моей видеокарте она поддерживается, но это не учли).

Рендеринг теней происходит с ортографической проекцией, если тень от направленного (directional) источника (солнце), либо с перспективной для конусовидных (omni). Техники перспективного искажения карты теней (например, Perspective Shadow Maps,Trapezoidal Shadow Maps и др.) для положения камеры используемой в игре (направление взгляда сверху вниз, под небольшим углом к направлению главного источнику освещения) не нужны и не используются. Каскадное разделение теней на сектора (Cascaded Shadow Maps, Parallel Split Shadow Maps) не реализованы по тем же причинам.
Карта тени в разрешении 512х512 со сглаживанием и без:

Image

Шейдер для патча террейна в варианте со сглаживанием состоит из 12 текстурных и 59 арифметических инструкций. Без сглаживания 10 и 29 соответственно. Разница в арифметических инструкциях есть реализация билинейной фильтрации и VSM.

Динамическое освещение

Удивительно, но все динамическое освещение повертексное. Как в старые добрые времена. Никаких карт нормалей в игре нет. Смелое решение, но учитывая финальный результат, очевидно, что он себя оправдал на 100%. Недостатка в детализации геометрии совершенно не ощущается. В вертексном шейдере реализованы один точечный источник света с квадратичной аттенюацией (как в классических FFP формулах), один цилиндрический источник (он используется как подсветка персонажа, для освещения близкого окружения героя) и до 16 точечных источников с простейшей линейной аттенюацией по расстоянию.

В игре реализованы также объемные источники освещения. Сделаны они следующим образом. Рисуем сферу, или другую выпуклую фигуру, в месте источника освещения. В вершинном шейдере высчитываем альфу вертексов на основе нормали и вектора направления камеры. Чем больше угол между ними, тем большая прозрачность должна быть. Получаем полупрозрачную сферу с увеличением прозрачности от центра к краям. Так как эта сфера будет пересекать геометрию уровня, мы получим визуальный артефакт изображения в месте пересечения объектов уровня и самой сферы. Данный недостаток исправляется абсолютно таким же методом, как и делаются так называемые soft particles. Берется выборка из буфера глубины и сравнивается с глубиной отрисовывамого пикселя. Если значения близки, то модифицируя альфу (уменьшая ее до нуля), мы делаем место пересечения геометрий невидимым.

Image

Специальные эффекты

Из интересных эффектов можно выделить проективное текстурирование. Для наложения на поверхность земли текстур различных игровых заклинаний (например, крики варвара, лужи яда, огненные дорожки монстров и т.д.) все эти эффекты рендерятся в отдельную текстуру:

Image

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

Для некоторых эффектов (пост-процесс, в частности) необходима информация о глубине сцены в данной точке. Стандартные средства Direct3D 9 не позволяют получить буфер глубины как текстуру для последующего чтения. Очевидным вариантом будет рендеринг всей сцены еще раз, с выводом глубины пикселей в текстуру формата R32F. Этот метод в большинстве случаев неприемлем, так как удвоение отрисовываемой геометрии сильно скажется на общей производительности игры. Производители графических адаптеров давно знают об этой проблеме, и предлагают специальные форматы текстур, которые могут использоваться и как текстура в шейдере, и как буфер глубины при рендеринге. Одним из таких форматов является так называемый INTZ формат. Он то и используется в Diablo III. Текстура такого типа используется при рендеринге сцены как depth buffer, а затем значения из нее можно получить в шейдерах, где необходима информация о глубине. Я не знаю, как выполняется рендеринг на аппаратуре, которая не поддерживает INTZ текстуры (не все shader model 3 видеокарты поддерживают данный «хак»), у меня нет видеокарты без такой поддержки. Возможно, выполняется дополнительный проход, либо эффекты, зависящие от глубины, реализуются по-другому, либо совсем выключаются.

Подсветка объектов под курсором реализуется путем рендеринга выделяемого объекта в отдельную текстуру. Шейдер при этом используется простейший – вывод единицы в альфа канал рендер таргета, и цвета выделения в rgb каналы. Затем полученная текстура размывается по горизонтали и вертикали. Для корректного наложения эффекта и получения финального изображения необходимо оставить только ореол объекта, но не его основной силуэт. Имея оригинальное (не размытое) изображение, финальный шейдер наложения проверяет значение альфа канала в этой текстуре. Если он равен 1 (объект в этом пикселе есть), то выводимый альфа канал устанавливается в ноль. Если значение 0 (объекта в этом пикселе нет), то используется альфа канал размытой текстуры.

Image

Пост-процесс эффекты

Количеством пост-процесс эффектов игра похвастаться не может. Среди всего арсенала были замечены bloom, full screen distortion и полноэкранное сглаживание, выполненное по технологии FXAA. Дисторшн реализуется по классической схеме. Отрисовываем партиклы, которые должны привносить искажения в финальную картинку (горячий воздух, например) в специальную текстуру. Записываемые данные являются u и v смещениями текстурных координат. В следующем полноэкранном проходе используем эту текстуру и смещаем текстурные координаты для семплинга основного изображения сцены.

Image Hosted by ImageShack.us

Полноэкранное сглаживание выполнено также как пост-процесс эффект. Причин этому несколько. Использование INTZ буфера глубины становится невозможным (нельзя создать чистый multisampled INTZ depth buffer для последующего копирования его в non-multisampled INTZ текстуру), и shadow map будет занимать очень много памяти (напомню, что ее формат A32R32G32B32F, т.е. 16 байт на пиксель). Полноэкранное сглаживание в игре выполнено по технологии Fast Approximate Anti-Aliasing (FXAA).

Image Hosted by ImageShack.us

Геометрия и материалы

Все данные вершин игровых моделей упакованы в cache-friendly 32 байт формат. Исключение составляют анимированные модели, там 48. Дополнительные данные это веса костей их индексы. В игре используется скелетная анимация, которая выполняется в шейдере. По этой причине для анимированных моделей количество точечных источников ограничено семью, из-за нехватки константных регистров для хранения параметров источников освещения и матриц костей.

Общее количество draw call’s невелико. Значение колеблется в пределах 300-800 DIP, что является хорошим показателем.

Шейдера выполнены по технологии uber-shader, т.е. компиляция множества вариантов одного эффекта с помощью перебора набора дефайнов препроцессора. Например эффект может быть с туманом и без, с тенью и без, с лайтмапой и без. За туман, тень и лайтмапу отвечает определенный define вида: #define USE_FOG 1. В теле шейдера блок кода, отвечающий за наложение тумана выполнен внутри блока #if USE_FOG … #endif. Таким образом переключая значение USE_FOG 1/0, мы получаем шейдер с туманом и без. Схожим образом делаются и все эффекты. Система сборки всех вариантов шейдеров, автоматически перебирает весь набор значений дефайнов, и для каждого набора компилирует шейдер.

Пользовательский интерфейс

Внутриигровой интерфейс отрисовывается на экран довольно стандартно. Особой группировки элементов с целью уменьшения вызовов на отрисовку (DIP calls) не наблюдается. Хочется отметить рендеринг текста. Подготовка символов для рендера очень похожа на метод используемый в Scaleform GFX. Все уникальные символы отрисовываются в отдельную текстуру, и уже эта текстура используется для рендеринга текста. Не смотря на схожесть текстового рендера, сам Scaleform не используется.

Послесловие

Сам рендер оставляет приятные впечатления. Такой себе микс олдскула и некоторых современных веяний. Производительность на высоте при красивой картинке (как всегда у игр от Blizzard, собственно). Большую роль в этой всей красоте отыгрывает работа художников и дизайнеров. Diablo III еще раз доказывает, что очень красивую графику можно сделать и на не самом технологичном рендере.

Полезные ссылки
— Variance Shadow Maps. www.punkuser.net/vsm
— FXAA. developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf
— Список известных GPU «хаков». aras-p.info/texts/D3D9GPUHacks.html
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 130

    +163
    ничего не понял, но очень интересно
      +15
      Поддерживаю. Читается почти как интересный детектив, на одном дыхании. Только иногда задумываешься — «Я понимаю процентов 20 только, зачем я это читаю». Но продолжаешь читать. Ну и картинки конечно).
        +1
        Понял процентов 50. :)
        Понравилось, спасибо.
          0
          Можно спрашивать, постараюсь более подробно объяснить те или иные моменты.
            0
            Почему всё-таки забили на DirectX11? С его продвинутым pipeline и всякими там шейдерами на всех этапах разве не было бы лучше и быстрее? Просто поленились писать две реализации?
              0
              Реализации и так как минимум две: на Маке нет DirectX.
                0
                Да, и можно ли было написать на опенгл?
                  0
                  DirectX 9 код пас используется для XBox — поэтому и будет жить еще некоторое время (+winrt)
                    0
                    «Поленились» это вы конечно шутите — поддерживать 2 код паса могут позволить не все
                      0
                      Многие используют готовые движки, а движки поддерживают разные технологии отображения. Поскольку тут поддерживается как минимум DirectX 9 и что-то для работы под Мак, значит что-то типа универсального движка тут тоже есть. Вопрос в том, почему у этого движка нет поддержки DirectX11.
                        0
                        Это реально очень все усложняет и требует больше ресурсов (согласен с ответом ниже)
                          –1
                          Под МакОСью у них с вероятностью близкой к 100% Cider или Aspyr под капотом, а не другой движок.
                            0
                            Как подсчитали вероятность?
                              0
                              Наблюдая за крупными играми, что появляются на макоси :) У редчайших игр нет подпапочек типа drive_c/Program Files/ и т.п. :)
                                0
                                А у Diablo III такие подпапочки есть?
                                Я не в курсе подробностей, но Diablo выпускается для обеих осей с самого начала, т. е. с 1996 года, ещё на PowerPC. Сомневаюсь, что тогда был Cider.
                                  0
                                  Если не забуду, дома посмотрю.
                                    0
                                    Посмотрел. Таки да, скорее всего собственный движок. Из поставляемых с игрой фреймворков — только NVidia Сg, все остальное — системное.
                                      0
                                      Близарды всегда все свои игры делали нативными.
                          0
                          Сложно поддерживать два сильно отличающихся рендера (это я вам по опыту говорю. Приходилось писать игру с fixed-function pipeline и шейдерным рендером). Надо поддерживать два набора шейдеров, делать эффекты и там и там, да еще и картину надо выдавать похожую. Сложно это и затратно. Разработчики посчитали, что вложения не стоят той отдачи которую они получат.
                    +6
                    Пользуясь случаем, хочу выразить благодарность за блог, в котором были подобные реверсы графики ААА-игр :) До сих пор регулярно открываю, в надежде увидеть записи, подобные этому посту :)
                      +3
                      Добро пожаловать на Хабр.
                      Давно ждал в ЖЖ разбора рендера какой-нибудь новой игры. А тут такой сюрприз.
                      Как всегда интересно и познавательно. Спасибо.
                        +1
                        Осталось физику сделать не тупящую на GTX 560…
                          0
                          На сколько я успел понять, физический движок в D3 свой. А значит ни о какой аппаратной акселерации просчетов на GPU речи не идет.
                            0
                            Тем неменее на одном компе на разных видеокартах, и разных физических процессорах, тупит поразному, и тупит именно когда много разрушений и прочего.
                            З.Ы. минусящие которые игру видели только на скриншотах, могут погуглить как GTS 250 все летает, а GTX 560 тупит на не самых старых компах ;)
                              0
                              А что мешает считать на GPU? Что мешает написать физику на openCL?
                            +2
                            Все уникальные символы отрисовываются в отдельную текстуру, и уже эта текстура используется для рендеринга текста. Не смотря на схожесть текстового рендера, сам Scaleform не используется.

                            По моему так делают все. Сравнение со Scaleform мне не понятно.
                              +3
                              Я так и думал, что этот момент будет не до конца понятен. Как делают «обычно». Подготавливают текстуру со всеми символами шрифта, и используют ее для отрисовки текста. В этом случае данная текстура статична и никогда не меняется. Проблемы с таким подходом начинаются, когда продукт надо локализировать. Впихивать в одну текстуру все символы языка иногда не представляется возможным. Тут же подготавливается текстура только с нужными буквами. Например для отображения фразы «Важное сообщение», текстура содержит символы «Важноесбщи», и уже из нее делаются выборки символов. Такой подход я впервые увидел в Scaleform SDK. Возможно это стандартная практика уже. Судить об этом сложно так как очень много современных игр использует Scaleform для GUI.
                                0
                                А тот же WoW от тех же Blizzard разве не так же(как в d3) делает? :) Если мне память не изменяет, то в pix'е я видел именно такую текстуру, содержащую буквы, которые нужно отрисовать на экране.
                                  0
                                  WOW я смотрел очень давно. Скорее всего там именно так, но я не помню.
                                  0
                                  Берется freetype и настоящий фонт и на лету генерят атлас(ы) — самый известный пример (ему уже 100 лет).
                                  Прегенеренные атласы конечно еще используются но все меньше и меньше
                                    +1
                                    Согласен. Решение логичное то. Наверное все таки сравнение со Scaleform было не совсем корректным.
                                    0
                                    Они для каждой фразы собирают атлас заново? Или всё таки у них по мере встречи новых букв они кэшируются в атласах, и через время он уже не меняется, когда там набираются все буквы?
                                      0
                                      Там атлас набирается на группу отрисовываемых фраз. В игре уникального текста на экране не очень много. Основной поток — это цифры урона и лечения.
                                    0
                                    Проще сказать что отображаемые на экране уникальные символы кешируются в отдельную текстуру — атлас.
                                    Почему надо хранить в одной текстуре — а не несколькольких (по текстуре на символ, как делали, да еще и делают во многих OpenGL «уроках») — оптимизация по колличеству вызовов Draw[Indexed]Primivites(DIP).
                                    Сейчас железо сильно быстрое — поэтому более эффективно по DIPам и памяти создавать такой кеш «на лету». Особенно актуально для локализованных версий, где общий набор символов не постится в свободную видео память.
                                    Конечно получается что такой атлас хранится без компрессии, но тк шрифты — контрастное и высоко частотное изображение — пожимать его плохо.
                                      0
                                      Да, именно так. Спасибо за развернутое пояснение
                                    +2
                                    Это очень круто. Хотелось бы научиться делать такие вот вещи, разбираться в этом.
                                    Но пока только получаются приложения для вконтакте :)
                                      +11
                                      У меня есть идея написать методику вот таких вот «разборов». Может быть руки когда-нибудь дойдут.
                                        +1
                                        Pix. Вот пример такого разбора graphics.stanford.edu/~mdfisher/CaptureA/Capture.html :)
                                          0
                                          MS PIX for windows мой основной инструмент, но не единственный.
                                          +2
                                          Было бы очень познавательно увидеть подобную серию статей на хабре. Статьи можно разбить по тематике: террайн, тени, освещение, эффекты, интерфейс, хаки. В статье сравнить различные методики, какие есть проблемы, что быстрее, что «красивее».реалистичнее. В конце подробно рассмотреть самый технологичный вариант. Плюс поддержка реализации на PC, консолях и телефонах.
                                            +3
                                            Могу сделать статью про освещение террейнов по методу Ambient Aperture Lighting, если есть желающие (защищал по нему курсовую=))
                                              +2
                                              Есть! Пишите, пожалуйста :)
                                      • UFO just landed and posted this here
                                          0
                                          Есть разные варианты
                                          В Crysis все обьекты для аутлайна рендерятся в отдельные(один) рендер таргет и потом при блитинге на главную сцену используют edge detection filter
                                            0
                                            Да, все верно. Надо смотреть какой именно эффект необходим. Например, в некоторых стратегиях есть подсветка элементов закрытых другими объектами. В таком случае используются техники со стенсил буфером.
                                              0
                                              На современном железе доступны выборки из буфера глубины — поэтому этот же эффект можно сделать без stencil буфера.
                                          +2
                                          Интересно, что даже для современных игр типа Diablo 3 до сих пор используются такие классические технологии, как предрассчитанные лайтмапы, карты теней, эффекты на основе текстурок и т. д. Из более-менее новых технологий разве что FXAA (который впервые появился в скайриме), а всё остальное было ещё в далёких 2000-х. И даже если бы были нормалмапы, это вряд ли бы что-то изменило. Где CUDA/OpenCL, где рейтрейсинг по хитро просчитанным BVH-деревьям, воксельные системы, физически-корректные и реалистичные BSDF или даже BSSRDF для подповерхностного рассеяния? Арргх, не дожить мне до этого дня!
                                          • UFO just landed and posted this here
                                              +3
                                              Можете объяснить несведущему, зачем применять что-то новое, если старое так хорошо выглядит и протестировано?
                                                0
                                                Новые технологии очень привлекательно выглядят на бумаге и в презентациях. Часто заказчик видит и говорит: «Вот это круто. Хочу чтобы было так же!». Для качественной картинки и «устаревших» технологиях нужны художники, моделлеры и дизайнеры высочайшего класса. На «новых» эффектах можно вытащить картинку на более высокий уровень. Возможно причина в этом.
                                                  +2
                                                  По меркам игр, существовавших до этого, может это и правда это хорошо выглядит. Но с точки зрения фотореализма, один раз увидишь вариант лучше — всегда о нём будешь думать. Например лайтмапы: тени красивые, но объекты просто невозможно сдвинуть. Карты теней — да, даёт тень по форме объекта, но где в реальной жизни тень получается от блюра формы объекта? Если есть motion blur для объектов, то он наверняка векторный, а значит не будет распространяться на отражения и преломления. И в целом, олдскульные шейдеры (Фонги, Ламберты и прочие) дают очень приближённое освещение, в частности, не учитывающее форму источника. И таких мелочей множество, даже в одной области освещения.
                                                    0
                                                    1. Объекты невозможно сдвинуть. Если игра базируется на таких принципах, зачем применять более тяжелое и сложное решение (например SSAO)? Визуально то ничего не меняется.
                                                    2. Мягкая тень (пусть и не физически корректная) всяко лучше чем жесткая и угловатая. В игре персонажи занимают небольшую часть экрана, и при таком ракурсе все равно ничего не видно. Так зачем платить больше?

                                                    Вся игровая графика это баланс между реалистичностью (красивостью) и производительностью и спектром поддерживаемой аппаратуры. Зачем делать что-то заведомо более сложное и медленное, если увидеть разницу получается только сильно приглядываясь? Разработчики это понимают очень хорошо.
                                                  0
                                                  Очень много самых современных эффектов очень плохо живут в реал-тайм графике. Вернее они то живут, но отдельно (в демках) и на топовом железе. Игра это далеко не только графика, да и вопрос охвата максимальной аудитории (а это и слабые, и встроенные видеокарты) стоит достаточно остро. А делать 2 и более рендеров (например low-end DX9, и high-end DX11) с разным набором эффектов и технологий сильно напряжно.
                                                    +1
                                                    Главный поинт что красота не является следствием технологии. :)
                                                      0
                                                      Я офигенно рад, что смог пройти D3, на своем MBP 13" со встроенной HD3000. И хоть половины эффектов не было видно, но все равно уровень графики оказался очень хорошим, за такие игры даже платить приятно.
                                                      0
                                                      Diablo3 стала разрабатываться довольно давно. И как не сложно заметить на всех ранее выпущенный проектах студии — они всегда делали упор на не требовательность к железу.
                                                      Достаточно вспомнить что StarCraft использовал всего 256 цветов! WOW — на момент выпуска был играбелен на интегрированной графике от Intell.

                                                        +1
                                                        Он и сейчас играбелен на интегрированной графике от Intel.
                                                          +1
                                                          ключевое слово «на момент выпуска». :)
                                                          тогда интегрированная графика от интелл была сильно слабей.

                                                          Сейчас конечно тоже можно в той же конфигурации начать играть, но новые рассы и локации более тяжелые, да и посещение людных мест не будет радовать тормозами :))
                                                            0
                                                            Нет, не играбелен. На батлграундах 10х10 будут тормоза в замесах, не говорю уже о 40х40. Тоже самое с рейдами, а это, по сути, основной end game контент.
                                                            Возможно, с минимальным разрешением и удастся достичь примлемого фпс, но тогда текст будет слишком мелкий и не хватит места для панелек (все же мы говорим о игре, где необходимо иметь быстрый доступ к по меньшей мере 20-30 абилкам).
                                                            Кстати, с выходом последнего аддона производительность ощутимо упала, уж не знаю, что они там сделали.
                                                            0
                                                            Моя девушка играет в ВоВ на MBA 11" (Intel HD 4000). С оптимизацией настроек (Good quality минус всякие SSAO итд) выдает 60 фпс.
                                                              +1
                                                              Новые видео ядра от Интелл значительно лучше старых :)
                                                            +2
                                                            В 3D графике всегда будет много предпросчитанного и закэшированного — это оптимизация и перераспределение ресурсов с процессора на память. Потому что процессор всегда есть чем занять его во время отрисовки кадра дорого.
                                                            Если есть возможность запихнуть эффект в несколько текстурок и простых партиклов, то любой разработчик так и сделает и займется чем ни будь пополезнее.

                                                            Пока BSDF можно имитировать дефмепами с парой фильтров, никто не будет тащить в свой рендеринг просчет трассировкой с каким бы грубым приближением он не работал. Так это добавит алгоритмы с высокой сложностью, как вычислительной, так и кода, которую нужно будет держать под контролем.
                                                              +2
                                                              Это классическая «вилка» — циклы(CPU/GPU) vs память. :)
                                                            +1
                                                            А вы анализировали игры сделанные с Unity? Интересно, насколько большой простор у разработчиков для оптимизации графики, используя этот движок. Можно было бы создать игру подобную Diablo 3 и с системными требованниями на уровне, используя обычную версию Unity Pro?
                                                              +1
                                                              Я не то что бы анализировал, я делал современную графику на Юнити. В то время Direct3D (или OpenGL) предлагает определенные возможности, Юнити очень сильно эти возможности зажимает. Зачастую приходилось именно «бороться» с движком чтобы сделать что-то эдакое. Если с более-менее стандартными эффектами и возможностями Юнити справляется неплохо, то попытки отступить чуть в сторону обычно заканчиваются препятствиями со стороны движка. То то не поддерживается, то нет возможности управлять нужными состояниями. Игру уровня Diablo 3, думаю, сделать можно.
                                                                +1
                                                                А где-нибудь о ваших «сражениях» с Unity и их результатах можно прочесть? Всегда стоит вопрос, как оптимально там улучшить качество графики и с чего начать.
                                                                Мне вот после игры The Room на айпаде никак покоя нет, уж слишком идеально материалы сделаны для юнити, никак не пойму, как они такого добились…
                                                                  0
                                                                  Так на то они и рамки кроссплатформа, чтобы зажать так, чтобы работало везде и без дополнительных танцев с бубнами в дальнейшем.
                                                                    0
                                                                    Это все верно. Но иногда мне не нужна кроссплатформенность, а нужен функционал.
                                                                      0
                                                                      Тогда это уже не конструктор нужен, закрученный под WYSIWYG и прицелом под кучу платформ, включая мобилки. :)
                                                                  +1
                                                                  можно делать вот такое (подробнее)
                                                                  +1
                                                                  У Valve на сайте есть раздел с презентациями, там тоже описываются интересные вещи, например, как в Portal 2 делалась вода и пузырьки в геле, как было сделано освещение в Half Life 2.
                                                                  • UFO just landed and posted this here
                                                                    +2
                                                                    Если кому интересно, я недавно писал статью про использование Intel GPA для flash-разработчиков. Штука очень универсальная, с её помощью можно посмотреть все что угодно, особенно можно «поиграться» с теми самыми дроуколами, отредактировать шейдера, есть большой набор возможностей чтобы понять любое поведение. Можно посмотреть все рендер таргеты, узнать историю пикселя и какие дроуколы на него влияли, сохранить все текстуры, заменять их на простые, устанавливать им мипмапинг… вообщем полезная штука, особенно когда вопрос касается производительности(оптимизация шейдеров, работа с блендмодами, определить overdraw в сцене и др.) Intel GPA очень прост, буквально после 2-3 часов уже к нему привыкаешь. Но есть один минус, работает только на Windows и только с DirectX.
                                                                    Я тоже хотел сделать обзор графики в Diablo III, но они так и не ответили положительно на мою просьбу разрешить сделать обзор =(
                                                                      0
                                                                      GPA так же часть моего арсенала, и это очень полезная утилита. Но и у нее есть недостатки. Нельзя смотреть вершинные и индексные буфера. Не показывает декларации вертексных форматов. Метрики измерения производительности немного странно работают на видеокартах не от Intel.
                                                                      0
                                                                      Вот не понял, почему именно A32B32G32R32F. Не «дешевле» было бы считать квадрат в шейдере?
                                                                      Если и так уже как-минимум билинейную фильтрацию переложили с железа на программный шейдер.
                                                                        0
                                                                        По началу такая «оптимизация» кажется очевидная. Но надо вспомнить, что пред использованием карта теней блурится. Т.е. квадратичное значение тоже усредняется между несколькими соседними текселями. Обычно это очень много соседей. Для 7х7 блура получим 49 значений. Если считать квадрат в шейдере, то надо будет посчитать квадрат среднего значения из 49 выборок оригинальной текстуры, а это уже очень медленно.
                                                                          0
                                                                          Про blur не подумал. В таком случае да, очень накладно.
                                                                          0
                                                                          С другой стороны почему не использовалась 64бит 2х канальная текстура. Все же в 2 раза меньше по памяти\шине (и что так же должно увеличить скорсть текстурных выборок при фильтрации).
                                                                          Видимо решили не заморачиваться с вопросами разной скорости работы и поддержки картами\драйверами.
                                                                            0
                                                                            Потому что в Д3Д9 нет такого типа поверхностей. Впрочем, в ДХ11 тоже.
                                                                            И почему вдруг было бы 2 раза меньше? 64 х 2 == 32 х 4
                                                                              +1
                                                                              Думаю имелось в виду текстура формата R32G32F. Как раз 64 бит на пиксель.
                                                                                0
                                                                                Мдэ… туплю. Приношу свои извинения, посыпаю голову пеплом и ухожу спать.
                                                                              0
                                                                              Нет, нет. Там еще 1 канал в этой шадоу мапе используется для каких-то целей. Я не до конца понял для чего именно и тогда видимо пошел дальше, оставив это на потом. И вот вспомнил только про это как раз.
                                                                                0
                                                                                А сохраненных дампов не осталось посмотреть на содержимое?
                                                                                  0
                                                                                  Осталось конечно. Как будет время я гляну.
                                                                                    0
                                                                                    Глянул для чего еще один канал выводится. Все банально — там записана интенсивность тени. Т.е. обычной константой задается как сильно будет влиять тень от данного кастера на затемнение оригинального цвета места на которое ложится тень. Значение от 0 до 1. Получается per-object shadow intencity. Один канал остается свободный
                                                                                      0
                                                                                      любопытно! градиент или константа?
                                                                                        0
                                                                                        Константа передающаяся из игры в шейдер.
                                                                              0
                                                                              Полноэкранное сглаживание выполнено также как пост-процесс эффект. Причин этому несколько. Использование INTZ буфера глубины становится невозможным (нельзя создать чистый multisampled INTZ depth buffer для последующего копирования его в non-multisampled INTZ текстуру), и shadow map будет занимать очень много памяти (напомню, что ее формат A32R32G32B32F, т.е. 16 байт на пиксель).

                                                                              Объясните ка, зачем это shadow map изметять свой формат, когда переходим к полноэкранному сглаживанию?
                                                                                0
                                                                                INTZ это особый формат буфера глубины. Он не используется для shadow mapping'a. Формат карты теней не будет меняться. Он останется ARGB32F. Но, тут два варианта. 1. Делать multisampled shadow map чтобы использовать существующий multisampled depth buffer. В этом случае размер карты теней смело умножаем на количество семплов мультисемплинга. 2. Делаем дополнительный non-multisampled depth buffer для рендера в non-multisampled буфер тени. И тот и тот вариант требует дополнительных затрат по памяти.
                                                                                  0
                                                                                  Всё равно не понимаю. Зачем при создании shadow map вообще нужен существующий depth buffer? У него же размер другой, в конце концов.
                                                                                    0
                                                                                    В данном случае shadow map это не depth buffer. Это обычная текстура (render target), куда мы шейдером выводим глубину пикселя, рисуя сцену с позиции источника освещения. Для корректного z-отсечения нам нужен depth буфер.
                                                                                      0
                                                                                      Это понятно. Вопрос был в том, при чём тут основной depth buffer сцены, который multisampled. Для z-отсечения при отрисовке в shadow map естественно использовать свой отдельный depth buffer, которому не важно, используется ли полноэкранное сглаживание или нет.
                                                                                        0
                                                                                        Свой отдельный depth буфер можно не использовать, а использовать основной depth буфер (если разрешение экрана и shadow map'ы совпадают, что практически никогда не происходит), либо depth буфер каких-либо других эффектов. В случае «другой» буфер глубины multisampled, а shadow map'a non-multisampled, то вместе они работать не смогут. Это я хотел сказать.
                                                                                          0
                                                                                          Быть multisampled нужно только основному depth buffer'у (контр-пример?), от которого shadow map никак не зависит:
                                                                                          … что практически никогда не происходит…

                                                                                          А значит и упоминать shadow map в принципе для обоснования FXAA перед multisampling было лишним:
                                                                                          … и shadow map будет занимать очень много памяти
                                                                                            0
                                                                                            Тут я допустил промашку в объяснении. Приношу извинения.
                                                                                –2
                                                                                «Производительность на высоте при красивой картинке»
                                                                                Складывается впечатление, что автор мало играл в Близзардовские игры)) Потому что непонятных багов и тормозов там всегда хватало. В том же Дьябло 3 меня удивляют постоянные фризы при подгрузке карты. А вот их художникам нужно отдать должное, всегда на высоте.
                                                                                  +2
                                                                                  Ну, мне графика нравится. Понятно, что это субъективно, и графика в Frostbyte 3 явно технологичнее и красивее. Непонятных «багов» как-то и не встречал. Тормоза из-за потоковой подргузки и кеширования данных. Графика тут не при чем. Я говорил о том что рендер у них сделан хорошо.
                                                                                  +1
                                                                                  Прочитал статью и нахлынула ностальгия по временам, когда ещё был жив game.exe, когда демки ставились с дисков, когда первый запуск игры начинался с обстоятельного копания в нескольких экранах настроек графики, а иногда и в конфигах.
                                                                                  Уже много лет домашний компьютер и рабочий ноутбук не видели игр, кроме стандартных косынок да сапёров, играю на консолях (купил все стационарные и мобильные, начиная с вии) и полностью окажуалился, однако такие статьи обожаю. Читаю тайком и наслаждаюсь, хотя половину терминов уже представляю довольно смутно. :)
                                                                                    –22
                                                                                    Ничё непонятно.
                                                                                    Плохо написана статья.
                                                                                      0
                                                                                      Статья хороша, правда иногда хочется спросить «а как это узнали?», например об отдельном aux рендер пассе для подсветки :)
                                                                                      Немного смущает пассаж про отсутствие per-pixel света и карт нормали (а значит и спекуляра) — неужели это так для любых настроек? Все-таки картинки довольно рельефны и как-то не верится, что все это per-vertex освещение, особенно для мобов.
                                                                                      Интересно, есть ли в природе откровения от разработчиков игры, с примерами текстур и моделей, как бывало с превосходными моделями из разных частей Assassin's Creed?
                                                                                        +1
                                                                                        Реверсом игр я занимаюсь давно, просто вот на хабре первый пост. Рендер реверсится с помощью свободно доступных тулзов, ну и знаниями как что работает. Я подумываю написать статью о методике реверсинга/отладки 3D приложений.
                                                                                        Я всегда реверсю на максимальных настройках графики игры. Карт нормалей в D3 нет вообще. А спекуляр спокойно живет и без них (спекуляр и карты нормалей никак не связаны по сути), и он есть в игре.
                                                                                        Откровений про рендер от разработчиков DiabloIII я в сети не видел, но есть дока по StarCraft2 pds17.egloos.com/pds/200908/12/03/Chapter05-Filion-StarCraftII.pdf
                                                                                        • UFO just landed and posted this here
                                                                                            0
                                                                                            спекуляр спокойно живет и без них

                                                                                            Меня это откровенно смущает. При вертексном освещении скалярные произведения нормали с светом/камерой считаются в вертекс шейдере. Это дает очень специфичные спекуляр артефакты:
                                                                                            web.gin.cz/trahern/glTest-perVertex.gif
                                                                                            Думаю, есть разные методы их побороть и все они довольно не тривиальные. Например, нет ли случайно в пиксельном шейдере отсылок к альфа-каналу спекуляр мапы?
                                                                                              0
                                                                                              Там тесселяция геометрии хорошая. От того и не будут видны такие вот артефакты. Что делает карта нормалей? Она дает больше нормалей на единицу площади геометрии, чем вершины меша. Если в модели много вершин, то это по сути то же самое.
                                                                                          0
                                                                                          Узнал как делают подсветку объектов под курсором. Чувствую легкое разочарование, думал для этого будут использоваться хитрые алгоритмы, ну или в худшем случае дважды будет рисоваться объект сначала масштабируемый с материалом подсветки, потом стандартных размеров со своим материалом. А тут рендеринг в текстуру даже, но я понимаю, качество диктует свои условия. Очень интересная для меня статься, хоть я всю жизнь только 2д игры делаю. )
                                                                                            0
                                                                                            Рендеринг в текстуру + размытие, однако :)
                                                                                            –4
                                                                                            А почему она так безбожно тормозит, вы не выяснили мимоходом?
                                                                                              0
                                                                                              Безбожно тормозит? У меня на стареньком GeForce 9600GT вполне шустро бегает практически на максимальных настройках. Есть проблемы с тормозами во время подгрузки ресурсов, но это к рендеру не имеет отношения.
                                                                                                –2
                                                                                                В пати пробовали бегать? Особенно с соркой или вд.
                                                                                                  +1
                                                                                                  Бегал всеми комбинациями классов. Вчетвером. Нормально вроде все.
                                                                                                    –1
                                                                                                    А вот у меня не нормально, да и судя по форуму тех. поддержки не только у одного меня. ФПС в пустом помещении 50-60, как-только встречается группа мобов — ФПС проседает до 30, во время боя ФПС падает до 10-15.
                                                                                              +1
                                                                                              Отличная статья. Спасибо, интересно. А еще было бы интересно послушать про то, как некоторые 2Д игры юзают GPU и шейдеры в своих целях )
                                                                                                0
                                                                                                Супер! Особенно порадовало что многое разжевано!

                                                                                                Что дальше? :)
                                                                                                  –3
                                                                                                  семплим шадоу мапу
                                                                                                  сач уордз куд лук рили беттер ин рашен
                                                                                                    +6
                                                                                                    Не факт, мне как геймдевелоперу намного привычнее именно оригинальный вариант.
                                                                                                      +1
                                                                                                      Это не оригинальный вариант. Такие термины лучше на английском писать, а не транслитерацией, как мне кажется.
                                                                                                      +1
                                                                                                      Ага можно заменить на фетчим шадоу мапу :)
                                                                                                        +3
                                                                                                        Да вроде аудитория не школьная…
                                                                                                          +1
                                                                                                          Я просто старался термины разнообразить. Везде писать «делаем выборку из карты теней» будет стилистически не очень красиво
                                                                                                            +2
                                                                                                            Не обращайте внимания. Это же — Мицгол. Он с удовольствием будет писать «щелкаем левой клавишой манипулятора „мышь“ ;)
                                                                                                          0
                                                                                                          Привет, __vortex__ :)
                                                                                                            0
                                                                                                            Вот только жаль что размітие влияет и на обычные «картинки». Вот если сравнить изображения вещей на сайде и в игре, то видно, что в игре они размыты, похоже что «мылится» весь экран в не зависимости от того модель это или битмап. Неприятно как-то.
                                                                                                              +1
                                                                                                              Если не нравится «мыло», то попробуйте Dark D3 Pixel Shader.
                                                                                                                0
                                                                                                                Под вайном не работает. Да и мне не нравится только на изображениях вещей мыло, сама игра нормально смотрится.
                                                                                                                  +1
                                                                                                                  У меня работает. Нужно d3dx9 и d3dx9_43 из вайнтрикса установить, и выставить d3d9 (сторонняя, встроенная); d3dx9_43 (встроенная, сторонняя).
                                                                                                                    0
                                                                                                                    Не знал, спасибо. Забанить не должны?
                                                                                                                      0
                                                                                                                      Насколько я знаю, никого еще не забанили. Да и я играю уже несколько месяцев с этим модом — нормально.
                                                                                                                        0
                                                                                                                        За шейдеры нет, а за вайн кто знает, тут опять жалобы появились: eu.battle.net/d3/ru/forum/topic/4211085028?page=7
                                                                                                                0
                                                                                                                а не разбирали от чего в gta4 тени так тормозят комп?
                                                                                                                  0
                                                                                                                  я ГТА4 только мельком смотрел. Сильно не разбирался.

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