テクスチャ マップ / スプライト シートに、たくさんのサムネイル / アイコンが隣り合わせに詰め込まれています。ピクセル間の関係から、これらは 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 の幅を使用すると、より良い結果が得られます。しかし、数字を手動で調整するだけですべて修正できます。私はそれを正しく機能させるための数学を持ちたいです。
...または..多分それは最小/最大フィルタリングと関係があります-私はそれを読んでいますが、私がしていることはこの場合には正しいようです。