Game development: Тяга к революциям / Настоящее и недалекое будущее трехмерных технологийИсточник: codingclub
"Шейдеры" - один из самых неудачных терминов во всей истории IT, тем не менее эта технология пришла к нам довольно давно и надолго заняла ключевое место в нашем бюджете. Однако шейдеры - это не единственный вид грызунов, которые грозят нашему бюджету дырками. Будем готовиться к купюрному листопаду :) история На платформе PC точкой отсчета для шейдеров является видеокарта NVidia GeForce 2 GTS. Именно в этой карте впервые появились шейдеры, но они не произвели прорыва. В связи с тем, что в то время шейдеры не были специфицированы и не поддерживались производителями игр, эта видеокарта так и осталась неким пробным камнем, запущенным в направлении наших бумажников. Официальная история шейдеров начинается с серии GeForce 3 - в то время появились шейдеры версии 1.Х и спецификации DirectX 8.1. Для того чтобы не отягощать тебя лишними индексами и моделями карт, далее я буду рассказывать только о поколениях шейдеров (с точки зрения программистов). Итак, сейчас мы имеем три поколения: 1.Х, 2.Х и 3.Х. На сегодняшний день (до релиза Windows Longhorn) последняя программная спецификация от Microsoft называется DirectX 9.0c, она включает в себя поддержку всех существующих версий шейдеров. терминология С точки зрения разработчика графической программы, шейдер - это набор состояний графического конвейера плюс программный код, который выполняется графическим процессором (GPU). Например, в первом Quake тоже были шейдеры… Удивлен? Все очень просто, таким термином обзывали программную абстракцию, которая управляла различными состояниями видеокарты. Бессмысленно рассматривать код, исполняемый GPU, отдельно от состояний графического конвейера - это единое и неделимое целое. На рис. «Пример шейдера» изображен типичный шейдер - код программы, написанной на языке HLSL, плюс кое-какие дополнительные навороты, позволяющие установить нужные параметры видеокарты. графический конвейер Прежде чем начинать изучение шейдеров, необходимо представлять себе, как работает современный графический конвейер, какие данные приходят ему на вход и как он обрабатывает их. Представь себе, что ты хочешь нарисовать на экране трехмерный куб. В памяти твой куб будет представляться в виде набора вершин, которые описывают составляющие его треугольники (примитивы). Каждая вершина характеризуется своими координатами в 3D-пространстве: x, y, z - минимум, без которого не обойтись. Обычно вершина содержит дополнительные параметры: нормаль, диффузный и спекулярный цвета, несколько наборов текстурных координат и т.д. Для оптимизации и чтобы задействовать вершинный кеш более эффективно, примитивы используют общие вершины. На рис. «Организация вершин» видно то, как семь вершин образуют пять треугольников. Формирование изображения на экране происходит следующим образом. В каждый момент времени главный поток программы генерирует кадры изображения. Например, для комфортной игры в шутер необходимо генерировать минимум 25 кадров в секунду. Посмотри на диаграмму «Графический конвейер». Создание кадра начинается с того, что карте сообщается, какую именно геометрию ей необходимо нарисовать для этого кадра (шаг «буфер вершин»). Каждая вершина обрабатывается вершинным процессором, в который заранее загружена вершинная программа (вершинный шейдер). Обычно эта программа трансформирует вершины исходя из заданных мировой и видовой матриц и для каждой вершины вычисляет специфические данные (нормаль, цвет). Как ты помнишь, вся геометрия разбивается на треугольники. Видимые на экране фрагменты треугольников (после отброса невидимых фрагментов) попадают в пиксельный процессор, где они обрабатываются фрагментным процессором (пиксельный шейдер), который рассчитывает цвет каждого фрагмента. Откуда берутся компоненты цвета фрагмента? Из текстур, покрывающих треугольник, из освещенности и затененности фрагмента и прочих эффектов. Параметры для каждого фрагмента передаются в пиксельный шейдер интерполированными по всему обрабатываемому треугольнику, то есть они находятся в прямой зависимости от параметров вершин треугольника. После расчета цвета фрагмента он смешивается с текущим кадром в зависимости от настроек конвейера. Буферы между различными частями конвейера позволяют задействовать конвейер наиболее эффективно - с целью минимизации его простоев. поколения процессоров Сравним возможности вершинных и фрагментных процессоров трех поколений. Поскольку первое поколение шейдеров было самым многочисленным (в плане версий), я возьму для сравнения только версию 1.4, остальные практически не отличаются от нее. Для версии шейдеров 2.0 буду рассматривать спецификацию расширенных шейдеров 2.Х. Как видно по сравнительной таблице, с каждым новым поколением возрастает длина шейдеров и количество регистров, что позволяет усложнять и усложнять используемые эффекты. Введение инструкций для управления кодом (циклы, условия) позволяет проверять передаваемые из базового кода, выполняемого обычным CPU, условия и параметры (например позиции источников света). Благодаря этому становится возможным создавать реалистичное попиксельное освещение, зависящее от нескольких различных лампочек, создавать реальные (мягкие) тени, эффекты глубины поверхностей и т.д. вершинный процессор Теперь покопаемся в кишочках каждого процессора, первый в очереди - вершинный. Как видно по диаграмме «Графический конвейер», на его вход попадают вершины треугольников, образующих сцену. Для каждой вершины выполняется вершинный шейдер, заранее загруженный в видеокарту. Посмотри на рисунок «Пример шейдера»: в XML-узле VertexShader содержится код вершинной программы (функция main). Эта программа довольно простая, к каждой вершине она добавляет диффузный цвет и вычисляет значение текстурных координат для специальной текстуры, которые изменяются в зависимости от того, под каким углом мы смотрим на сцену. Однако для того чтобы начать расчет нужных данных, мы должны перевести координаты вершины из базового пространства (единичной системы координат) в мировое пространство - эти вычисления обязательны, если мы хотим, чтобы сцена отображалась на экране с учетом камеры и координат в мировом (сценическом) пространстве. Это преобразование выполняется с помощью строчки: o.pos = mul( i.pos, WorldViewProjection ). Данные о вершине попадают в функцию main() из потока входных данных - это так называемый однородный (uniform) ввод данных, которые попадают в процессор из локальной памяти видеокарты в регистры входных данных (Input registers). Данные, которыми ты влияешь на шейдер из своей управляющей программы, работающей на CPU, попадают в программу через константные регистры (варьируемый вход). Эти данные не могут быть изменены в коде шейдера, поэтому и называются константными. В нашем примере константные данные - различные матрицы (видовая и мировая), а также диффузный цвет вершины. Временные регистры используются для сохранения промежуточных результатов вычислений (в нашем случае - переменные nrm и e2v). Регистр предикатов содержит в себе флаг - некоторое условие, которое может быть задано заранее (извне шейдера) или рассчитано в программе. С помощью этого условия можно повлиять на ход выполнения программы (ветвления). В шейдерах второго поколения (2.0 и 2.Х) возможны ветвления кода, причем в шейдерах версии 2.0 возможны только статические ветвления (циклы и подпрограммы), то есть проверка условий, заданных извне шейдера. В расширенных шейдерах 2.Х возможно и динамическое управление ходом выполнения шейдера. Например, если рассчитанный диффузный цвет вершины красный, то следует делать одно, если красной компоненты не содержится - делать другое. После того как ты выполнишь все необходимые вычисления с входными данными, настанет время заполнить структуру выходных данных. Она ничем не отличается от структуры входных данных, за исключением текстурных координат. Выходные данные передаются через выходные регистры. Подведем итоги: вершинный процессор получает вершину, переводит ее из базового пространства в пространство мира и камеры, подготавливает данные вершины (текстурные координаты) для последующей обработки фрагментным процессором. на пути к фрагментному процессору После обработки вершинным процессором данные геометрии сцены складируются в промежуточном буфере готовых вершин. Из вершин формируются треугольники, а из треугольников - их фрагменты. С точки зрения программ, выполняемых GPU, этот процесс незаметен, поскольку на вход пиксельному шейдеру, завершающему обработку, попадают видимые фрагменты треугольников, но ты должен понимать все происходящее внутри видеокарты. Три готовые вершины образуют треугольник. Треугольник разбивается на фрагменты. Эти фрагменты проверяются на видимость на экране с помощью Z-теста (проверка на видимость), и уже видимые фрагменты попадают на вход фрагментной программе. Почему я заостряю твое внимание на этом процессе? Здесь есть одна тонкость. Ранее ты рассчитывал текстурные координаты для вершин, а фрагментному процессору достаются текстурные координаты для фрагментов. Откуда они берутся? Интерполированием по всему треугольнику, между текстурными координатами трех его вершин. фрагментный процессор Посмотри еще раз на код примера (XML узел PixelShader). Входные данные для фрагментного процессора аналогичны выходным данным вершинного процессора с учетом того, что они интерполированы для конкретного фрагмента внутри треугольника. На выходе из фрагментной программы мы должны получить результирующий цвет фрагмента с учетом текстур, освещения, затенения и т.д. (в зависимости от решаемой задачи). В константных регистрах процессора задаются константы из главной программы. Временные регистры служат для сохранения промежуточных результатов вычислений. Самплеры - это то же самое, что и текстуры. Регистры текстурных координат содержат интерполированные текстурные координаты для фрагмента. Регистр предикатов и, соответственно, статические и динамические ветвления появляются только в 2.Х-версии пиксельных шейдеров. В последнем (третьем) поколении шейдеров появляется регистр стороны треугольника, который содержит положительное значение для передней стороны и отрицательное - для задней. Эта возможность используется для выбора различных схем расчета результирующего цвета (выбор освещения) для разных сторон треугольников. недалекое будущее Гадание на кофейной гуще - чрезвычайно увлекательный процесс, именно им и занимаются многие аналитики IT-рынка. Их фантазии нельзя назвать никак по-другому. В пришествии технологии шейдеров на платформу PC нет ничего удивительного. Если в прошлом видеокарты выполняли фиксированный набор действий, то теперь этих действий стало на порядок больше за счет того, что появилась возможность писать управляющие программы (шейдеры) для графических процессоров. После резкого перехода от технологий фиксированного к технологиям программируемого графического конвейера индустрия продолжила свою эволюцию. Шейдеры обрастали мясом функциональности, новыми возможностями и регистрами, высокой частотой и возможностями распараллеливания вычислений. На сегодня мегамонстр PC-графики держит на своем борту 512 Мб памяти, работает на частоте 600 МГц, данные обрабатываются 24-мя пиксельными конвейерами. Также имеются решения на базе технологии SLI из двух видеокарт. Налицо тенденции к распараллеливанию вычислений. Почему существуют такие тенденции? Все очень просто, инженеры подходят к границам миниатюризации технологического процесса, преодолеть которые невозможно физически. Так что остается двигаться в сторону параллельных вычислений: многоядерные процессоры, многоканальные контроллеры памяти, мультиконвейерные графические решения. В ближайшем будущем нас ожидает новая операционная система от Microsoft, вместе с ней к нам придет новая архитектура графических драйверов и новый DirectX. Прыгнут ли графические технологии еще раз вперед? Вряд ли. Получим ли мы ощутимую прибавку к производительности и качеству? Наверняка. Нужно ли нам это как пользователям? Вот здесь я сильно сомневаюсь, мне, к примеру, надоело менять видеокарту каждые два года, отваливая за нее от $100 до 200. А тебе? Если не надоело, то прочитай вот это: http://thg.ru/graphic/20060114/onepage.html. в гостях у ньютона Графика - это не единственное направление, в котором наблюдается устойчивое появление все новых технологий на один геймерский доллар. Кроме шейдеров, в твой карман стремится залезть еще один ускоритель, на этот раз - ускоритель физики PPU (Physic Processing Unit). Итак, в начале марта 2005 года, когда все российские женщины готовились принимать очередную дозу дежурных комплиментов, молодая калифорнийская компания AGEIA объявила о разработке устройства, способного совершить революцию, аналогичную некогда триумфальному появлению Voodoo от компании 3DFx. По заверениям разработчиков, технология PhysX должна была взять на себя задачи по обсчету физики сцены, которые на тот момент решались CPU. Динамика твердых, гибких и жидких тел, столкновения, моделирование волос, меха и т.д. отныне будут осуществляться в процессоре PhysX. В отличие от современных игр, те игры, которые поддерживают технологии AGEIA, смогут отображать на экране не сотни объектов, подчиняющихся упрощенным законам физики, а десятки тысяч реальных объектов, полностью подчиняющихся всем законам физики. В новой эре будут сняты, казалось бы, монументальные ограничения на целостность (не разрушаемость) мира и ограниченность модели освещения и построения теней - PhysX может взять на себя и эти вычисления. Чип, состоящий из 125 млн. транзисторов, будет выпускаться по 130-нм техпроцессу в виде платы расширения с интерфейсом PCI или PCI-Express. Потребление энергии составит около 25 Вт. Кроме самого чипа, на борту платы будет располагаться 128 Мб 2.0 нс GDDR3-памяти, работающей на гигагерцовой частоте. В будущем планируется использование XDR-памяти. AGEIA представляет собой небольшое конструкторское бюро в Калифорнии с офисами в Сент-Луисе и отделами разработчиков в Швеции, Швейцарии и Китае. Чипы будут производиться, по всей видимости, на производственных мощностях TSMC. Стоимость чипа составит от $100 до 400. В качестве API для железа будет выступать PhysX SDK, включающий в себя технологии Megon и NovodeX, купленных в 2005 году. Обещанный на Рождество 2005 года, выпуск плат был отложен на второй квартал 2006 года. По заявлениям официальных лиц AGEIA, такое решение было принято для того, чтобы плата не затерялась в толпе рождественских новинок. Однако не все так просто, как хотелось бы AGEIA. Сдвиг даты выпуска PhysX нужен для доработки платы в плане ее удешевления. Сейчас в Сети циркулируют слухи о том, что железка будет стоить $199. Однако главная причина кроется, по всей видимости, в немногочисленности игр, поддерживающих технологию AGEIA. Напомню, что PhysX SDK используется в Unreal Engine 3. 17 января 2006 года о поддержке этой технологии объявила компания Emergent Game Technologies (производители движка Gamebryo 3D). Таким образом, следующие тайтлы наверняка будут поддерживать PhysX: The Elder Scrolls IV: Oblivion, Loki, Warhammer MMORPG, City of Villains, Tom Clancy's Ghost Recon Advanced Warfighter. Эти и, наверняка, многие другие игры создадут солидную критическую массу игр, ускоряющихся железкой, и будут являться солидными аргументами для игроков в пользу приобретения PhysX. сомнения Уже мало кто сомневается в триумфе AGEIA. Однако их конкурент, компания Havok, анонсировала свою технологию - Havok FX, которая использует для физических расчетов и ресурсы CPU, и ресурсы GPU третьей шейдерной модели. Производитель чипов Radeon, канадская компания ATI, также предлагает использовать пиксельные шейдеры 3.0 в видеокартах серии Х1000 для произвольных вычислений, при этом текстуры используются для хранения данных, а фрагментный процессор - для их обработки. Для сравнения: процессор Pentium IV 3 ГГц имеет производительность порядка 12 GFLOP, а его системная шина - полосу пропускания порядка 6 Гб в секунду; фрагментный процессор ATI Radeon X1800XT - 120 GFLOP и, соответственно, 42 Гб в секунду. Тесты показали то же, что и предполагала теория. Производительность вычислений возросла в два-три раза при их переносе с CPU на GPU. Однако меня, например, одолевают все новые и новые сомнения, когда ATI надувает щеки и поигрывает бицепсами. Все дело в стоимости решений от AGEIA и ATI. AGEIA предлагает железку не дороже чем за $400, а ATI - за $600. Кроме того, пользователям придется приобретать вторую такую же видеокарту. Я говорю о технологии ATI Crossfire - аналоге SLI решения от NVidia: в паре работают две карты, одна занимается только физическими расчетами, вторая - только графикой. Так что стоимость решения поднимается до $1200, что, согласись, не идет ни в какое сравнение с максимальными 400 у.е. от AGEIA. Однако вновь мои сомнения возрастают, когда в голову приходит мысль о том, нужны ли вообще современному рынку игр физические ускорители? Единственным удачным примером использования физики в игровом процессе является Half-Life 2. Причем с этой физикой (Havok 2) легко справляются современные процессоры от Intel и AMD. Обе компании, между прочим, также не дремлют и объявляют от том, что многоядерные процессоры будут лучше справляться с играми… Да ладно вам, ребята, дрыхните дальше… Что же станут делать дизайнеры игр, если пользователь будет ждать от них полной разрушаемости игрового уровня? Куда денутся классические сюжетные преграды, если можно отыскать где-нибудь динамита и взорвать к чертовой матери дверь, не пропускающую по сюжету? Впрочем, ответов на многие вопросы, которыми будут развеяны мои сомнения, осталось ждать недолго - не позднее лета 2006. На это время запланировано с десяток разных «революций»: Longhorn, AGEIA PhysX, Sony PlayStation 3, Nintendo Revolution и, конечно, куча мегатайтлов, сопровождающих железо, вроде Oblivion. Странное совпадение, не правда ли?.. Графика ТИП: WWW msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/dx9_graphics_reference_asm.asp www.ixbt.com/video2/dx-current.shtml www.ixbt.com/video2/dx-next.shtml www.ixbt.com/video2/dx-update.shtml www.ixbt.com/video2/longhorn.shtml Физика ТИП: WWW www.ageia.com www.havok.com www.radeon2.ru/articles/r5xx/gp_gpu «ШЕЙДЕРЫ» - ОДИН ИЗ САМЫХ НЕУДАЧНЫХ ТЕРМИНОВ ВО ВСЕЙ ИСТОРИИ IT, ТЕМ НЕ МЕНЕЕ ЭТА ТЕХНОЛОГИЯ ПРИШЛА К НАМ ДОВОЛЬНО ДАВНО И НАДОЛГО ЗАНЯЛА КЛЮЧЕВОЕ МЕСТО В НАШЕМ БЮДЖЕТЕ ОФИЦИАЛЬНО ИСТОРИЯ ШЕЙДЕРОВ НАЧИНАЕТСЯ С СЕРИИ GEFORCE 3 С ТОЧКИ ЗРЕНИЯ РАЗРАБОТЧИКА ГРАФИЧЕСКОЙ ПРОГРАММЫ, ШЕЙДЕР - ЭТО НАБОР СОСТОЯНИЙ ГРАФИЧЕСКОГО КОНВЕЙЕРА ПЛЮС ПРОГРАММНЫЙ КОД, КОТОРЫЙ ВЫПОЛНЯЕТСЯ ГРАФИЧЕСКИМ ПРОЦЕССОРОМ В ПЕРВОМ QUAKE ТОЖЕ БЫЛИ ШЕЙДЕРЫ… С КАЖДЫМ НОВЫМ ПОКОЛЕНИЕМ ВОЗРАСТАЕТ ДЛИНА ШЕЙДЕРОВ И КОЛИЧЕСТВО РЕГИСТРОВ, ЧТО ПОЗВОЛЯЕТ УСЛОЖНЯТЬ И УСЛОЖНЯТЬ ЭФФЕКТЫ НА ВХОД ВЕРШИННОМУ ПРОЦЕССОРУ ПОПАДАЮТ ВЕРШИНЫ ТРЕУГОЛЬНИКОВ, ОБРАЗУЮЩИХ СЦЕНУ. ДЛЯ КАЖДОЙ ВЕРШИНЫ ВЫПОЛНЯЕТСЯ ВЕРШИННЫЙ ШЕЙДЕР, ЗАРАНЕЕ ЗАГРУЖЕННЫЙ В ВИДЕОКАРТУ РЕГИСТР ПРЕДИКАТОВ И, СООТВЕТСТВЕННО, СТАТИЧЕСКИЕ И ДИНАМИЧЕСКИЕ ВЕТВЛЕНИЯ ПОЯВЛЯЮТСЯ ТОЛЬКО В 2.Х-ВЕРСИИ ПИКСЕЛЬНЫХ ШЕЙДЕРОВ PHYSX SDK БУДЕТ ИСПОЛЬЗОВАТЬ ДАЖЕ ШАХМАТНЫЙ СИМУЛЯТОР FRITZ ОТ КОМПАНИИ CHESSBASE ПО ЗАВЕРЕНИЯМ РАЗРАБОТЧИКОВ, ТЕХНОЛОГИЯ PHYSX ДОЛЖНА ВЗЯТЬ НА СЕБЯ ЗАДАЧИ ПО ОБСЧЕТУ ФИЗИКИ СЦЕНЫ, КОТОРУЮ ПОКА ВЫПОЛНЯЕТ CPU ОНИ СОЗДАДУТ СОЛИДНУЮ КРИТИЧЕСКУЮ МАССУ ИГР, УСКОРЯЮЩИХСЯ ЖЕЛЕЗКОЙ, И ДЛЯ ИГРОКОВ СОЗДАДУТ СЕРЬЕЗНЫЙ АРГУМЕНТ В ПОЛЬЗУ ПРИОБРЕТЕНИЯ PHYSX |