Опубликован: 28.04.2009 | Доступ: свободный | Студентов: 1840 / 107 | Оценка: 4.36 / 4.40 | Длительность: 16:40:00
Специальности: Программист
Лекция 5:

Вершинные шейдеры

< Лекция 4 || Лекция 5: 123456789101112

Теперь разверните узел Effects. Если все было выполнено правильно, в узле Effects появится дочерний узел BlackAndWhite, инкапсулирующий эффект Collada, в который вложен собственно файл нашего эффекта BlackAndWhite.fx (рисунок 5.7).

Примечание

Если бы мы при создании эффекта выбрали наряду с .fx еще несколько профилей, то узел эффекта BlackAndWhite содержал бы несколько файлов эффектов с расширениями наподобие .cg или .glsl.

 Узел созданного эффекта на панели Effects

Рис. 5.7. Узел созданного эффекта на панели Effects

Чтобы открыть редактор кода выполните двойной щелчок левой кнопкой мыши на узле файла BlackAndWhite.fx. Замените текст созданного по умолчанию эффекта кодом из листинга 5.110Немного погодя мы оценим, насколько хорошо компилятор HLSL смог выполнить оптимизацию этого некачественного кода . Обратите внимание на подсветку ключевых слов языка HLSL, значительно облегчающую поиск опечаток. По завершению набора кода эффекта выполните его компиляцию посредством сочетания клавиш Ctrl + F7. Если эффект содержит ошибки, то в окне Tasks появится перечень ошибок (рисунок 5.8), а сама строка содержащая ошибку будет подсвечена.

Примечание

Чтобы видеть сообщения о ходе компиляции эффекта, откройте панель Output (рисунок 5.9) посредством команды главного меню View | Output.

 Панель Task с информацией об ошибках в эффекте

Рис. 5.8. Панель Task с информацией об ошибках в эффекте
 Панель Output с информацией о процессе компиляции

Рис. 5.9. Панель Output с информацией о процессе компиляции

В заключении не забудьте сохранить проект эффекта командой File | Save All.

Структура проекта

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

  • Project.fxcproj - файл проекта FX Composer с информацией о настройках IDE и файлах входящих в проект. Имеет формат XML.
  • Document1.dae - файл формата COLLADA с информацией о контенте.
  • BlackAndWhite.fx - собственно файл эффекта.

Текст файла Document1.dae, сгенерированный FX Composer 2.0 на моем компьютере, приведен ниже:

<?xml version="1.0"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" 
version="1.4.1">
 <asset>
<contributor>
<author>Sergei Gaidukov</author>
<authoringtool>NVIDIA FX Composer 2.0</authoringtool>
 <comments/> <copyright/> </contributor>
<created>2007-06-04T16:39:20</created> 
<keywords>FXComposer, NVIDIA</keywords>
 <modified>2007-06-04T16:39:21</modified>
 <subject/> <title/> </asset> 
<libraryeffects>
<effect id="Effect" name="BlackAndWhite">
<profile_COMMON>
<technique sid="__fxc2_default">
<constant/> 
</technique> 
</profile_COMMON> <extra 
type="import">
<technique profile="NV_import">
<import url="BlackAndWhite.fx" compiler_options=""
 profile="fx"/> </technique> </extra> 
</effect> </library_effects> </COLLADA>

Как видно, в элемент <COLLADA> вложены два элемента: <asset> с информацией об авторе файла, времени его создания и приложении, в котором он был создан; и уже знакомый нам элемент <library_effects>. Последний содержит эффект с идентификатором Effect и именем BlackAndWhite, в котором определено два профиля: HLSL и COMMON.

Примечание

Чтобы файл формата COLLADA мог корректно обрабатываться любым приложением, он должен содержать профиль COMMON.

Редактирование существующего .fx-файла

Если эффект изначально разрабатывался в FX Composer 2.0, то с его редактированием не возникнет проблем – достаточно просто открыть проект командой File | Open | Open Project... и продолжить работу. Но что делать, если необходимо подправить существующий .fx -файл? Так как организация проектов FX Composer 2.0 насквозь пронизана идеологией COLLADA, вы не можете просто так открыть существующий .fx-файл командой File | Open | Open File... – в этом случае вы потеряете возможность выполнять пробную компиляцию .fx -файла и, соответственно, не сможете обнаруживать синтаксические ошибки.

К счастью, эта особенность легко обходится: вы должны просто создать новый эффект на основе вашего .fx -файла. Для этого откройте вкладку Assets, щелкните правой мыши на узле Effects, выполните команду контекстного меню Add Effect From File... и укажите файл, который необходимо открыть. В результате в проект будет добавлен новый эффект, содержащий указанный файл, который теперь можно легко отредактировать и откомпилировать.

5.2.4. Анализ производительности эффекта

При разработке шейдеров начинающие разработчики часто оказываются в положении буриданова осла, когда одну и ту же функциональность можно реализовать различными способами и при этом не совсем ясно, какой из них будет иметь большую производительность. В подобных ситуациях трудно переоценить полезность панели Shader Perfomance, позволяющей быстро прикинуть быстродействие эффекта на различных видеокартах NVIDIA с учетом многочисленных версий драйверов.

Чтобы получить представление о возможностях данной панели мы проанализируем производительность эффекта BlackAndWhite, созданного в разделе 5.2.3. Для начала в панели Assets щелкните правой кнопкой мыши на узле эффекта, который вы собираетесь проанализировать, и выберите команду контекстного меню Analyze Performance, после чего в нижней части окна появится панель Shader Performance (рисунок 5.10), содержащая две вкладки: Startup Form и BlackAndWihite.fx. Вторая вкладка, как нетрудно догадаться, предназначена для анализа нашего эффекта, а первая используется преимущественно для загрузки новых эффектов в панель Analyze Performance.

 Панель Shader Performance

увеличить изображение
Рис. 5.10. Панель Shader Performance

В левом верхнем углу вкладки BlackAndWhite.fx расположен переключатель между режимом анализа производительности единственного выбранного прохода эффекта ( Analyze a Pass ) и режимом сравнения производительности всех проходов эффекта ( Compare Passes ). Так как наш эффект содержит единственный проход, оба варианта будут практически эквивалентны.

Ниже расположены флажки списка техник эффекта11В режиме Analyze a Pass можно выбрать только одну технику, а в режиме Compare Passes – соответственно несколько.. Мы естественно выберем для анализа единственную технику нашего эффект p0. Еще ниже имеется выпадающий список для выбора анализируемого типа шейдера: вершинного или пиксельного. Пиксельный шейдер эффекта BlackAndWhite.fx, содержащий единственный оператор return, вряд ли нуждается в какой-либо оптимизации, поэтому мы будем анализировать вершинный шейдер. Наконец, в самом низу вкладки BlackAndWhite.fx находятся списки флажков Drivers и GPU, позволяющие выбрать версии драйверов ForceWare и графические процессоры, на которых будет эмулироваться выполнение эффекта.

Указав всю требуемую информацию можно приступать к собственно исследованию производительности вершинного шейдера. Для анализа эффекта с учетом выбранных параметров необходимо нажать кнопку Run на панели в верхней части окна. Для просмотра результатов анализа в виде таблицы нажмите кнопку Table, после чего вы увидите информацию аналогичную рисунку 5.10. Как видно, при использовании видеокарты NVIDIA GeForce 7800 GTX с драйверами ForceWare 162.03 выполнение вершинного шейдера будет длиться 7 тактов, а всего за одну секунду всеми вершинными процессорами этой видеокарты будет обработано 491.000.000 вершин. Но следует учитывать, что эта астрономическое число отражает пиковую производительность без учета быстродействия остальных компонентов видеокарты, так что реальная производительность наверняка окажется ощутимо скромнее. Например, видеокарта может оказаться просто не в состоянии закрасить треугольники, содержащие вершины.

Примечание

Кнопки Precision и Branches позволяют просмотреть более подробный отчет с учетом различной точности вычислений и сценариев выполнения условных переходов. Но в настоящее время эти возможности являются для нас избыточными: эффект BlackAndWhite.fx не содержит условных переходов, а точность вычислений вершинных шейдеров всегда равна 32-бита.

Кнопка Graph позволяет в наглядной форме сравнить производительность шейдера на разных видеокартах. Перед выполнением сравнения необходимо составить перечень интересующих вас видеокарт и драйверов. Для этого откройте командой главного меню Tools | Settings... диалоговое окно Settings с настройками FX Composer и в древовидном списке в левой части окна выделите узел Enviroment | ShaderPerf. Затем в левой части окна щелкните на кнопке "... " напротив опции DefaultSelectedGPUs и в появившемся диалогов окне Selected Default GPUs установите флажки напротив интересующих вас графических процессоров (рисунок 5.11). Например, если вы разрабатываете приложение для видеокарт семейства GeForce 6 и выше, вам следует пометить все GPU семейств NV4x и G7x. Далее аналогичным образом укажите интересующие вас версии драйверов.

 Диалоговое окно Setting и Select Default GPUs

увеличить изображение
Рис. 5.11. Диалоговое окно Setting и Select Default GPUs

После нажатия OK в во вкладке BlackAndWhite.fx панели Shader Perfomance появятся флажки, соответствующие указанным графическим процессорам. Выделите флажки GPU и драйверов, интересующие вас в данный момент, и нажмите кнопку Graph в верхней части окна. На экране появится диаграмма производительности вершинного шейдера на выбранных графических процессорах (рисунок 5.12).

 Производительность шейдера на различных графических процессорах

увеличить изображение
Рис. 5.12. Производительность шейдера на различных графических процессорах

По диаграмме легко можно оценить, будет ли являться производительность вершинного шейдера ограничивающим фактором. Допустим, наша сцена содержит 100.000 треугольников. Значит, пренебрегая прочими факторами можно предположить, что визуализация данного сцены на самой медленной видеокарте семейства GeForce6 (GeForce 6200) будет выполняться с частотой 150.000.000 / 100.000 = 1.500 кадров секунду. Таким образов в данном конкретном случае вершинный шейдер не станет узким местом даже на самых дешевых видеокартах семейства GeForce6.

Просмотр ассемблерного кода шейдера

Еще одной интересной возможностью панели Shader Performance является просмотр скомпилированного промежуточного кода шейдера. Это очень мощная функциональность, позволяющая оценить качество сгенерированного ассемблерного кода и увидеть ошибки, допущенные компилятором. Возможно, последнее утверждение покажется вам несколько надуманным, но это действительно так. Компилятор HLSL в настоящее время значительно менее отлажен по сравнению с теми же компиляторами C++, а сами графические процессоры содержат множество ограничений. Например, компилятор может сгенерировать несколько отличный код от ожидаемого вами, в результате чего выполнение эффекта будет сопровождаться нежелательными эксцессами наподобие переполнения разрядной сетки в ходе промежуточных расчетов. В будущем вы практически гарантированно столкнетесь с подобными аномалиями, причем, чем меньшими возможностями обладает используемая видеокарта, тем более вероятно возникновение проблем.

Примечание

Это особенно актуально при написании пиксельных шейдеров для GeForce3 и GeForce4, регистры которых имеют ограниченную разрядность и рассчитаны на работу с числами в диапазоне от -1 до +1.

Чтобы увидеть ассемблерный код шейдера, сгенерированный компилятором HLSL, достаточно нажать кнопку ASM после чего во вкладке Editor появится вкладка BlackAndWhite_Asm.txt со следующим текстом:

################################################################
# Technique: BlackAndWhiteFill
#  Pass: p0
################################################################ //
// Generated by Microsoft (R) D3DX9 Shader Compiler 9.12.589.0000 vs_1_1
def c0, 0.333333343, 1, 0, 0 
dcl_position v0 dcl_color v1 add r0.w,
v1.y, v1.x add r0.w, r0.w, v1.z mul 
oD0.xyz, r0.w, c0.x
mad oPos, v0.xyzx, c0.yyyz, c0.zzzy mov
 oD0.w, v1.w
// approximately 5 instruction slots used

Но сейчас мы можем почерпнуть из этого отчета разве то, что он был создан компилятором Microsoft (R) D3DX9 Shader Compiler версии 9.12.589.0000, причем в качестве промежуточного языка был использован Vertex Shader 1.1. Все остальное для нас не более чем китайская грамота, так что для оценки качества сгенерированного кода нам потребуется ознакомиться с азами языков Vertex Shader.

На этом первое знакомство с NVIDIA FX Composer 2. 0 можно считать оконченным.

< Лекция 4 || Лекция 5: 123456789101112
Андрей Леонов
Андрей Леонов

Reference = add reference, в висуал студия 2010 не могу найти в вкладке Solution Explorer, Microsoft.Xna.Framework. Его нету.