Создание и использование шейдеров в WPF/Silverlight

Часть 1. Введение. Шейдеры, HLSL и XAML

Последнее обновление: 29.05.2012

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

Первоначально обращение к графическому процесору происходило с помощью кода на ассемблере. Однако аппаратные средства развивались, предоставляя программистам все больше возможностей, в то же время необходим был более высокоуровневый язык. Это стало причиной создания совместного проекта компаний Microsoft и NVIDIA. Однако затем совместный проект распался. NVIDIA стала создавать свой язык (называемый C для графики или Cg). А Microsoft стал работать над HLSL (High Level Shader Language - Высокоуровневый язык шейдеров).

Хотя оба языка похожи по синтаксису - оба они используют синтаксис языка си, в то же время они отличаются по широте использования. Так с помощью обоих языков можно создавать шейдеры для DirectX. Но с помощью Cg можно также создавать шейдеры и для OpenGl, а HLSL этого не позволяет. На этом перечень существующих шейдерных языков, конечно. не ограничивается. Например, распространен еще язык GLSL, который используется в OpenGl.

Как работают шейдеры HLSL?

При работе с шейдерами графический конвейер в DirectX проходит ряд этапов. На входе в шейдеры мы передаем некоторую информацию о модели. Модель в данном случае является математическим представлением трехмерного объекта. Модель состоит из массива вершин, каждая из которых обладает некоторыми свойствами, как координаты x, y, z, а также характеристиками цвета, освещения, текстуры. Именно массив вершин и передается на вход в графический конвейер.

Сначала этот массив вершин передается в вершинный шейдер (Vertex Shader). Вершинный шейдер проводит над вершиными некоторые математические преобразования, например, изменяет их позицию в пространстве, накладывает на них координаты текстур, изменяет значения цвета и т.п.

Затем в действие вступает растеризатор (Rasterizer). Растеризатор преобразует вершины в двухмерные координаты для вывода модели на экран.

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

Использование шейдеров в графическом конвейере DirectX

Как это все происходит в WPF и Silverlight?

WPF и Silverlight накладывают имеют определенные особенности и ограничения в использовании шейдеров. Надо сказать, что использовать шейдеры в XAML стало возможно совсем недавно - с выхожом версии .NET 4.0. То есть если вы создаете приложение под .NET 3.5, то о шейдерах можно забыть.

Второе ограничение выглядит еще более сурово - доступны только пиксельные шейдеры, а вершинные шейдеры отсутствуют. В то же время пиксельные шейдеры тоже являются довольно мощной технологией, которую можно использовать и без вершинных шейдеров. Однако хотя Silverlight не поддерживает напрямую вершинные шейдеры, в версии Silverlight 5 можно применять функционал платформы XNA и тем самым использовать вершинные шейдеры.

Третье ограничение касается особенностей выполнения шейдеров. Если в WPF пиксельные щейдеры и растеризация выполняются на графическом процессоре GPU, то в Silverlight шейдеры выполняются на центральном процессоре (CPU), что, очевидно, снижает скорость выполнения программы, по сравнению с подобной программой на WPF.

Использование шейдеров в WPF и Silverlight

Что надо для использования шейдеров?

Чтобы использовать шейдеры, нам, естественно, потребуется Visual Studio 2010 и установленные средства разработки для Silverlight 5. Их можно найти на оффициальном сайте на странице http://www.silverlight.net/downloads

Также необходимо установить DirectX SDK (его можно найти на оффициальном сайте Этот SDK сожержит такую очень важную вещь, как компилятор fxc.exe, с помощью которого мы и будем компилировать шейдеры.

Компилятор fxc.exe

Итак, теперь мы можем перейти к написанию первого шейдера.


Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850