OpenQMC使ってみた
これはレイトレ合宿11で公開したスライドです
OpenQMC
- OpenQMC is a library for sampling high quality Quasi-Monte Carlo (QMC) points and generating pseudo random numbers. Designed for graphics applications, the library is part of Framestore's proprietary renderer Freak and is actively used in VFX production.
- https://openqmc.org/
- https://github.com/AcademySoftwareFoundation/openqmc
OpenQMCとは
- 準モンテカルロ法で使う低食い違い数列とそれを使った疑似乱数を扱うライブラリ
- 10月に突然AcademySoftwareFoundationから公開される
- GitHubの履歴は2023年から始まっている
- FramestoreのレンダラーFreakで使われているらしい
- グラフィックスアプリケーションで使いやすくデザイン!
ライセンスについて
- LICENSE は Apache License 2.0
- もう一つ LICENSE-NVIDIA というファイルがある
- OpenQMCを使っている限りは特許を主張しないという覚書
特徴
- ヘッダーオンリー
- C++14
- CPU、GPU対応
- SSE、AVX、NEON対応
特徴
- 3種類の数列
- Progressive Multi-Jittered
- Sobol
- Lattice
- 4次元のサンプルを生成
- それぞれにブルーノイズのバリアントがある
- ディザリングなどに
特徴
- ドキュメントが充実
- というかREADMEが充実
- サンプルも充実
- レイトレのサンプルコード、あります!
- というわけでとっつきは良いはず
使ってみる(抜粋)
まず最初にキャッシュのスペースを確保して初期化
auto qmcCache = std::vector<char>(oqmc::PmjSampler::cacheSize);
auto qmcCacheData = qmcCache.data();
oqmc::PmjSampler::initialiseCache(qmcCacheData);
使ってみる(抜粋)
ルートのドメインを作成して必要な分を分岐させる
for (int iy = 0; iy < height; iy++) {
for (int ix = 0; ix < width; ix++) {
for(int isp = 0; isp < sampleCount; isp++) {
enum {
kCameraDomain,
kFilterDomain,
kSubpixelDomain
};
const auto pixelDomain = oqmc::PmjSampler(ix, iy, frameIndex, isp, qmcCacheData);
const auto cameraDomain = pixelDomain.newDomain(kCameraDomain);
const auto filterDomain = pixelDomain.newDomain(kFilterDomain);
const auto subpixelDomain = pixelDomain.newDomain(kSubpixelDomain);
使ってみる(抜粋)
ほしい数だけ各ドメインからサンプリング(最大4個)
float ssSample[2];
subpixelDomain.drawSample<2>(ssSample);
float sx = (ix + ssSample[0]) / width * 2.0 - 1.0;
float sy = (iy + ssSample[1]) / height * 2.0 - 1.0;
float lensSample[2];
cameraDomain.drawSample<2>(lensSample);
Ray ray = Camera::getThinLensRay(&camera, sx, sy, lensSample[0], lensSample[1]);
実験1:DOF
- 簡単なDOFのテストシーンで実験
結果 (DOF)
- 32spp ランダム(xoshiro256)
結果 (DOF)
- 32spp Sobol
結果 (DOF)
- 32spp PMJ
結果 (DOF)
- 32spp 比較
実験2:ソフトフィルター
- すりガラスのようなレンズフィルターを再現したい
- 要するにブルームがのるフィルター
- 実装はレンズの出口でGGXでレイを散乱させる
- 薄レンズとGGXで合計4個の乱数を消費
結果 (ソフトフィルター)
- 32spp ランダム
結果 (ソフトフィルター)
- 32spp Sobol
結果 (ソフトフィルター)
- 32spp PMJ
結果 (ソフトフィルター)
- 32spp 比較
まとめ
- 簡単に使えて意外と効果がある








