2012-09-13 13 views
5

私はGLSLで正しい2Dアフィンテクスチャマッピングをコーディングしようとしています。正しいglslアフィンテクスチャマッピング

説明:

...この画像のどれも私の目的のために正しいではありません。右(「正解」と書かれています)には、私が望まないパースペクティブな修正があります。したがって、これは:Getting to know the Q texture coordinateソリューション(それ以上の改善なし)は私が探しているものではありません。

私はこのような単純に「ストレッチ」四辺形の内部テクスチャ、何かしたいと思い

enter image description here

が、2つの三角形から成ります。どんなアドバイス(GLSL)でもどうぞ!

+1

上部の頂点は下部の背後にありますか、またはクォードの頂点の位置をスケーリングしていますか? –

+0

スケーリング、すべての座標は2Dです(私はちょうど私のポストを修正しました) – velkyel

答えて

-2

おかげで、しかし、試した後、私は解決策を見つけました。左側の

二つの三角形は、UV(STRQ)を有する右にthisと二つの三角形に係るこの遠近補正のバージョンをmodifedれます。

番号およびシェーダ:

tri1 = [Vec2(-0.5, -1), Vec2(0.5, -1), Vec2(1, 1)] 
tri2 = [Vec2(-0.5, -1), Vec2(1, 1), Vec2(-1, 1)] 

d1 = length of top edge = 2 
d2 = length of bottom edge = 1 

tri1_uv = [Vec4(0, 0, 0, d2/d1), Vec4(d2/d1, 0, 0, d2/d1), Vec4(1, 1, 0, 1)] 
tri2_uv = [Vec4(0, 0, 0, d2/d1), Vec4(1, 1, 0, 1), Vec4(0, 1, 0, 1)] 

だけ直角三角形このGLSLシェーダ(左側に固定パイプラインである)を使用してレンダリングされる:

void main() 
{ 
    gl_FragColor = texture2D(colormap, vec2(gl_TexCoord[0].x/glTexCoord[0].w, gl_TexCoord[0].y); 
} 

をので..だけUは斜視図で、Vは線形であります。

+2

それはまさに私があなたに示したものですが、それは多くの場合を説明していません。 6つの頂点を持つことはありません。 – Jessy

6

これは、台形があり、平行なエッジがローカル軸の1つに揃っている限り、正常に機能します。 Unity packageで遊んでみることをおすすめします。

GLSL:

varying vec2 shiftedPosition, width_height; 

#ifdef VERTEX 
void main() { 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    shiftedPosition = gl_MultiTexCoord0.xy; // left and bottom edges zeroed. 
    width_height = gl_MultiTexCoord1.xy; 
} 
#endif 

#ifdef FRAGMENT 
uniform sampler2D _MainTex; 
void main() { 
    gl_FragColor = texture2D(_MainTex, shiftedPosition/width_height); 
} 
#endif 

C#:回答を

// Zero out the left and bottom edges, 
// leaving a right trapezoid with two sides on the axes and a vertex at the origin. 
var shiftedPositions = new Vector2[] { 
    Vector2.zero, 
    new Vector2(0, vertices[1].y - vertices[0].y), 
    new Vector2(vertices[2].x - vertices[1].x, vertices[2].y - vertices[3].y), 
    new Vector2(vertices[3].x - vertices[0].x, 0) 
}; 
mesh.uv = shiftedPositions; 

var widths_heights = new Vector2[4]; 
widths_heights[0].x = widths_heights[3].x = shiftedPositions[3].x; 
widths_heights[1].x = widths_heights[2].x = shiftedPositions[2].x; 
widths_heights[0].y = widths_heights[1].y = shiftedPositions[1].y; 
widths_heights[2].y = widths_heights[3].y = shiftedPositions[2].y; 
mesh.uv2 = widths_heights; 
+0

あなたはどの頂点が含まれているか書き出すことができますか?私は 'vertex = [Vec2(-1、-1)、Vec2(-0.5,1)、Vec2(0.5,1)、Vec2(1、-1)]'のシフトポジション= [Vec2 Vec2(1,2)、Vec2(1,2)、Vec2(1,2)、Vec2(1,2)、Vec2(1,2)、Vec2 (2,2)]。そして、私の断片は次のようになります: 'gl_FragColor = texture2D(colormap、gl_TexCoord [0] .xy/width_heights.xy);'(私はgl_TexCoordを使う必要があります)。そして、それは単に機能しません。 – velkyel

+0

あなたのvec2はすべて問題ありません。 Unityプロジェクトよりも役立つものは何もあなたに提供できないと思います。それは私が本当に今知っているすべてです。あなたがそれを使用する助けが必要な場合、または私があなたを助けるために他の方法を考えることができるかどうかを教えてください。私は間違いなくあなたが行っている結果を得る。キーは、頂点ごとの幅/高さの計算を「走査線」ごとに移動することです。私たちができることは、1ピクセルあたりの過不足ですが、それはGPUが提供するものです。 – Jessy

+1

あなたの答えをありがとう。これは私にとって完璧に機能しました! –

2

最近、どのタイプの四辺形についても、この問題の一般的な解決策を思いつきました。計算とGLSLはおそらく助けになるでしょう。 Javaで実用的なデモがあります(Android上で動作します)が、コンパクトで読みやすく、ユニティやiOSに簡単に移植できるはずです:http://www.bitlush.com/posts/arbitrary-quadrilaterals-in-opengl-es-2-0

+0

いいですが、私が探していたものではありません。最初の質問をよくお読みください。 3番目のクアッドのマッピングは、私が望むものではありません – velkyel

+0

はい、私の悪い、あなたにそれを必要とする綿を遠視矯正なしにしなかった – keith