妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

ディフュージョンフィルタを作る(2) 輪郭が丸くなるように調整

「昨日作ってたポストプロセスマテリアルの……というか、ポストプロセスマテリアルで作ってるって書いてなかった気がしてきたけど、とにかくそれを改良した」


f:id:una_unagi:20171107234914p:plain
100%

f:id:una_unagi:20171107234936p:plain
50%

f:id:una_unagi:20171107234956p:plain
元の状態

カスタムノードの中身


/* 初期値。ループの中で増やしていく */
float4 total = SceneTextureLookup(uv, 14, true);
float total_alpha = 1;

/* ループ開始。表示中のピクセルから縦横に調べる */
for(int y_loop = -6; y_loop <= 6; y_loop++){
for(int x_loop = -6; x_loop <= 6; x_loop++){

/* ピクセルの色を取得 */
float4 col = SceneTextureLookup(uv + float2(x_loop, y_loop)*invSize*2, 14, true);

/* RGBの数字を元に明るさを算出 */
float light = col.x * 0.3 + col.y * 0.6 + col.z * 0.1;

/* 距離を調べる(ここはもっと高速化できそう) */
float d = distance(float2(0,0),float2(x_loop, y_loop));

/* 距離が遠くなるほど影響力を弱くする */
float alpha = light / 7 * (7 - d);

if ((light > 0.7)&&(d <= 6)){
total += col * alpha;
total_alpha += alpha;
}
}
}

/* 足しに足したRGBを最後に割って、色を混ぜ合わせた状態にしたものを返り値にする */
return total / total_alpha;

「修正して、一応それらしい感じになってきた気がする。コメントを入れてもカスタムノードは動くみたいなので、少し説明を入れて」

妹「意味はよくわからないけど、四角ではなくなったみたい」

「周囲ピクセルを縦横のループで調べるから、その範囲は四角になるんだけど、調査中のピクセルとの距離を計って、一定の距離より遠いとスキップするようにして、丸くなるようにしてる」

妹「これで完成?」

「ちょっと強すぎる気がする。影響度が中心からの距離に比例してるから、あんまりふわっとしてない気がする。まだ調整が必要」