ぼけ輪郭


~ Unsharp Masking ~






■はじめに

SIGGRAPH 2006 のコンスタンツ大の Thomas Luft、Carsten Colditz と Oliver Deussen による Image Enhancement by Unsharp Masking the Depth Bufferが楽そうだったので実装してみました。

ダリ、ピカソ、スーラ 、マティスとか一流の人の絵を見ると、人物の後ろのふちの部分は暗く描くのが多いそうで、それをパクってリスペクトしてみたようです。

今回のプログラムは、次のものです。

まぁ、いつものように適当にファイルが入っています。 大事な部分だけを抜粋すると、次のファイルだけに注目すればいいことになります。

main.cppメイン関数
main.fxシェーダプログラム

他にも、実行ファイル、リソースファイル、プロジェクトファイルが入っています。

■何やってるの?

まず、普通に描画して、あと、深度も保存します。

深度

次に深度をぼかします。今回は、2パスのガウスぼかしを使いました。

オリジナルZ よこぼかし たてぼかし

ここで、「元の深度-ぼかした深度」を見ると次のようになります(赤は負)。

元の深度-ぼかした深度

白い部分は奥まったとこだから、暗くするといい感じに見やすくなるんじゃない?と、いうのが元の考え方です。

今回のプログラムでは、具体的には次のように組んでいます。

main.fx
0227: float4 FinalPS( in float2 OriginalUV : TEXCOORD0 ) : COLOR 
0228: {
0229:     float4 color = tex2D(RenderTargetSampler, OriginalUV);// 元画像
0230:     float  depth      = tex2D(DepthSampler, OriginalUV).r;// オリジナルの深度
0231:     float  depth_blur = tex2D(MeshTextureSampler, OriginalUV).r; // ぼかした深度
0232: 
0233:     float diff = depth - depth_blur;
0234:     diff = max(0, diff);
0235: 
0236:     return color * (1 - fIntensity * diff);
0237: }

アルファブレンディングの方が高速かもね。

■最後に

擬似アンビエントオクルージョンに使えるらしいですが、どうもそう見えません。
パラメータが悪い???





もどる

imagire@gmail.com