smallptにイメージベースドライティング(Image Based Lighting)を組み込んでみる。
データはLight Probe Image Galleryの.hdr。
これはRGBEフォーマットらしい。読み込みはにソースがある。
しかし一部おかしなところがあって、ヘッダの読み込みRGBE_ReadHeader()
でフォーマットの指定子ががきたらループを抜けるようになってるけど、データはその後にEXPOSUREがきたりしていて読み込みに失敗するのでちょっと変更:
int RGBE_ReadHeader(FILE *fp, int *width, int *height, rgbe_header_info *info) |
これを使って、環境マップの読み込み:
float* envmap; |
あとはパストレーシングで、レイの交差判定でなにとも当たらなかったらレイの方向で環境マップからひっぱってくるようにする。球マップのほうはベクトルからuvの求め方がわからなかったので(「(Dxr,Dyr) where r=(1/pi)*acos(Dz)/sqrt(Dx^2 + Dy^2)」と書いてあったけどなぜかうまくいかなかった)、十字になってるキューブマップのほうで:
Vec env(const Ray& r) { |
結果
- ピクセルあたり1000サンプルで、1024x768で描画したものを256x192に縮小
- 環境マップからのサンプルは、キューブマップの角のときのフィルタの仕方がわからなかったので、ポイントサンプル
- smallptのシーンは、でかい球の内部に構成されているとは予想外だったので、天井や壁を取っ払っても環境が描画されなくてハマッた
- 環境マップの放射輝度そのままだと明るすぎたので、適当にスケールしてる
- フォトンマッピングに組み込むにはどうしたらいいのかな
追記
球のLightProbeのときうまくいかないと思ったのは単に上下が逆転していただけだった…。継ぎ目もほとんどわからない。 球のほうが計算式は簡単になるけど、ファイルサイズが2倍くらいデカい。