2011-05-18 99 views
2

我總得有類似這樣的帖子一個問題: glTexGen in OpenGL ES 2.0問題glTexGen中的Open GL ES 2.0

我擡頭網站一對夫婦的其他網站上沒有找到如何解決我的問題。

基本上,我想在建立正交投影后將紋理映射到2D四邊形上。我的問題是,紋理被扭曲,你可以在這張照片,我用的彩色圖案,而不是一個質地看:

enter image description here

我想紋理的線條留直上四,但正如你所看到的,他們是扭曲的。我想我應該修改頂點着色器爲了紋理座標來映射四邊形,但我不知道如何。

非常感謝, 吉姆

回答

1

你需要的是一個不同類型的插值(我相信這將是二次插值),因爲在這種情況下(在太空邊緣長度不與紋理邊長對應),線性插值不會削減它。

不幸的是,在OpenGL中執行任務非常複雜(儘管使用軟件光柵化非常簡單)。您正試圖在屏幕空間中找到任意四邊形的變換到紋理空間中的單位正方形上。你可以在這裏找到你的問題的完整解決方案:http://alumni.media.mit.edu/~cwren/interpolator/這會得到一個矩陣,你需要乘以屏幕空間座標來獲得正確的紋理座標(在片段着色器中)。因爲這涉及相當討厭的數學,我會建議一個簡單的解決方案,實際上適用於簡單的靜態案例(需要手動調整)。在頂點着色器中計算的紋理座標實際上只在中心邊緣關閉,其餘都是正確的。假設你的texcoords是(0,0),(1,0),(1,1)和(0,1),修正係數爲:

u * v // for the first triangle 
(1 - u) * (1 - v) // for the second triangle 

你需要估計的修正向量,然後把它放在一起。我用一個簡單的C++的OpenGL應用程序測試,我得出如下:

Vector2f ta(0, 1), tb(1, 1), tc(1, 0), td(0, 0); 
Vector2f a(-.1f, 1), b(1, .7f), c(1, .1f), d(0, 0); 
// quad texcoords and vertices 

Vector2f t_corr(-.01f, .5f); 
// correction for the above quad 

glBegin(GL_TRIANGLES); 
glMultiTexCoord2f(GL_TEXTURE1, 1, -1); // first triangle 
glTexCoord4f(ta.x, ta.y, t_corr.x, t_corr.y); 
glVertex2f(a.x, a.y); 
glTexCoord4f(tb.x, tb.y, t_corr.x, t_corr.y); 
glVertex2f(b.x, b.y); 
glTexCoord4f(tc.x, tc.y, t_corr.x, t_corr.y); 
glVertex2f(c.x, c.y); 

glMultiTexCoord2f(GL_TEXTURE1, 0, 1); // second triangle 
glTexCoord4f(ta.x, ta.y, t_corr.x, t_corr.y); 
glVertex2f(a.x, a.y); 
glTexCoord4f(tc.x, tc.y, t_corr.x, t_corr.y); 
glVertex2f(c.x, c.y); 
glTexCoord4f(td.x, td.y, t_corr.x, t_corr.y); 
glVertex2f(d.x, d.y); 
glEnd(); 

和頂點着色器看起來是這樣的:

void main() 
{ 
    gl_Position = ftransform(); 
    gl_FrontColor = gl_Color; 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
    gl_TexCoord[1] = gl_MultiTexCoord1; // just copy coords, nothing else to do 
} 

片段着色器:

uniform sampler2D sam; 
void main() 
{ 
    vec2 corr = vec2(gl_TexCoord[1].x + gl_TexCoord[1].y * gl_TexCoord[0].x, 
        gl_TexCoord[1].x + gl_TexCoord[1].y * gl_TexCoord[0].y); 
    gl_FragColor = texture2D(sam, gl_TexCoord[0].xy + gl_TexCoord[0].zw * corr.x * corr.y); 
} 

這是非常簡單的,但通過適當地調整校正矢量,可以使其成爲:http://www.luki.webzdarma.cz/up/deskew.png

另一種選擇是在3D中使用真正的四邊形進行此操作,並將其手動旋轉至如此的位置以使其看起來像您的2D四邊形。或爲您的四邊形設計「深度」紋理座標,在頂點着色器中計算1 /深度,插入(u /深度,v /深度,1 /深度),然後在片段着色器中用插值1 /深度除以得到好的值。雖然這看起來很簡單,但請注意,想出良好的深度值是非常困難的。

+0

感謝您有關如何獲得預期結果的非常詳細的答案。 – JimN 2012-01-23 08:33:26