texture filtering
レンダリング時のtexture filteringを意識した事のある方はどのくらいいらっしゃるでしょうか. 偉そうに書いている自分もこちらで働き始めてから学んだ事なのですが,ペイントしたテクスチャ,proceduralなテクスチャを問わず,テクスチャを常に綺麗に見せるのは至難の業です.(これは先日書いた記事にも関係する事なので,リンクを) 今回はペイントしたテクスチャについて考えます. これは本質的には,レンダリングされる画像の解像度とテクスチャの解像度が一致しない事が原因です.これを常に一致させる事ができれば,ほぼ確実なアンチエイリアスが可能になり,アニメーションやカメラ位置に関わらず美しいレンダリング結果が得られるでしょう. しかしながら,テクスチャの一部しか画面に出ていなかったり,カメラとオブジェクトの距離が変化したり,オブジェクトの面積がdeformによって広がったりする限り,これらを一致させる事は不可能です.この解像度の不一致によるaliasingをある程度防ぐ為に,mipmappingやanisotropic filtering等が考案されてきました. これらの手法は基本的にフィルタによってaliasingを防ぐ事が目的であり,下手をすればディティールが死んでしまいます.そして,殆どの場合,これらの調整はユーザパラメータになっており,その場面に応じて調整する必要があります.レイトレーシングの場合は反射や屈折が起こり,更に問題が複雑になります. この調整がなかなか大変で,自分は以前,綺麗に見せるためにパラメータをアニメーションさせた事さえあります. 最近(と言っても’99ですが)になり,”ray differentials“と言う,現在の所最も有効と思われる手法が考案されました. これは大まかに言うと,あるサンプルレイと画面上でdx(若しくはdy)だけ異なるサンプルレイとの三次元空間上のdifferential(変化量)を計算し,それをフィルタ幅の指標に用いるという手法です.x方向y方向それぞれのdifferentialがあるのでdifferentialsと複数形になっています. ray differentialはレイが反射や屈折をしても計算可能であり,上記リンク先の論文中にあるテストレンダリングでもかなり良好な結果が得られている事が分かると思います.また,これは画面上での変化量を知る大変便利な指標となり,他にも色々と応用が利きそうです. こんなに素晴らしいray differentialですが,商用のレンダラで実装している物はまだ殆ど見かけません.(注:自分が知らないだけの可能性もあります) ところが,このtexture filteringの問題をもうずーっと前から解決している手法があります.それはPRManに代表される,Reyesです. Reyesではあるsplitされたprimitiveが画面上でどのくらいの解像度を持つか,シェーダを評価する前に知る事ができます.また,2のべき乗に整形されたテクスチャは,そのprimitiveにほぼ一致するテクスチャを探し出す事を可能にします.また,Reyesはレイトレーシングをしない事を仮定しているので,いつでもこの規則に従ってテクスチャの解像度を選ぶ事ができます. 最近のReyesレンダラはPRManを含め,こぞってレイトレーシングを実装していますが,恐らくレイトレーシングした先の解像度はかなり荒っぽい方法で求められており,一次レイの画像程美しくは無いでしょう. Reyesは間違いなく映画をレンダリングする為のレンダリング手法として編み出されており,全てのバランスを考えると,とても良く考えられた素晴らしいアーキテクチュアだと思います.これが二十年以上も前に考案された事にはただただ驚くばかりです. なんだか本題からずれてしまいましたが,フィルタの話はサンプリングの話と関わりが深く,基本的にpoint sampingなレイトレーシングでは色々と問題になる事が多いため,現在の所,人間が頑張って綺麗に見せていると言うのが実情です.