SIGGRAPH 2006 のコンスタンツ大の Thomas Luft、Carsten Colditz と Oliver Deussen による Image Enhancement by Unsharp Masking the Depth Bufferが楽そうだったので実装してみました。
ダリ、ピカソ、スーラ 、マティスとか一流の人の絵を見ると、人物の後ろのふちの部分は暗く描くのが多いそうで、それをパクってリスペクトしてみたようです。
今回のプログラムは、次のものです。
まぁ、いつものように適当にファイルが入っています。 大事な部分だけを抜粋すると、次のファイルだけに注目すればいいことになります。
main.cpp | メイン関数 |
main.fx | シェーダプログラム |
他にも、実行ファイル、リソースファイル、プロジェクトファイルが入っています。
まず、普通に描画して、あと、深度も保存します。
次に深度をぼかします。今回は、2パスのガウスぼかしを使いました。
ここで、「元の深度-ぼかした深度」を見ると次のようになります(赤は負)。
白い部分は奥まったとこだから、暗くするといい感じに見やすくなるんじゃない?と、いうのが元の考え方です。
今回のプログラムでは、具体的には次のように組んでいます。
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: }
アルファブレンディングの方が高速かもね。
擬似アンビエントオクルージョンに使えるらしいですが、どうもそう見えません。
パラメータが悪い???