ShaderEffect

94

Класс ShaderEffeсt не представляет готового к использованию эффекта. Это — абстрактный класс, от которого наследуются специальные построители текстур. С помощью ShaderEffect (или специального эффекта, унаследованного от него) появляется возможность пойти дальше простого размытия и отбрасывания теней.

В противоположность ожиданиям, логика, реализующая построитель текстуры, не написана на C# непосредственно в классе эффекта. Построители текстур написаны на языке HLSL (High Level Shader Language — высокоуровневый язык текстурирования), который является частью DirectX. (Преимущества очевидны — поскольку DirectX и HLSL существуют уже много лет, за это время разработчики графики уже создали массу процедур для построителей текстур, которые можно использовать в собственном коде.)

Для создания построителя текстуры понадобится писать код HLSL. Первый шаг состоит в установке комплекта для разработчика DirectX SDK. Это предоставит все необходимое для создания и компиляции кода HLSL в файлы .ps (с помощью инструмента командной строки fxc.exe), которые нужны для использования специального класса ShaderEffect. Но более удобным выбором является инструмент Shazzam — редактор файлов HLSL, включающий возможность их опробования на примерах изображений. Он также содержит несколько примеров построителей текстур, которые можно применять в качестве основы для создания собственных. Более опытные пользователи могут также попробовать средство FX Composer от NVidia — инструмент создания теней, предназначенный для разработчиков современных игр и прочих экспертов в области графики.

После компиляции файла HLSL в файл .ps его можно использовать в проекте. Просто добавьте файл в существующий проект WPF, выберите его в окне Solution Explorer и установите для него Build Action (Действие сборки) в Resource (ресурс). Останется еще создать специальный класс-наследник ShadowEffect, использующий этот ресурс.

Например, ниже показан код для применения специального построителя текстуры, который скомпилирован в файл по имени Effect.ps:

public class GrayscaleEffect : ShaderEffect
    {

        public GrayscaleEffect()
        {
            Uri pixelShaderUri = new Uri("Grayscale_Compiled.ps",
              UriKind.Relative);

            // Загрузить информацию из .ps файла
            PixelShader = new PixelShader();
            PixelShader.UriSource = pixelShaderUri;

            UpdateShaderValue(InputProperty);
        }

        public static readonly DependencyProperty InputProperty =
            ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(GrayscaleEffect), 0 /* assigned to sampler register S0 */);

        public Brush Input
        {
            get { return (Brush)GetValue(InputProperty); }
            set { SetValue(InputProperty, value); }
        }
    }

После этого можно использовать специальный построитель текстуры в любом окне. Сначала сделайте пространство имен доступным, добавив следующее отображение:

<Window xmlns:local="clr-namespace:CustomEffectTest" ...>

Пример можно несколько усложнить за счет использования построителя текстуры, принимающего некоторые входные аргументы. В этом случае понадобится создать соответствующие свойства зависимости, вызвав статический метод RegisterPixelShaderSamplerProperty().

Сложный построитель текстуры может быть настолько же мощным, как подключаемые модули, применяемые в программном обеспечении обработки графики вроде Adobe Photoshop. Он может делать все, что угодно: от добавления базовой отбрасываемой тени до импорта более сложных эффектов — вроде размывания, блеска, водяной ряби, тиснения, повышенной резкости и т.п. Построители текстур могут также создавать бросающиеся в глаза эффекты, когда они комбинируются с анимацией, изменяющей параметры во времени.

Собственноручное написание кода HLSL является наилучшим способом получения наиболее развитых построителей текстур только для асов в программировании графики. Другим же следует обратить внимание на примеры HLSL или компоненты WPF от независимых поставщиков, которые предлагают специальные классы эффектов. Хорошим стандартом является свободно распространяемая библиотека Windows Prsentation Foundation Pixel Shader Effects Library. Она включает длинный список изощренных эффектов, таких как водовороты, инверсия цветов и операции с пикселями.

Вдобавок она содержит транзитивные эффекты, которые комбинируют построители текстур с возможностями анимации.

Пройди тесты
Лучший чат для C# программистов