Введение
«Аппаратные шейдеры», «интерактивный рендеринг», «реалтаймовое кино» – эти термины все сильнее вторгаются в область трехмерной компьютерной графики.
Начало было положено выпуском качественно новых видеокарт – с революционным уровнем поддержки 3D, разработанных NVIDIA и ATI. В последнее время этот процесс «раскручивается» все сильнее, как благодаря выходу новых более совершенных аппаратных моделей GPU, так и разработке под них специализированного программного обеспечения. Прежде всего, Cg – «Си для графики» от NVIDIA, специализированного Си-подобного языка программирования GPU, так называемых аппаратных шейдеров, позволяющих реализовать самые фантастические спецэффекты в режиме реального времени с использованием только аппаратных возможностей видеокарт.
К сожалению, Cg узко специализирован и не годится для массового использования непрофессионалами в области программирования. Например, дизайнерами, которые имеют к графике, в том числе интерактивной, не самое последнее отношение.
Поэтому, неизбежно должны были появиться дополнительные, более доступные и массовые инструменты для работы с шейдерами. И они появились – CgFX, вариация Cg, совместимая со спецификациями программ-шейдеров DirectX, и требующая наличия в шейдере настраиваемых пользователем параметров, изменяющих его визуальное представление. Настраиваемость шейдеров позволяет модифицировать их графическими инструментами, более привычными для дизайнеров.
Стандарты, диктуемые разработчиками системного ПО (операционных систем), не стоят на месте, сегодня мы говорим уже о девятой версии DirectX и, соответственно, сами программы-шейдеры становятся все гибче и все более приобретают признаки полноценных программ с их условными переходами, циклами и т.д. и т.п. Шейдерам становятся «по плечу» все более сложные и изощренные визуальные эффекты в реальном времени, а сами интерактивные технологии все чаще попадают в центр внимания дизайнеров, художников, создателей фильмов. Логично, что после появления CgFX, появились и программы-плагины для работы с ним в пакетах 3D – в настоящее время такие возможности есть у Softimage XSI, Maya, 3d studio max.
Давайте рассмотрим суть того, что есть CgFX, на примере 3d studio max.
CgFX и 3d studio max
Итак, CgFX для max – это прежде всего средство визуальной отладки аппаратных программ-шейдеров в среде и инструментами 3d studio max 5. NVIDIA гарантирует полное соответствие визуального отображения результатов работы программы-шейдера в видовом окне max и в любом интерактивном приложении или игре. Код шейдера может содержать любую поддерживаемую языком Cg команду, а также вставки на Ассемблере или другом языке низкого уровня.
В целом, плагин CgFX позволяет средствами 3d studio max открывать файлы программ-шейдеров, выполнять их, модифицировать и наблюдать результаты в видовом окне в режиме реального времени. Файлы шейдеров совместимы с форматом FX, разработанным для DirectX, со всеми вытекающими последствиями.
И, наконец, каждая программа может и должна по определению иметь регулируемые параметры. Так что два объекта, которым назначен один и тот же шейдер, но с разными значениями регулируемых параметров, могут иметь различный вид (при этом сам код шейдера, естесственно, остается неизменным).
Таким образом, наличие регулируемых параметров позволяет и дизайнерам «вступить в игру». Какие именно параметры могут регулироваться, зависит от конкретного шейдера и цели, для которой он написан.
В качестве самых простых примеров таких параметров можно указать текстуры и цвет. Только представьте себе, что в Вашем распоряжении есть библиотека шейдеров для кожи человека, волос, глаз... готовая к немедленному использованию, фотореалистичная, настраивемая и интерактивная! ...расслабьтесь, такой библиотеки пока точно нет.
Помимо всего перечисленного, шейдер может иметь несколько техник. Под техникой понимается способ (кусок кода), реализующий ту или иную функцию шейдера. Поскольку шейдеры выполняются процессорами видеокарт, возникает проблема совместимости кода и возможностей видеокарты, на которой он выполняется. Наличие нескольких техник в принципе, утяжеляет шейдер, зато позволяет ему выполняться и на GeForce 2 и на GeForce FX. Благодаря плагину можно непосредственно в видовом окне открывать и редактировать текст программы-шейдера.
На этом я закончу рассмотрение принципиальной стороны вопроса и перейду к более конкретным вещам.
Практика
CgFX работает только с пятой версией max и только с API DirectX. Если проект обязательно требует OpenGL, то излагаемый далее материал для Вас бесполезен. В max этого сделать нельзя, потребуется экспортировать сцену для отдельной программы CgFX Viewer и там работать с шейдерами. Таким образом, все преимущества работы в среде max нивелируются.
Однако, альтернатива все же есть – NVIDIA выпущен соответствующий плагин для Maya, которая, как известно, работает только в OpenGL. К слову замечу, что даже в этом случае, по признанию разработчиков, все расчеты CgFX выполняет опять же в DirectX, транслируя соответствующие инструкции OpenGL. Обязательное же требование именно пятой версии max связано с тем, что только в этой версии в редакторе материалов появилась новая закладка Viewport Shader Manager, через которую осуществляется доступ к функциям аппаратного шейдера.
И еще, если вы собираетесь полноценно использовать CgFX, то настоятельно рекомендую запастись видеокартой NVIDIA последнего поколения. На «старых» GPU шейдеры либо вообще не будут работать, либо будут работать в режиме программной эмуляции, то есть обсчитываться центральным процессором. Говорить об интерактивности в этом случае не приходится.
Итак, 3d studio max 5 сконфигурирован для использования API DirectX, в вашей рабочей станции установлен Quadro FX (ну, или хотя бы GeForce FX), объект загружен для работы – что дальше? А дальше – вызываем редактор материалов, ищем там закладку Viewport Manager и в разворачивающемся списке выбираем CgFX, а в чекбоксе «Enabled», расположенном слева, ставим галочку.
После этого в нашем распоряжении оказывается свиток Viewprot Shader – CgFX, на котором расположены свойства материалов Material Mapping Options и Connection Editor. Первый из них предназначен для работы с растровыми картами, второй – для работы с изменяемыми параметрами аппаратного шейдера.
Над кнопкой Connection Editor отображается имя файла с загруженным шейдером.
Что касается растровых карт, то они перечислены и аналогичны по назначению слотам растровых карт стандартной части редактора материалов – диффузный цвет, прозрачность, светимость и т.д. Установка галочки в соответствующем чекбоксе слева разрешает шейдеру использовать это свойство при отображении, а растровая карта, которая используется для этого, должна быть загружена в соответствующий слот свойств стандартной части редактора материалов.
Подчеркну, что хотя список свойств материалов довольно внушителен, какие из них будут востребованы, определяет единственно программа-шейдер. Можно загрузить все соответствующие слоты свойств материала текстурами, но отобразятся только те из них, которые предусмотрены в коде шейдера. И обратно, если какая-то из растровых карт предусмотрена в коде шейдера, но не загружена в соответствующий слот редактора материалов, объект отобразится в видовом окне неверно (скорее всего, вообще не отобразится).
Под свойствами материалов находится кнопка Connection Editor, при нажатии которой активизируется редактор изменяемых параметров шейдера.
Диалоговое окно этого редактора разделено на две части: в левой перечислены параметры шейдера, которые можно изменять, а в правой вводятся конкретные значения параметров. Самая верхняя строка под свитком Properties в Connectio Editor – CgFX Shader – показывает название файла загруженного шейдера, а щелчок в правой части этой строки приводит к появлению дополнительных элементов интерфейса – Edit и File (невидимых в д ругих случаях), позволяющих редактировать текст программы загруженного шейдера или загрузить файл с другим шейдером.
Далее следует строка Tehnique, показывающая используемую для отображения технику (метод, например, с использованием вершинных и пиксельных конвейеров или без них). Это разворачивающийся список, и если позволяет видеокарта, могут быть доступны несколько методов.
Как уже говорилось ранее, кодирование различных методов отображения в одном шейдере делается с целью совместимости со старыми картами. При загрузке шейдера автоматически выбирается техника, оптимальная для установленной в системе видеокарты. Вид и значение параметров, появляющихся ниже, зависит только от конкретного шейдера.
В принципе, на этом - все. Подводя итог вышесказанному, получаем следующую схему работы с аппаратными шейдерами в 3d studio max: загружаем трехмерный объект, средствами max назначаем поверхности текстурные координаты, активизируем CgFX и загружаем из файла интересующий аппаратный шейдер. Далее изменяем параметры или редактируем программу шейдера и наблюдаем, что отображается в видовом окне. Изменение параметров локально, то есть действует только в пределах текущей сцены. Изменение программы глобально – приводит к изменениям во всех сценах, где используется данный шейдер. Очевидно, что кроме параметров, можно загружать свои текстуры в соответствующие слоты свойств материала.
В общем, пользоваться достаточно просто. Хочу еще раз подчеркнуть, что аппаратный шейдер предназначен для отображения в видовом окне. Результат его работы, в общем случае, будет отличен от результата работы программы-рендера 3d studio max, а встроенные возможности отображения max, относительно возможностей CgFX, иначе как «бедными» и не назовешь.
Слева - результат работы шейдера DiffuseBump.fx из библиотеки поставляемых с плагином готовых программ-шейдеров (скриншот видового окна max, видеокарта GeForce 2 Pro).
Справа – результат просчета картинки сканлайн-рендером max. В настоящее время на рынке имеются гораздо более совершенные видеокарты, которые позволяют достичь более совершенных результатов. Но даже в случае GeForce 2, т.е. при полном отсутствии у видеокарты поддержки пиксельных шейдеров и простейших вершинных шейдеров, результаты получились довольно впечатляющие.
Выводы
CgFX является удобным инструментом отладки аппаратных шейдеров и будет полезен программистам, особенно если проект, будь то игра или интерактивная презентация, изначально разрабатывается в 3d studio max. Я думаю, что он вполне может быть востребован в рабочих группах, где есть и Cg-программисты и 3D дизайнеры.
С точки зрения дизайнеров, CgFX, к сожалению, пока не может считаться полноценным рабочим инструментом. Причина в узкой специализации шейдеров, отсутствии на рынке общедоступных качественных библиотек готовых шейдеров и невозможности написать их собственными силами из-за нетривиальности программирования, требующего глубоких специализированных знаний из совершенно другой области.
Помимо видеокарт NVIDIA существуют (и еще как существуют!) GPU от ATI. Это я к тому, что CgFX вовсе не обязян корректно работать на «радеонах». Хотя... все же совместимость с форматом FX может здесь сыграть свою положительную роль. Вопрос легко решается практикой.
Поскольку сейчас уже отчетливо просматривается общее направление развития видеотехнологий – интерактивная трехмерная графика – можно констатировать, что в ближайшем будущем графические процессоры не будут участвовать в «программном» расчете рендеров трехмерных сцен в качестве помощников ЦП. А так хотелось!.. «Однажды лебедь, рак и щука...»
Скорость обработки шейдеров CgFX
В заключение хочу привести результаты измерений скорости обработки некоторых пиксельных шейдеров видеокартой GeForceFX 5200 в видовом окне max.
Конфигурация тестовой системы:
Процессор Intel Pentium 4 2000 МГц;
512 Мб ОЗУ PC 2700;
Видеокарта GeForceFX 5200 (250 МГц GPU, 330 МГц DDR 128 бит);
Операционная система Windows XP SP2;
3ds max 5.1 c SP 1 (сервис-пак обеспечивает совместимость max с DirectX 9).
Для тестов использовалась модель NV_Shaderball.max и шейдеры, входящие в состав плагина CgFX для 3ds max 5. Методика тестирования – трансформации видового окна (viewport) max, описанная
здесь.
Тестовая сцена содержит модель шарообразного объекта с небольшим количеством полигонов (около 4000), два направленных источника света и камеру. Для каждого теста окно камеры (установка сцены по умолчанию) переключалось в окно перспективного вида. Затем с помощью Connection Editor загружался файл с шейдером, и проводились тестовые измерения. Результат приведен в количестве кадров, обрабатываемых видеокартой в секунду (FPS).
Итак, далее приведены результаты тестов и снимки экранов видового окна (интерактивность в цифрах, так сказать :)).
BumpReflectCg.fx – DX8, assembler, bumpmap, texture: Вторая цифра относится к зумингу видового окна, приведена, поскольку серьезно отличается от скорости остальных трансформаций почти во всех тестах.
BumpReflectCgDX9.fx – DX9, bumpmap, texture: DirectX 9-аналог предыдущего шейдера. Не используется ассемблер, богаче визуальные возможности и настройки и обрабатывается он медленне своего аналога.
goochy.fx – DX8, нефотореалистичный стиль, собственный точечный источник света: goochy_notex_CgDX9.fx: goochy_notex_CgDX9.fx – DX9-аналог предыдущего шейдера, стал медленнее, зато количество регулируемых параметров увеличилось вдвое.
goochy_tex.fx: goochy_tex.fx – тот же DX8-шейдер, но с дополнительной текстурой для diffuse-цвета.
goochy_tex_CgDX9.fx: goochy_tex_CgDX9.fx – DX9-аналог предыдущего шейдера.
metalP.fx – DX8, металлическая поверхность, 1 точечный источник света, затенение – Phong: metalP_notex_CgDX9.fx: metalP_notex_CgDX9.fx – DX9-аналог metalP.fx. Два дополнительных настроечных параметра, иное внешнее представление и медленнее в 5-6 раз.
metalRefl_tex_CgDX9.fx: metalRefl_tex_CgDX9.fx – то же, но с текстурой и отражением.
DiffNoise.fx – DX8, трехмерная текстура шума, 1 источник света: При трансформациях текстура на объекте «шумит», что создает очень необычный эффект.
dispersion.fx – шейдер дисперсии света, DX8, texture, assembler, фиксированные функции: dispersion.fx – шейдер дисперсии света, DX8, texture, assembler, фиксированные функции.
Ghostly2.fx – DX8, прозрачность, texture, assembler: Итак, результаты тестирования показывают, что, в общем случае, DX9-шейдеры оказываются гораздо более «тяжелыми» относительно своих DX8-аналогов – такова плата за большую гибкость настроек, новые возможности и удобство программирования.