Avoiding Texture Seams by Discarding Filter Tapsを読んでみた

[参照]
論文とsupplemental
Avoiding Texture Seams by Discarding Filter Taps

Traversal method(下記参照)
Eliminating Texture Waste: Borderless Realtime Ptex

概要

IntelのRobert Toth氏の論文です。趣旨としては、Texture,UV空間が非連続なエッジ上において、比較的低コストで、Texture Samplingの非連続性によるアーティファクトを回避する手法です。

前提条件

対象Primitive(ポリゴン)のUVの範囲外が、Samplerによってclampされる必要があります。従って、従来型のtexture atlas的な貼り方をされたモデルには、本手法は適用出来ないと思われます。
適用可能な例としては、realtime P-tex用のモデルの様に、quad mesh化された上に、Texture2DArrayでquadごとにTextureがアサインされたものになると思われます。
加えて、MSAAによるresolveによって、seamless化の代わりとなる演算(補間)を行うため、MSAAが必須となります。従って、MSAAのSubSampleの数によって、その品質が変わります。

アルゴリズム

通常は、Texture,UVが切り替わる境界エッジでは、互いに、エッジを共有する他方のPrimivieに貼られたTextureの情報を取得しないと、Primitiveの境界上でFilteringを伴うTexture Samplingを行うことは出来ません。(論文中ではこの手法をTraversal methodと呼んでいる)
しかし、本手法では他方となるPrimitiveのTextureの情報を取得しません。
まず、自身ののTextureの情報を格納する際に、BorderColorを0に設定し、Primitiveの範囲外の領域がサンプリングされた場合に0になるようにします。加えて、同解像度の1チャンネルテクスチャ(もしくは、空いているチャンネル)に1.0を格納しておき、こちらもBorderColorを0に設定しておきます。
TextureをSamplingする時は、Sampleした値を、1.0が格納されたTextureをSampleした値で除算することで、正規化を行います。このように計算することで、Sampling時のFilteringによって、UVがPrimitiveの範囲外となった領域の参照をDiscard(無効化)します。
一方、他方となるPrimitiveに貼られたTextureの情報は、自身が被覆しなかったSubSampleに、同様の計算を行った値が格納されていると仮定します。
最後にMSAAをResolveすることで、被覆したSubSampleの数に応じた補間が行われ、補間されたTextureのSampleが計算されるということになります。

計算式について

論文上の計算には、Texture境界で発生する複数のTextureを跨ぐFilteringを、MSAAのResolveに置き換えて考えるという大胆な近似が行われています。
しかし考え方を変えれば、単に、自身のPrimitiveに関する計算を、自身の範囲に限定して行っているに過ぎないと考えることも出来ると思います。しかし、当然そのままでは、全てのPrimitive境界で非連続なシェーディングとなりますが、MSAAがその非連続性を補間して、視覚的な不都合を解消していると考えられます。(逆にいえば、計算上の不都合は解決していないと言えると思います。)

考察

Traversal methodを使用する場合は、通常のSamplingに加えて、対象のQuadの上下左右の計4つを余分にSamplingしなくてはなりません。対して、Discard methodを用いる場合は、1点のみのSamplingで解決可能です。
Traversal methodは、Anisotropic Filteringに対しても正しく対応可能ですが、Discard methodはAnisotropic Filteringを使用した際に、異方性が大きくなると誤差が大きくなる可能性があります。
Discard methodは、補間をMSAAのResolveに頼っているので、Pixel境界にPrimitiveの境界が一致した際はMSAAの効かないのでseamが露呈するはずです。一方、Traversal methodはPrimitiveの位置の変化によって品質は変化しないと思われます。
Discard methodは、Texture Samplingのfilter kernelがMSAAに置き換わったと考えることが出来ると思います。従って、実際のfilter kernelとPixelのサイズが著しく異なる状況では、高品質を得るのは難しいかもしれません。
論文中の両手法の実行時間を比較した表では、GTX680/IrisPro5200両方とも、MSAAのSample数を増やしていくに従って、実行時間の差が縮まっていきます。(GTX680では、1xで2倍以上あった実行時間の差が、8xで37%に)
Discard methodを高品質で行うためには、MSAAのSample数がある程度必要なため、手法の変更によって大幅な実行時間の短縮を期待する場合は、注意が必要だと思われます。
Discard methodのレンダリング結果は、論文と一緒にポストしてある、supplementalに入っているムービーを見る限りでは、良好だと思います。本手法はMSAAを活用した手法ですが、奇しくもMSAAそのもの(レンダリングの計算としては正しくないが、結果は良好)の特性に通じるものがあると思います。