レンズフレア

理論メモ

ゴーストの配置情報

  • 画面中心と光源を結ぶ直線状に並ぶ
  • 画面中心から光源に向かうベクトルを定数倍した位置
  • 乱数配置でOK

絞り形状の距離場生成

ある角度の距離場を求める

ある角度の長さ1のベクトルは(cosΘ, sinΘ)。 そのベクトルに射影した長さが距離場になる。

内積a・bは「ベクトルaの長さ」と「ベクトルbをaに射影した長さ」の積なので、 ベクトル(x,y)をベクトル(cosΘ,sinΘ)に射影した長さは内積a・bをベクトルaで割ったものになるので

b = (cosΘ,sinΘ)・(x,y) / 1 = (cosΘ,sinΘ)・(x,y)

角度ごとに分ける

1
2
3
4
5
6
7
float PI =  3.14159265359;
    float fTheta2 =  (PI / 4.0);

    vec2 ziku = vec2(cos(fTheta2), sin(fTheta2));
    vec2 uv = vUv;

    float a = 1.0 - dot(k2, uv);

内接円の半径

実装

スプライトを配置するコードを書く。