私は頂点シェーダーで次のことをしようとしています:
...
attribute vec2 tCoordIn;
uniform vec2 tCoordScale;
uniform vec2 tCoordOffset;
varying vec2 tCoordOut;
void main() {
...
tCoordOut = (tCoordIn * tCoordScale) + tCoordOffset;
...
}
と に適切な値を使用すると、うまくいきませtCoordScale
んtCoordOffset
。
他に何も間違っていない場合、これは機能しますか、それとも GLSL 仕様に反しますか?
非常に風変わりなスケール番号を使用し、x オフセットと y オフセットの両方に予期しない番号を追加した場合にのみ、ほぼ機能します。GPU はテクスチャ イメージをパディングして、挿入したイメージの最初と最後を参照0
し1
なくなりましたか?
私のテクスチャ「アトラス」は 2048x2048 で、ターゲットは 75x75 ピクセル (クワッド用) で、テクスチャの (0.0, 0.75) にオフセットされています (出力画像でこれを確認しました)。
tCoordScale
したがって、75 / 2048 = (0.0366, 0.0366) であると推測しました。(私の入力テクスチャ座標が (0.0, 0.0) (1.0, 0.0) (0.0, 1.0) (1.0, 1.0) であると仮定すると)、それtCoordOffset
は単に (0.0, 0.75) である必要があります。
ただし、約tCoordScale
(0.000045, 0.000045) の場合 (75/2048 スケーリングに必要と予想されるものよりも各方向で約 814 倍小さい) で、tCoordOffset
約 (0.018, 0.768) の場合 (つまり、追加した場合)にのみほぼ正しく表示されます。とオフセット値0.018
の両方のx
値まで)。y
値をユニフォームとして送信することと、シェーダー自体に同じ値をハードコーディングすることの両方で、これを確認しました。(私はGLUtils.texImage2D
Android 経由で 2048x2048 の画像を送信しています)。
ここで何が起きてるの?これらの変更された値のみを受け入れるのはなぜですか? どのデバイスを使用していても、テクスチャ アトラス内でテクスチャ座標を常に正確にスケーリングおよび変換できるようにするにはどうすればよいですか?
洞察や、このような機能を持っている人からの経験をいただければ幸いです。