ピクセル シェーダー①

WPF・Silverlightでもピクセルシェーダーが使えます。Direct3DではピクセルシェーダーはGPU上で動作し、頂点シェーダーと組み合わせて頂点からラスタ化されたピクセル(サブピクセル)とテクスチャなどを処理しますが、WPF・Silverlightで使われるピクセルシェーダーはUIElementに適用する画像処理です。WPFのピクセルシェーダーはGPUで、SilverlightのピクセルシェーダーはCPUで動作します。

ピクセルシェーダーとは単純に言うと各ピクセルの色を出力するプログラムです。次のピクセルシェーダーでは全てのピクセルに赤を出力します(returnで返します)。

image

ピクセルシェーダーはピクセル単位で全ピクセルを処理するので、条件分岐すれば出力色を変えることができます。次の例では、元のUIElementの範囲(中央より上下左右)によって出力する色を変えています。uvは現在処理しているピクセルの相対座標を示す変数で、tex2DはUIElement(レジスタS0に割り当てられている)の色を取得するメソッドです。

image

ピクセルシェーダーを記述する言語はMicrosoft HLSL(High Level Shader Language)で、C言語と似ていますがポインターはなく、行列やベクトル用の型を持っています。なぜHigh Level Language(高級言語)と言うかというと、Direct3D 8のころ(シェーダーモデル1.*)にはアセンブラでしかシェーダーが書けなかったからです。HLSLはDirect3D 9で導入されました(シェーダーモデル 2.0, 3.0)。Direct3D 10以後(シェーダーモデル4.0以後)はアセンブラでは書けなくなりました(サポートされなくなったこともありますが、複雑すぎて実質的に書くのは難しくなりました)。WPF 4ではシェーダーモデル 3.0を、それ以前のWPFとSilverlgihtではシェーダーモデル 2.0をサポートします。2.0と3.0でピクセルシェーダーとして最も重要なことは(コンパイル後の)最大算術命令数が64から最低512になったことで、より複雑な処理をコーディングできます。

WPF・Silverlightでピクセルシェーダーを使うにはシェーダーソースを書いて、そのシェーダーソースをfxcコンパイラーでコンパイルして、生成したバイトコードをプロジェクトに追加して、ShaderEffectクラスを継承した独自のEffectクラスを作成する必要があります。少し面倒なので、何回かに分けてピクセルシェーダーの書き方と使い方を解説していきます。