10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Mitsuba 2 : A Retargetable Forward and Inverse Renderer のメモ

Last updated at Posted at 2019-09-11

Mitsuba 2 : A Retargetable Forward and Inverse Renderer
http://rgl.epfl.ch/publications/NimierDavidVicini2019Mitsuba2

ひとことでいうと, これからの 2020 年代のレンダラーデザインと実装.

背景

レイトレーシングベースのレンダラー(物理的に正しい計算をして綺麗な画像をつくる)のデザインや実装パターンの研究というのは, 1990 年代後半から始まったように思います.

このセクションはレンダラおじさん回顧録です.

90 年代後半から 2000 年最初あたり

RenderPark
http://graphics.cs.kuleuven.be/renderpark/

Kilauea : parallel global illumination renderer
https://www.researchgate.net/publication/221357189_Kilauea_parallel_global_illumination_renderer

このときは global illumination renderer というと, photon map 法を使うのが主流でした.

PBRT の前身である lrt(literate ray tracer).

Stanford でのコンピュータグラフィックスのコースの資料として使われていました. 著者は PBRT と同じく Matt Pharr ら.

私は Stanford のどこかのウェブサイトに掲載されていた lrt のテキスト(PDF)をこっそりうまく見つけて(本来は公開されていないものだったはず), lrt でレンダラー実装の多くを学びました(PBRT に比べるとスッキリして学びやすかったです).

おやおや? なんだか Pharr 先生のサイトに lrt のコピーが転がっていますね?

2000 年代

教育, 研究むけ: PBRT(Physically Based Rendering), Mitsuba の登場

昨今での TensorFlow, PyTorch, Chainer のような機械学習フレームワーク開発ブーム(?)のようなものがあったような記憶があります.

この辺りから, progressive path tracing がだんだんと主流になってきました.
BDPT, MLT もありましたが, パストレに比べると, 実装では計算が不安定だったりしてうまく収束しなかったり, へんなアーティファクトが出るなどがありました.

2010 年代

  • GPGPU での効率的なパストレーシング,
  • 自動 SIMD 化や, wider SIMD での効率的なレンダリング(vectorized path tracing)
  • Embree, OptiX などのレイトレーシングカーネル/フレームワークの登場
    • 特に, Embree により高速な BVH 構築 & 交差判定が行えるようになり, レンダラ開発が楽になりましたね

Mitsuba 2 の主な機能

  • 多要素ベクトル(or nd-array)の定義
  • 自動 SIMD 化
  • automatic differentiation(微分レンダラ)
  • JIT コンパイル, GPU での計算の実行(GPGPU)

実装言語は C++

実装は C++ です. 昨今の C++11 ~ C++17 での言語拡張により, 上記の機能をより C++ で実現しやすくなっています.

たとえば, 2000 年代前半は, SIMD でベクトル型を実現しようにも, コンパイラの仕様や実装の整備が追いついておらず, アラインメントを考慮してメモリ確保しないといけない(かつ, 当時はコンパイラや OS ごとに対応度がまちまちで, かならずアラインメントが保証されたメモリ確保ができないときもあり, カスタムメモリアロケータの作成を余儀なくされたときもあった), MSVC では SIMD 変数の引数での値渡しは最初の 4 個くらいまでだったり, vector 型(struct)を返り値型にすると冗長なアセンブラ命令になるなどがありました.

昨今ではこのようなコンパイラや OS 依存の問題というのはほぼなくなっていて, C++11 以降の言語仕様の発展もあり, かなり効率的に ASM に変換できるようになっています.

アプリケーション

これらの機能により, たとえば以下のアプリケーションが実現できます.

  • 効率的なスペクトルレンダリング(nd-array + SIMD), 偏光レンダリング
  • レイをまとめての計算の効率化(nd-array, JIT, SIMD/GPGPU 化)
  • ターゲット画像になるようなコースティクスや, ボリュームデータを生成する(differentiable rendering)

とくに, 昨今の機械学習で流行りの differentiable rendering を, レンダラ全体で行えるようにしたことで, inverse rendering によりいろいろなアプリケーションが作れるのが期待できます.

mitsuba2 の論文では, ボリュームレンダリングの結果画像から, ボリュームデータを推定するという例が示されています(レイの経路が複雑なものでも扱うことができるということを見てせている)

たとえば, 雲の写真を複数視点でいくつか与えれば, それに近い雲のボリュームデータを推定できる.
たとえば, 顔写真をあたえて, 写真と同じようなライティングを CG の顔に施して CG と写真がうまく合成されているようにみせる, などという感じです.

インスタ映え写真の生成に使えてがっぽがっぽできそうですね! :money_mouth:

ソースコード

mitsuba2 のソースコードはまだ公開されていなようですが, 近いうちに公開されるでしょう.

コンポーネントのひとつである Enoki は

にて公開されています(BSD ライセンス).

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?