レイ微分(ray differentials for mipmaping)

by syoyo

さて、
実際にテクスチャマッピングをしてテクスチャキャッシュの実装を
進めようかなーと思っていたのですが、
レイトレでミップマップをするには
微分値(フットプリント推定)が必要ということにいまさらながら気づきました。

というわけで、レイ微分を実装しました。

Homan Igehy, “Tracing Ray
Differentials”, SIGGRAPH
1999.

http://graphics.stanford.edu/papers/trd/

レイ微分について数式が多いので、RenderNote
のほうに詳しく解説しています。


http://lucille.atso-net.jp/wiki/index.php?%A5%EC%A5%A4%C8%F9%CA%AC

とりあえずは、
一次レイ(transfer)におけるレイ微分を実装しました。

angelina に実装したコードは以下にあります。


http://lucille.atso-net.jp/svn/angelina/texturing/mapping/

 

レイ微分により、テクスチャ空間での (s, t)
のフットプリントを元に LOD を計算し、
LOD 値を視覚化したものです。赤が lod = 0, 緑が 1,
青が 2 です。

 
上図の lod
によりミップマップしてテクスチャを貼り付けた結果
(トライリニア補間により 2
レベルのミップマップを線形補間しています)。
左: ミップマッピング有効。 右: ミップマップなし。
1 ピクセルあたり 2×2 サブサンプル。

 
テクスチャの異なるバージョン。左: ミップマッピング有効。 右:
ミップマップなし。

感想

正直なところ、
ミップマップ有効とミップマップ無効では、
今回の平面に貼り付けの場合ではほとんど結果に差がありませんでした。

とはいえ、1×1
サブサンプリングだとミップマップ有効のほうがちょっとよい結果のようでした。

逆を言うと 2×2
サブサンプリングでミップマップなしでも十分な品質が出ました。

もちろん、品質に違いがなくとも、
メモリアクセスの観点からはミップマップしたほうが
アドバンテージがあるはずです。
(メモリアクセス(キャッシュミス)コスト > LOD
算出コストであることが前提ですが…)

かなり傾けてレンダリングしてみたときは、思ったより小さい LOD
しか算出されなかったので、
これが正しいのか実装が間違っているのか検証する必要があります。

また、
現在はミップマップを作るときに単純なボックスフィルタでダウンサンプルしているので、

あまりミップマップの品質が高くありません。
遠くにポリゴンを置いてレンダリング(lod
値を上げる)すると
張られるテクスチャがぼやけた感じになってしまい、
ミップマップしないでテクスチャマッピングしたほうが品質が高くなる場合もありました。

ミップマッピングも、現在の実装は等方性ですが、
やはり異方性にする必要もあります。

まあとりあえずレイ微分の基礎部分はうまく動いているようなので、

これからいろいろなジオメトリにぺたぺたテクスチャを張って試していき、

機能を追加、また間違いがあれば修正していこうと思います。

Advertisements