テクスチャアトラスと隣接するテクセルのリークの使用に関する問題は、線形テクスチャフィルタリングの動作に関係しています。
テクセルの中心で正確にサンプリングされていないテクスチャ内のポイントの場合、線形サンプリングは隣接する4つのテクセルをサンプリングし、指定された場所の値を(サンプルポイントからの距離に基づく)4つすべての加重平均として計算しますサンプル。
これは問題の素晴らしい視覚化です:
GL_CLAMP_TO_EDGE
テクスチャアトラスのようなものは使用できないため、各テクスチャのエッジの周りに境界テクセルを作成する必要があります。これらの境界テクセルは、アトラス内の完全に異なるテクスチャからの隣接するサンプルが、上で説明した加重補間によって画像を変更するのを防ぎます。
異方性フィルタリングを使用する場合は、境界線の幅を大きくする必要があることに注意してください。これは、異方性フィルタリングにより、極端な角度でサンプル近傍のサイズが大きくなるためです。
各テクスチャのエッジの周りの境界線を使用して私が何を意味するかを説明するために、OpenGLで利用可能なさまざまなラップモードを検討してください。に特に注意してくださいCLAMP TO EDGE
。
「Clamp to Border」と呼ばれるモードがありますが、実際には興味がありません。このモードでは、正規化された[0.0の外側にあるすべてのテクスチャ座標のテクスチャの周囲の境界線として使用する単一の色を定義できます。 -1.0]範囲。
CLAMP_TO_EDGE
(サブ)テクスチャの適切な範囲外のテクスチャ座標が境界外の方向にある最後のテクセル中心の値を受け取るの動作を複製する必要があります。ほぼ完全に制御できるので、アトラスシステムのテクスチャ座標。(有効な)テクスチャ座標がテクスチャの外側の場所を参照する唯一のシナリオは、テクスチャフィルタリングの加重平均ステップ中です。
GL_LINEAR
上の図のように、4つの最近傍をサンプリングすることがわかっているため、1テクセルの境界線のみが必要です。異方性フィルタリングを使用する場合、特定の条件下でサンプルの近傍サイズが大きくなるため、より広いテクセル境界が必要になる場合があります。
以下は、境界線をより明確に示すテクスチャの例ですが、目的に合わせて境界線を1テクセルまたは2テクセルにすることもできます。
(注:私が参照している境界線は、画像の4つのエッジすべての周りの黒ではなく、チェッカーボードパターンが定期的に繰り返されなくなる領域です)
疑問に思っている方のために、異方性フィルタリングを繰り返し取り上げているのはこのためです。これは、角度に基づいてサンプル近傍の形状を変更し、4つ以上のテクセルをフィルタリングに使用する可能性があります。
http://www.arcsynthesis.org/gltut/Texturing/ParallelogramDiag.svg
使用する異方性の度合いが大きいほど、4つ以上のテクセルを含むサンプルの近傍を処理する必要性が高まります。2テクセル境界は、ほとんどの異方性フィルタリングの状況に適しています。
最後に重要なことですが、ここではGL_CLAMP_TO_EDGE
、GL_LINEAR
テクスチャフィルターの存在下で動作を複製するパックテクスチャアトラスを作成する方法を示します。
(黒い座標のXとYから1を減算します。投稿する前に画像の校正をしていません。)
境界ストレージのため、このアトラスに4つの256x256テクスチャを格納するには、サイズ516x516のテクスチャが必要です。境界線は、アトラスの作成中にテクセルデータで塗りつぶす方法に基づいて色分けされています。
- 赤=すぐ下のテクセルで置き換える
- 黄色=真上のテクセルで置き換える
- 緑=すぐ左のテクセルで置き換える
- 青=すぐ右のテクセルで置き換える
このパックされた例では効果的に、アトラスの各テクスチャはアトラスの258x258の領域を使用しますが、表示される256x256の領域にマップするテクスチャ座標を生成します。境界テクセルは、アトラスのテクスチャのエッジでテクスチャフィルタリングが行われる場合にのみ使用され、それらの設計方法はGL_CLAMP_TO_EDGE
動作を模倣します。
不思議に思っている場合は、同様のアプローチを使用して他のタイプのラップモードをGL_REPEAT
実装できます。テクスチャアトラスの左/右および上/下の境界テクセルを交換することで実装できます。シェーダー。これはもう少し複雑なので、今のところ心配する必要はありません。あなただけのスプライトシートを扱っているので、に自分自身を制限するGL_CLAMP_TO_EDGE
:)
GL_NEAREST
か、GL_LINEAR
テクスチャをレンダリングしますか?