WebGL: 物理ベースレンダリング


~ WebGL: Physically Based Rendering ~






■はじめに

3Dのゲームの開発は、今ではほとんどが物理ベースレンダリングに移っているかと思います。
Unreal Engine を使っている人や、Unity5を使っている人はもちろんのこと、自分でエンジンを作っている人たちも物理ベースレンダリングに移っている事でしょう。
ここでは、軽いおさらいとして、WebGLで物理ベースレンダリング(主に物理ベースのシェーディング)をしてみました。

プログラムは下記のホスティングされた先から実行してください。

Metallic, rouphness, fresnelのパラメータを変えると、金属具合、表面の粗さ、正面から見た時のフレネル反射率の値が変わります。

ソースコードは、GitHubに上げています(式は、一部、下記の説明と違っています)。


■PBR

物理ベースレンダリングを何を持って物理ベースかという事は人によって範囲が変わってきたりするので、厳密に定義することはできないのですが、おおよそ

リニアスペースでのライティングをすることに付随して、次の点を考慮にいれたレンダリングが行われます。

こちらは、前回行ったように非常に大きな値を扱うリニアスペースの計算を画面に適切に出るように変換する処理となります。


■マイクロファセットシェーディングモデル

BRDFについてですが、エネルギー保存が考慮されたBRDFは多いですが、現在主に使われるものは、マイクロファセットベースのBRDFになります。
これは、特に鏡面反射について、ざらついて見える面でも詳細に見ると微小な鏡面の集まりとみなして反射計算を行うことです。
このモデルでは、鏡面反射は、フレネル項F、法線分布関数(Normal Distribution Function)D、幾何減衰項Gに影響を受けます。


これら、F,D,Gは、いくつかの候補があるのですが、下記の式をよく目にします。

Schlickのフレネル項

GGXのNDF

SmithによるG(GGX)


ここで、α及びk表面の粗さのパラメータと結びつきます(結び付け方はレンダラによって異なったりします)。
なお、l, v, n, hは、光源方向、視点方向、面の法線、視点方向と光源方向のハーフベクトルです。

以上を拡散反射のBRDFがトータルで光を増やさないようにすると、エネルギー保存則を満たすBRDFの完成です。


この式では、拡散反射に一番簡単なランバート反射を書きましたが、ここでもオーレンネイヤーなどのマイクロファセットモデルも使われます。


■さいごに

ざっくりですが、今時のゲームエンジンで使われているようなPBRについてまとめてみました。





もどる

imagire@gmail.com