続・トゥーンシェーダ

前回上手くいかなかった輪郭線の抽出をフィルタを使ってやってみた。
t-potさんの本を参考にフィルタを作成。
一度レンダリングした画像の深度バッファからテクセルの差分をとって輪郭線を書く。
という方法で実装した。

元がアセンブラのコードだったので、HLSLで書いてみた。

fxファイルより一部抜粋

float du = 1.0f / 640.0f / 2; // テクセル幅 / 2
float dv = 1.0f / 480.0f / 2;

sampler Samp0 : register(s0);

// エッジを抽出する
float4 EdgePS(float2 Tex : TEXCOORD0) : COLOR
{
    float4 Out = (float4)0;

    float2 Tex1 = Tex; // 隣のテクセル
    Tex1.x -= du;
    Tex1.y -= dv;
    float2 Tex2 = Tex;
    Tex2.x -= du;
    Tex2.y += dv;
    float2 Tex3 = Tex;
    Tex3.x += du;
    Tex3.y += dv;
    float2 Tex4 = Tex;
    Tex4.x += du;
    Tex4.y -= dv;
    float4 Sub1 = tex2D(Samp0, Tex1) - tex2D(Samp0, Tex3);
    float4 Sub2 = tex2D(Samp0, Tex2) - tex2D(Samp0, Tex4);
	
    Out.rgba = 1.0f - 128*(Sub1.a*Sub1.a + Sub2.a*Sub2.a);

    return Out;
}

もっとスマートな書き方がありそうだが、動いているので気にしない方向で。