ディフュージョンフィルタを作る(1)
「AnswerHubでディフュージョンフィルタを作る方法はないか? という質問を見かけたんだけど、ディフュージョンフィルタが何かわからなくて調べていた」
妹「なんだったの?」
「それがよくわからないというか、細かい実装方法自体がバラバラで。基本的には明るい部分の色だけが周囲に広がるぼかしフィルタのようなものかな、と思ってるんだけど。でもグローみたいに輝かせるというものでもないらしい」
妹「それをやるとどうなるの?」
「明暗の差がなくなって、全体的に明るめに、でも色が白くなったりはせず、ふわっとした感じに仕上がるらしい」
妹「洗濯物かな……これが昨日言ってた、今作ろうとしてるやつ?」
「そうそう。とりあえず原理的には前に作ったぼかしフィルタと同じで、明るい部分だけそれをやれば作れるんじゃないかなあと思って、ちょっとやってみた」
float4 total = SceneTextureLookup(uv, 14, true);
float total_alpha = 1.0;for(int y_loop = -4; y_loop <= 4; y_loop++){
for(int x_loop = -4; x_loop <= 4; x_loop++){
float4 col = SceneTextureLookup(uv + float2(x_loop, y_loop)*invSize, 14, true);
float light = col.x * 0.3 + col.y * 0.6 + col.z * 0.1;
if (light > 0.7){
total += col * light;
total_alpha += light;
}
}
}
return total / total_alpha;
「マテリアルの仕組みは、ぼかしの時と全く同じ。ただカスタムノードの中身を少し変えた」
妹「カスタムノード全然わかんないんだよね……」
「マテリアルにループさえあれば、マテリアルブループリントで書いてもいいんだけど。とりあえず理屈としては」
(1)・周囲のピクセルの色を調べる
(2)・(1)の色が明るかった時はその色のRGBを足す
(3)・(2)を周囲81ピクセルに対してやる
(4)・最後に足しまくったRGBを割って、このピクセルの色とする
「ぼかしと違うのは2の部分。RGBから明るさを計算して、あと明るいほど多めに足すとかもあるけど」
妹「それでこれはディフュージョンとかいうやつになったの?」
「なってない気がするなあ……なってるんだけど、四角になっちゃうというか。これはぼかしフィルタの時点で適当に作ってたせいなんだけど、近くのピクセルほど多く色を足す、つまり影響力を強くする必要があるんだけど、それをやってないから、明るいとこの周囲が均等に明るくなってしまった」
妹「ぜんぜんふわっとしてない」
「だいたいの原理としてはいけそうだから、ぼかしの部分をもっと丁寧にぼかすようにすれば大丈夫なはず」