3

テクスチャ マップ / スプライト シートに、たくさんのサムネイル / アイコンが隣り合わせに詰め込まれています。ピクセル間の関係から、これらは 145 ピクセル平方から 238 スクリーン ピクセル平方に拡大されています。テクスチャ座標にアクセスするときに、ボックスの端で +-1 または 2 ピクセルの精度が得られることを期待していたので、サムネイルの上に 4 ピクセルのアウトラインを描画して、この可能性のあるアーティファクトを隠しています。しかし、精度には大きなばらつきがあります。一方向にずれることもあれば、逆方向にずれることもあります。

数学を調べましたが、何が起こっているのかわかりません。

サムネイルは約 1.64 倍に拡大されています。したがって、ソース テクスチャ座標で 1 ピクセルずれると、画面上で約 2 ピクセルずれることになります。上部の 4 ピクセルの白いフレームは、1 対 1 ピクセル対フラグメントの関係で描画されており、ボックスの端の両側で約 2 ピクセルをカバーすることになっています。その部分は機能しています。ここでは、境界線をオフにして、テクスチャ座標がどれだけ離れているかを示しています....

ここに画像の説明を入力

数値を手動で微調整して、それをなくすことができます。しかし、テクスチャ座標の幅/高さをいくつかのソース ピクセルだけ縮小する必要があり、場合によっては開始点に 5 または 6 ピクセルを追加 (または削除) する必要があります。私は本当に数学がうまくいくか、ここで何が間違っているのかを理解したいだけです. この種のものは私を夢中にさせます!

知っておくべきがらくたの束。

  • シェーダーは、頂点シェーダーでテクスチャ座標のオフセットを行っています...

    v_fragmentTexCoord0 = vec2((a_vertexTexCoord0.x * u_texScale) + u_texOffset.s, (a_vertexTexCoord0.y * u_texScale) + u_texOffset.t);
    gl_Position = u_modelViewProjectionMatrix * vec4(a_vertexPosition,1.0);
    
  • このオブジェクトは、2 つの三角形を持つ三角形のストリップであるボックスです。

  • 重要ではありませんが、モデルに適用されたマトリックスはスケーリングを行っていません。ボックスはスクリーン スケールです。スケーリングは、提供されているテクスチャ座標でのみ発生しています。

  • 上記のオブジェクトのテクスチャ座標は 0.00 ~ 0.07 で、シェーダーにはサムネイルごとに異なるオフセット量が追加されます。2048 のうち .07 は 143 のようなものです。元々、私は .0708 でそれを持っていました。これは 145 に近いはずですが、テクスチャから 148 ピクセルのように表示されました。145 個のソース ピクセルのみを表示するには、140 ピクセルである .0.06835 にする必要があります。

  • 電卓で計算して、数字を直接入力してみました。私も =1305/2048 のようにしてみました。これらは double ではなく GLfloats に入ります。

  • このテクスチャ マップ イメージは PNG で、次の設定でロードされます。

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
    

しかし、GL_LINEARも試しましたが、明らかな違いはありません。

  • テクスチャ スケーリングを行っていない他のテクスチャ (同じテクスチャ マップ内) では、精度の問題はありません。

  • 座標が高くなるにつれて、それは遠くにはなりません。上の画像では、NEG MAP サムは HEAT MAP サムのすぐ隣にあり、さまざまな方向に外れていますが、継ぎ目では正しいです。

  • これら2つのオフセットデータは次のとおりです..

    filterTypes[FT_gradientMap20].thumbTexOffsetS = 0.63720703125;
    filterTypes[FT_gradientMap20].thumbTexOffsetT = 0.1416015625;
    filterTypes[FT_gradientMap21].thumbTexOffsetS = 0.7080078125;
    filterTypes[FT_gradientMap21].thumbTexOffsetT = 0.1416015625;
    

====更新====

私が間違ったことをしていることに気づいたいくつかのことは、ここで議論されています:ピクセル空間での OpenGL テクスチャ座標

1 つのサムネイルの幅は 145 です。しかし、それは 0 ~ 144 になり、次のサムネイルは 145 から始まります。145 の幅を使用していたので、1 ピクセル大きすぎます。上記のピクセル タイプの中心の計算を使用すると、実際には 0 の中心から 144 の中心に移動する必要があります。144.5 - 0.5 = 144.

彼の式 (2i + 1)/(2N) を使用して、開始点ごとに新しいオフセット量を作成し、幅として 144/2048 を使用しました。これにより状況は改善されましたが、一部の領域ではまだうまくいきませんでした。そしてまた、ある方向にずれたり、別の方向にずれたりします。x または y 位置ごとに一貫していますが。

143 の幅を使用すると、より良い結果が得られます。しかし、数字を手動で調整するだけですべて修正できます。私はそれを正しく機能させるための数学を持ちたいです。

...または..多分それは最小/最大フィルタリングと関係があります-私はそれを読んでいますが、私がしていることはこの場合には正しいようです。

4

1 に答える 1

3

多くの実験と、各テクスチャがどれだけ離れているかを正確に確認できるように、グリッド線付きのガイド テクスチャを作成する必要があった後、ついにそれを手に入れました!

それは実際には非常に簡単です。

uniform mat4 u_modelViewProjectionMatrix;
uniform mediump vec2 u_texOffset;
uniform mediump float u_texScale;
attribute vec3 a_vertexPosition;
attribute mediump vec2 a_vertexTexCoord0;

テクスチャ座標の精度。mediump を指定することで、それ自体が修正されました。これは、この質問で抱えていた問題の解決にも役立つと思います。

1.0 のテクスチャ座標がテクスチャの端を超えているのはなぜですか?

それをしたら、元の 145 幅に戻さなければなりませんでした (これはまだ間違っているように見えますが、まあまあです)。そして、それが価値があるために、すべてのテクスチャ座標ですべての元の数学に戻ってしまいました。「ピクセルの中心」メソッドは、ストレート /2048 よりも多くの隣接ピクセルを表示していました。

ここに画像の説明を入力

于 2013-09-27T06:09:00.650 に答える