Ambient Occlusion

最終更新日24 Apr 2017 02:21

環境光がどのぐらい物体の表面に来るのかを示したもの。
レイトレーシングの計算で、柔らかな大域光の影を表現したもの。
メッシュが交差したところや、溝などが暗くなるようになっていて、
光源の設定はいっさい関係なく計算する。
見た目をリアルっぽく見せるためのトリックなのである。

実装の仕方

フラグメントシェーダで、視点からのレイを各ピクセルに飛ばし、
何かに衝突せずに空まで突き抜けるかどうかを調べる。

float ao(in vec3 rp, in vec3 g)
{
    float d = 0.4;
    float occ = 1.0;
 
    for (int i = 0; i < 3; ++i)
    {
        float fi = float(i * 2 + 1);
        d = d * fi;
        occ -= (1.0 - (map(rp + g * d) / d)) * (1.0 / fi);
    }
    occ = clamp(occ, 0.0, 1.0);
    return occ;
}


files

サポートサイト Wikidot.com