OpenGLの正方形テクスチャで台形をマッピングするテクスチャ
-
28-10-2019 - |
質問
GL_QUAD(台形の形をしている)を正方形のテクスチャでレンダリングしようとしています。これを実現するためだけにOpenGLを試してみたいと思います。現在、テクスチャがひどく歪んでいて、本当に迷惑です。
通常、私はテクスチャをロードしてホモグラフィを計算しますが、それは多くの作業と追加の線形計画法ライブラリ/直接線形変換関数を意味します。 OpenGLがこのプロセスを簡素化できるという印象を受けています。
Webを見回して、 "Perspectiveを見ました-正しいテクスチャリング、Q座標、およびGLSL "および
これらはすべて、ある種のホモグラフィ計算を行うか、OpenGLの一部を使用することを前提としているようです...何かアドバイスはありますか?
更新:
"画像を使用した静的環境のナビゲート-を読んでいます。スペースの簡素化とモーフィング」 [ PDF ] -9ページの付録A。
(s、t、r、q)テクスチャ座標にモデルのワールドスペースzコンポーネントの頂点を乗算することにより、遠近法の修正を無効にしているようです。
台形の形をしたクワッドの特定のテクスチャ座標(s、r、t、q)の場合、4つのコンポーネントは次のとおりです。 ジェネラコディセタグプレ
これはglTexCoord4f(s vert.z、r vert.z、t、q * vert.z)と同じくらい簡単ですか?それとも私はいくつかのステップを逃していますか? GL_TEXTURE glMatrixModeをいじるようなものですか?
更新#2:
それでうまくいきました!皆さん、この問題はWeb全体にあり、簡単な答えはありませんでした。ほとんどの場合、元の形状と変換された形状の間のホモグラフィを使用してテクスチャを直接再計算する必要がありました...別名、多くの線形代数と外部BLASlib依存関係。
解決
ここに問題と解決策の良い説明があります。
http://www.xyzw.us/~cass/qcoord/
Cass によって作成された、上記のリンクから部分的にコピーおよび適合されたもの
テクスチャマッピングのより興味深い側面の1つは、テクスチャ座標が存在する空間です。私たちのほとんどは、テクスチャ空間を単純な2Dアフィン平面と考えるのが好きです。ほとんどの場合、これは完全に受け入れられ、非常に直感的ですが、問題が発生する場合があります。
たとえば、空間座標では台形であるが、テクスチャ座標では正方形であるクワッドがあるとします。
OpenGLは、クワッドを三角形に分割し、テクスチャ座標(ds / dx、ds / dy、dt / dx、dt / dy)の傾きを計算し、それらを使用してポリゴンの内部のテクスチャ座標を補間します。左下の三角形の場合、dx= 1およびds= 1ですが、右上の三角形の場合、dx <1、ds= 1です。これにより、右上の三角形のds / dxが下の三角形のds / dxよりも大きくなります。これにより、テクスチャマッピング時に不快な画像が生成されます。
通常、r= 0とq= 1defaultsはそのままにしておきますが、テクスチャ空間は単なる2Dアフィン平面ではありません。それは本当に完全な射影空間(P3)です!これは良いことです。なぜなら、上の頂点のテクスチャ座標を(0、1)と(1、1)の(s、t)座標として指定する代わりに、(s、t、r、q)座標として指定できるからです。 (0、width、0、width)と(width、width、0、width)の!これらの座標はテクスチャ画像の同じ場所に対応していますが、ds / dxに何が起こったのかを見てください。両方の三角形で同じになりました。それらは両方とも同じdq / dxとdq / dyを持っています。
まだz= 0平面にあることに注意してください。この手法を遠近法カメラ投影で使用すると、「誤った奥行き知覚」が発生するため、非常に混乱する可能性があります。それでも、(s、t)だけを使用するよりも良い場合があります。それはあなたが決めることです。
他のヒント
I would guess that most people wanting to fit a rectangular texture on a trapezoid are thinking of one of two results:
- perspective projection: the trapezoid looks like a rectangle seen from an oblique angle.
- "stretchy" transformation: the trapezoid looks like a rectangular piece of rubber that has been stretched/shrunk into shape.
Most solutions here on SO fall into the first group, whereas I recently found myself in the second.
The easiest way I found to achieve effect 2. was to split the trapezoid into a rectangle and right triangles. In my case the trapezoid was regular, so a quad and two triangles solved the problem.