С развитием аппаратных возможностей все большую роль играют программы, использующие по максимуму эти возможности. Использование в программах таких инструментов, как DirectX, мы можем задействовать графический процессор GPU. Использование графического процессора для применения отрисовки или вычислений позволяет ускорить выполнение программного кода.
Первоначально обращение к графическому процесору происходило с помощью кода на ассемблере. Однако аппаратные средства развивались, предоставляя программистам все больше возможностей, в то же время необходим был более высокоуровневый язык. Это стало причиной создания совместного проекта компаний Microsoft и NVIDIA. Однако затем совместный проект распался. NVIDIA стала создавать свой язык (называемый C для графики или Cg). А Microsoft стал работать над HLSL (High Level Shader Language - Высокоуровневый язык шейдеров).
Хотя оба языка похожи по синтаксису - оба они используют синтаксис языка си, в то же время они отличаются по широте использования. Так с помощью обоих языков можно создавать шейдеры для DirectX. Но с помощью Cg можно также создавать шейдеры и для OpenGl, а HLSL этого не позволяет. На этом перечень существующих шейдерных языков, конечно. не ограничивается. Например, распространен еще язык GLSL, который используется в OpenGl.
При работе с шейдерами графический конвейер в DirectX проходит ряд этапов. На входе в шейдеры мы передаем некоторую информацию о модели. Модель в данном случае является математическим представлением трехмерного объекта. Модель состоит из массива вершин, каждая из которых обладает некоторыми свойствами, как координаты x, y, z, а также характеристиками цвета, освещения, текстуры. Именно массив вершин и передается на вход в графический конвейер.
Сначала этот массив вершин передается в вершинный шейдер (Vertex Shader). Вершинный шейдер проводит над вершиными некоторые математические преобразования, например, изменяет их позицию в пространстве, накладывает на них координаты текстур, изменяет значения цвета и т.п.
Затем в действие вступает растеризатор (Rasterizer). Растеризатор преобразует вершины в двухмерные координаты для вывода модели на экран.
И перед самим отображением вершины передаются в пиксельный шейдер, где устанавливается итоговое значение цвета для каждой вершины.
WPF и Silverlight накладывают имеют определенные особенности и ограничения в использовании шейдеров. Надо сказать, что использовать шейдеры в XAML стало возможно совсем недавно - с выхожом версии .NET 4.0. То есть если вы создаете приложение под .NET 3.5, то о шейдерах можно забыть.
Второе ограничение выглядит еще более сурово - доступны только пиксельные шейдеры, а вершинные шейдеры отсутствуют. В то же время пиксельные шейдеры тоже являются довольно мощной технологией, которую можно использовать и без вершинных шейдеров. Однако хотя Silverlight не поддерживает напрямую вершинные шейдеры, в версии Silverlight 5 можно применять функционал платформы XNA и тем самым использовать вершинные шейдеры.
Третье ограничение касается особенностей выполнения шейдеров. Если в WPF пиксельные щейдеры и растеризация выполняются на графическом процессоре GPU, то в Silverlight шейдеры выполняются на центральном процессоре (CPU), что, очевидно, снижает скорость выполнения программы, по сравнению с подобной программой на WPF.
Чтобы использовать шейдеры, нам, естественно, потребуется Visual Studio 2010 и установленные средства разработки для Silverlight 5. Их можно найти на оффициальном сайте на странице http://www.silverlight.net/downloads
Также необходимо установить DirectX SDK (его можно найти на оффициальном сайте Этот SDK сожержит такую очень важную вещь, как компилятор fxc.exe, с помощью которого мы и будем компилировать шейдеры.
Итак, теперь мы можем перейти к написанию первого шейдера.