OpenGL 2Dラスタライズサブピクセル変換


7

タイルベースの2Dエンジンがあり、投影マトリックスは、スケーリングが適用されていない世界の正投影ビューです。したがって、1つのピクセルテクスチャが同じサイズで画面に描画されます。

それはすべてうまく機能して見栄えが良いですが、カメラがサブピクセルの動きをするとタイル間に小さな線が現れます。何が問題を解決しないのかを事前にお知らせします。

  • GL_NEAREST テクスチャ補間
  • GL_CLAMP_TO_EDGE

問題を「修正」するのは、サブピクセル変換を行う代わりに、カメラを最も近いピクセルに固定することです。私はそれに耐えることはできますが、カメラの動きはぎくしゃくします。私が現在行っている丸めのトリックに頼らずにその問題を修正する方法はありますか?


たまたま、1つの大きなテクスチャに複数のタイルテクスチャを格納していますか?同様の問題があったことを覚えています。これは、隣接するタイルテクスチャからのOpenGLレンダリングピクセルが原因でした。私が最後にそれを解決した方法は、各タイルを独自のテクスチャに移動することでした。しばらくの間、問題がで発生したのGL_NEARESTか、でのみ発生したのかはわかりませんGL_LINEAR
reko_t

私はそうしますが、この特定の問題に対して提案された解決策(GL_NEAREST)はどれも少しも役に立ちません。また、テクスチャの丸めエラーは、隣接するピクセルが表示されることを意味しますが、表示されるのはスプライトの背景であり、これが一般的なラスタライズの問題である可能性があるという考えにつながります。
Armin Ronacher、2011

回答:


1

カメラのぎくしゃくを回避するには、浮動小数点座標カメラを維持する必要がありますが、OpenGLの投影を最も近いピクセルに固定します。


それはどのように機能しますか?投影マトリックスは、正射投影プロジェクトとして一度設定するだけで、フレームの変更は適用されません。
Armin Ronacher、2011

申し訳ありませんが、はっきりしていません。ビューマトリックスと投影マトリックスを調整して、最も近いピクセルにクランプするようにしてください。ただし、これらのクランプされた値をカメラパラメーターに保存しないと、エラーが累積してジッターが発生します。これがすでにあなたがやっていることであり、それでもカメラが揺れる場合、私たちはあなたのグラフィックについてもっと知る必要があります:それはピクセルアートですか、それとも影付きの絵ですか?モデルの大きさは?
sam hocevar

2Dプラットフォーマーです。私は今レンダリングをピクセルにクランプしていますが、うまく機能しています。最終的な画像を取得し、photoshopを使用して画像をサブピクセル量だけ上から下に移動すると、希望どおりの動きが得られます->スムーズな動き。FBにレンダリングしてから翻訳すれば、OGLでそれを行うことができます。モデルビューマトリックスでこれを行うと、タイル間のギャップが表示されます。
アーミンロナッチャー

また、OGLに送信する前に、ワールドオブジェクトの座標も丸めていますか?私は等尺性のゲームのためにそれを正確に行い、それはうまくいきます。
sam hocevar

0

OpenGLマトリックスの代わりにを使用する方法については、このブログ投稿をご覧ください。OpenGLを使用するPCでも同様の問題が発生したため、iPhone / OpenGL ES固有ではありませんが、ブログの投稿ではiPhoneのOpenGL ESについて言及しています。doublefloat


反対投票者は少なくとも彼の反対投票を説明できますか?私の答えは有益であり、OPの問題の解決策を提案します。
jv42

0

各タイルのコーナーの座標を計算すると、精度が失われる可能性があります。したがって、たとえば、タイル0の右下の頂点は、タイル1の左下の頂点とまったく同じ場所にあると考えますが、実際にはそうではありません。これを修正する1つのアイデアは、最初に一時的な座標グリッドを計算し、タイルジオメトリを構築するときに適切な位置をコピーすることです。それは理にかなっていますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.