2

同じサイズの2つの画像を並べてステッチして作成したテクスチャアトラスを使用しています。テクスチャ座標を変更するときは、次の順序で実行します。

  1. if(texCoordx>1) texCoordx = texCoordx % 1-したがって、あるテクスチャが別のテクスチャに漏れることはありません。
  2. if(texCoordx<0) texCoordx = 1 + texCoordx-繰り返しますが、あるテクスチャが別のテクスチャに漏れることはありません。
  3. テクスチャ座標を0.5でスケーリングします。
  4. 右側にテクスチャを描画する場合は、0.5を追加します。

これはほとんど問題なく機能しますが、テクスチャ座標が1と0に近づくエッジで「汚れ」が発生するようです。t軸に沿って汚れているように見えます。スクリーンショットを添付しました。

境界で汚れた画像

ここで答えが1つ見つかったのは知っていますが、それは汚れをわずかに狭めるだけです。独自のシェーダーを使用していますが、テクスチャ座標の変更は行っていません。私も有効にしてGL_REPEATいます。誰かが考えられる原因/解決策を知っていますか?

4

1 に答える 1

4

私があなたの写真を正しく解釈すると、このテクスチャはアトラスからの2つのテクスチャ(左を想定)の1つであり、元のtexCoordsは(左から右へ)次のようなものでした。

0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 2

ステップ1で自分でラッピングした後、次のようになります。

0.2, 0.4, 0.6, 0.8, 1, 0.2, 0.4, 0.6, 0.8, 1

、後でなりました

0.1, 0.2, 0.3, 0.4, 0.5, 0.1, 0.2, 0.3, 0.4, 0.5

ここでは、単調性が変化する0.5、0.1で問題が発生します。OpenGLは、左右方向に0.5から0.1に移動することを認識していません。差は-0.4であるため、テクスチャの先頭に向かって右から左に補間します(したがって、この小さな間隔内のテクスチャ全体を後方に圧縮するため、t軸に沿って実際に正しくなります)。これは、OpenGLがテクスチャがテクスチャの中央で折り返されることを認識しないためです。これは、概念的には1つの大きなテクスチャのみが表示され、小さなテクスチャのアトラスは表示されず、GL_REPEAT折り返しモードはテクスチャの端でのみ機能するためです。大きなテクスチャ。

テクスチャにアクセスする前に、フラグメントシェーダでラッピング(最初の2つの手順)を実行する必要があります。したがって、テクスチャ座標はすべて単調であり、正しく補間されます。次に、フラグメントでテクスチャ座標を安全にラップできます。実際には、フラグメントシェーダーですべての手順を実行できます。アトラス内のオフセットに均一を与えるだけです(実際のサブテクスチャを選択します)。次に、テクスチャにアクセスする直前に、ラッピング、スケーリング、およびオフセットの追加を行います。

于 2011-08-04T17:46:42.827 に答える