タイルセットイメージからタイルを描画してタイルマップを描画する2Dゲームエンジンがあります。デフォルトでは、OpenGLはテクスチャのGL_REPEAT
一部()ではなくテクスチャ全体のみをラップできるため、各タイルは個別のテクスチャに分割されます。次に、同じタイルの領域が互いに隣接してレンダリングされます。意図したとおりに動作しているときの外観は次のとおりです。
ただし、分数スケーリングを導入するとすぐに、継ぎ目が表示されます。
なぜこれが起こるのですか?これは、四角形の境界線をブレンドする線形フィルタリングによるものだと思いましたが、それでもポイントフィルタリングでは発生します。私がこれまでに見つけた唯一の解決策は、すべての位置決めとスケーリングが整数値でのみ発生するようにし、ポイントフィルタリングを使用することです。これにより、ゲームの視覚的品質が低下する可能性があります(特に、サブピクセルの配置が機能しなくなるため、動きがそれほど滑らかになりません)。
私が試した/考えたこと:
- アンチエイリアスは、継ぎ目を減らしますが、完全に排除しません
- ミップマッピングをオフにしても効果はありません
- 各タイルを個別にレンダリングし、1ピクセルずつエッジを押し出します-しかし、これは最適化されていません。タイルの領域を一度にレンダリングできなくなり、透明領域のエッジに沿って他のアーティファクトを作成するためです。
- ソース画像の周囲に1pxの境界線を追加し、最後のピクセルを繰り返します-しかし、それらは2のべき乗ではなくなり、NPOTサポートのないシステムとの互換性の問題を引き起こします
- タイル化された画像を処理するためのカスタムシェーダーを記述しますが、それではどうしますか?
GL_REPEAT
境界で画像の反対側からピクセルをつかみ、透明度を選択しないでください。 - ジオメトリは正確に隣接しているため、浮動小数点の丸め誤差はありません。
- フラグメントシェーダーが同じ色を返すようにハードコーディングされている場合、縫い目は消えます。
- テクスチャに設定されている場合
GL_CLAMP
の代わりにGL_REPEAT
、継ぎ目が消え(レンダリングが間違っているが)。 - テクスチャがに設定されている
GL_MIRRORED_REPEAT
場合、縫い目は消えます(ただし、レンダリングは再び間違っています)。 - 背景を赤にしても、縫い目は白のままです。これは、透明ではなく、どこかから不透明な白をサンプリングしていることを示唆しています。
そのため、シームGL_REPEAT
は設定されている場合にのみ表示されます。このモードでのみ何らかの理由で、ジオメトリの端にブリード/漏れ/透明度があります。それはどうですか?テクスチャ全体が不透明です。
GL_NEAREST
サンプリングされた3DテクスチャR
も、このシナリオのほとんどの場合に配列テクスチャと同様に機能します。ミップマッピングは機能しませんが、アプリケーションから判断すると、おそらくミップマップは必要ありません。