2017-12-28 34 views
1

私のレンダリングは、これらの2つの垂直な四角形のエッジに沿って出血するピクセル(赤い点)です。オルソレンダリングしていないとき、どのようにオフセットを半分テクセルしますか?

私が使用しています:

  • GL_NEAREST最小/最大テクスチャフィルタリングを。
  • textureフラグメントシェーダで機能します。
  • 所望スプライト@(X = 320、Y = 732、幅= 8、高さ= 8)

s1 = 320.0f/1024.0f; s2 = (320.0f+8.0f)/1024.0f; t1 = 732.0f/1024.0f; t2 = (732.0f+8.0f)/1024.0f;

と1024×1024のスプライトアトラスは、暗い質感#1(レンダーそれが簡単に)出血を見ることができるようにするには: enter image description here

がレンダリング#2:(明るいテクセルをカウントするためのテクスチャが、赤色画素がまだ存在している)を持つ: enter image description here

私はOpenGLのtexture関数がピクセル中心でサンプリングされることを理解していますが、 "S、T"座標をハーフピクセルでオフセットしようとすると、それは修正されますが、悪影響があります。

たとえば、以下のテクスチャ座標は、スプライトの境界に沿ったテクセルの幅を縮小します。

s1 = (0.5f+320.0f)/1024.0f; s2 = (0.5f+320.0f+8.0f)/1024.0f; t1 = (-0.5f+732.0f)/1024.0f; t2 = (-0.5f+732.0f+8.0f)/1024.0f;

enter image description here

I Tが組み合わせオフセット可能S &の束を試みた(両方ともに0.5を加算し、S & T、Tに加えることなく、Sから減算、両方から差し引く)と異なる値、それのどれも働かなかった。私は何が欠けているのか分からない。私は出血するピクセルの色がテクスチャ(背景ではない)から来ているので、これはT接合の問題ではないと思います。

答えて

3

テクセルオフセットの半分を減算または加算するだけで問題を解決することはできません。なぜなら、問題を常に片側に保持するからです。

できることは、テクセルの座標をx + 0.5とx + width-0.5の範囲でクランプして、両側での出血を防ぐことです。コードは次のようになります。

s = clamp(texCoord.x, 320 + 0.5, 320 + 8 - 0.5)/1024; 
t = clamp(texCoord.y, 732 + 0.5, 732 + 8 - 0.5)/1024; 
+0

興味深い。だから私が[0,1]にクランプしたり、オルトレンダリングを使用していない限り、私はフラグメントシェーダーの座標をクランプする必要がありますか? –

+1

はい。それ以前に行うと、クランプとエッジを再構成するのではなく、テクスチャを引き伸ばすことになります。何かが起こる唯一の場所は、[320,320.5]と[327.5,328]の間の領域です。テクスチャ上のどこにいても特別なことはしないでください。投影(オルトまたはパースペクティブ)はまったく違いはありません。オルトレンダリングでさえ、フラグメントシェーダでそれを行う必要があります。 – BDL

関連する問題