グリッド スクリーン アライン メッシュにマップされたテクスチャがあるとします。次のようになります。
頂点の位置は次のとおりです。
(-1, -1), (1, -1), (-1, 1), (1, 1)
UV:
(0, 0), (1, 0), (0, 1), (1,1)
頂点の周りを移動して画像をワープし、 を実行して出力を保存しますglReadPixels()
。
新しい歪んだ頂点の位置は次のとおりです。
(-1, -1), (0.8, -0.8), (-0.6, 0.6), (0.4, 0.4)
そして、生成された出力は次のようになります。
次回は、先ほど保存したゆがんだ画像を入力として使用します。私がやろうとしているのは、頂点座標を変更することによって、以前に行ったワープ効果を逆にすることです。最初は、画像の歪みを解消する座標は次のようなものでなければならないと考えていました。
x_unwarp = 2 * x_original - x_warped
しかし、それは機能していません。ワープ効果は元に戻りません。私が得るものは次のようなものです:
私が間違っていることと、頂点座標またはおそらくUVをどのように変更する必要があるか考えていますか? 私は数学を間違っていると確信しています。
ありがとう!
アップデート
私の式が間違っているようです。私は行列を使うべきだった:
transform_matrix * x_original = x_warped
その後:
x_unwarped = inverse(tranform_matrix) * x_original
私が行っている変換は純粋なスケーリングであるため、変換行列は次のようになります。
/ \
| S 0 |
| 0 S |
\ /
ここで、S は倍率です。したがって、逆は次のようになります。
/ \
| 1/S 0 |
| 0 1/S |
\ /
したがって、これは次のようにワーピング頂点の位置を与えます。
(-1, -1), (1.25, -1.25), (-1.67, 1.67), (2.5, 2.5)
よりまっすぐに見えますが、それでも正しくありません:
2回目の更新
私は最初からそれを間違って始めたようです。すべてのレンダリングにはランダム要素が含まれています。私はそれを修正して、もう一度試してみます。
更新: UV ワープ
今回はUVワープで作ってみました。
これらの UV を使用してワープ:
(0.0, 0.0), (0.9, 0.0), (0.0, 0.8), (0.7, 0.7)
これにより、次のものが生成されました。
そして、逆を使用してワープを解除しようとしました:
(0.0, 0.0), (1/0.9, 0.0), (0.0, 1/0.8), (1/0.7, 1/0.7)
次のようになります。
これもできませんでした。見落としている 1/0 のケースが気になり始めています。
完全に無知。