2012-01-07 110 views
0

早先在我的項目中提出了一個問題,但它似乎在學習更多關於我對openGL的瞭解程度,而不是我目前所做的事情,但是無論如何回答我都會提供我的知識,所以謝謝提前!OpenGL多邊形渲染模式和紋理映射

好吧,目前我的車形狀是使用GL_LINE_LOOP繪製的,看起來像這樣。 car shape

我想映射到車身上的圖像看起來像這樣。 car picture

我知道我的造型圖片不是完美的,但我試圖把這張圖片放在我的線條中,這樣它至少給我對汽車造型的一些印象。我已經嘗試使用這個下面的代碼:

void drawBody(int textureindex) 
{ 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, textureLib[textureindex]); 

glBegin(GL_POLYGON); 

glTexCoord2f(0.0F, 0.0F); 
glVertex2f(-1.0f, 0.0f); 
glTexCoord2f(-0.97, 0.0); 
glVertex2f(-1.97f, 0.0f); 
//wheel arch begin. 
glTexCoord2f(-0.93, 0.3); 
glVertex2f(-1.93f, 0.3f); 
glTexCoord2f(-0.95, 0.4); 
glVertex2f(-1.95f, 0.4f); 
glTexCoord2f(-1.2, 0.6); 
glVertex2f(-2.2f, 0.6f); 
glTexCoord2f(-1.6, 0.6); 
glVertex2f(-2.6f, 0.6f); 
glTexCoord2f(-1.82, 0.4); 
glVertex2f(-2.82f, 0.4f); 
glTexCoord2f(-1.8, 0.3); 
glVertex2f(-2.8f, 0.3f); 
glTexCoord2f(-1.78, 0.0); 
glVertex2f(-2.78f, 0.0f); 
//end wheel arch. 
//Front of car. 
glTexCoord2f(-2.8, 0.0); 
glVertex2f(-3.8f, 0.0f); 
glTexCoord2f(-2.7, 0.2); 
glVertex2f(-3.7f, 0.2f); 
glTexCoord2f(-2.8, 0.4); 
glVertex2f(-3.8f, 0.4f); 
glTexCoord2f(-1.8, 0.7); 
glVertex2f(-2.8f, 0.7f); 
glTexCoord2f(-1.4, 0.7); 
glVertex2f(-2.4f, 0.7f); 
//Windscreen. 
glTexCoord2f(0.0, 1.0); 
glVertex2f(-1.0f, 1.0f); 
glTexCoord2f(1.5, 1.05); 
glVertex2f(0.5f, 1.05f); 
glTexCoord2f(3.3, 0.8); 
glVertex2f(2.3f, 0.8f); 
//rear bumper. 
glTexCoord2f(3.15, 0.5); 
glVertex2f(2.15f, 0.5f); 
glTexCoord2f(3.15, 0.3); 
glVertex2f(2.15f, 0.3f); 
glTexCoord2f(3.35, 0.3); 
glVertex2f(2.35f, 0.3f); 
glTexCoord2f(3.0, 0.0); 
glVertex2f(2.0f, 0.0f); 
glTexCoord2f(2.83, 0.0); 
glVertex2f(1.83f, 0.0f); 
//wheel arch begin. 
glTexCoord2f(2.85, 0.3); 
glVertex2f(1.85f, 0.3f); 
glTexCoord2f(2.86, 0.4); 
glVertex2f(1.86f, 0.4f); 
glTexCoord2f(2.6, 0.6); 
glVertex2f(1.6f, 0.6f); 
glTexCoord2f(2.2, 0.6); 
glVertex2f(1.2f, 0.6f); 
glTexCoord2f(2.0, 0.4); 
glVertex2f(1.0f, 0.4f); 
glTexCoord2f(2.0, 0.3); 
glVertex2f(1.0f, 0.3f); 
glTexCoord2f(2.05, 0.0); 
glVertex2f(1.05f, 0.0f); 
//end wheel arch. 
glEnd(); 
glDisable(GL_TEXTURE_2D); 
} 

導致該awfullness

awful car

兩個問題。一個是cleary我的紋理coords是真的錯,其次我不知道如何停止多邊形模式擺脫輪拱:/幫助在這兩個方面將不勝感激:)

回答

4

紋理座標應在範圍[0,1]。

輪拱問題是因爲OpenGL只渲染凸多邊形。使用tessellation facilities將凹多邊形轉換爲三角形網格。

PS:對於OpenGL的直接模式,我建議你採用不同的編碼風格,是極大地更容易閱讀和維護:

void drawBody(int textureindex) 
{ 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, textureLib[textureindex]); 

    glBegin(GL_POLYGON); 

    glTexCoord2f(0.0 , 0.0); glVertex2f(-1.0 , 0.0); 
    glTexCoord2f(-0.97, 0.0); glVertex2f(-1.97, 0.0); 

    // Wheel arch 
    glTexCoord2f(-0.93, 0.3); glVertex2f(-1.93, 0.3); 
    glTexCoord2f(-0.95, 0.4); glVertex2f(-1.95, 0.4); 
    glTexCoord2f(-1.2 , 0.6); glVertex2f(-2.2 , 0.6); 
    glTexCoord2f(-1.6 , 0.6); glVertex2f(-2.6 , 0.6); 
    glTexCoord2f(-1.82, 0.4); glVertex2f(-2.82, 0.4); 
    glTexCoord2f(-1.8 , 0.3); glVertex2f(-2.8 , 0.3); 
    glTexCoord2f(-1.78, 0.0); glVertex2f(-2.78, 0.0); 

    // Front of car 
    glTexCoord2f(-2.8 , 0.0); glVertex2f(-3.8 , 0.0); 
    glTexCoord2f(-2.7 , 0.2); glVertex2f(-3.7 , 0.2); 
    glTexCoord2f(-2.8 , 0.4); glVertex2f(-3.8 , 0.4); 
    glTexCoord2f(-1.8 , 0.7); glVertex2f(-2.8 , 0.7); 
    glTexCoord2f(-1.4 , 0.7); glVertex2f(-2.4 , 0.7); 

    // Windscreen 
    glTexCoord2f(0.0 , 1.0); glVertex2f(-1.0 , 1.0); 
    glTexCoord2f(1.5 , 1.05); glVertex2f(0.5 , 1.05); 
    glTexCoord2f(3.3 , 0.8); glVertex2f(2.3 , 0.8); 

    // Rear bumper 
    glTexCoord2f(3.15, 0.5); glVertex2f(2.15, 0.5); 
    glTexCoord2f(3.15, 0.3); glVertex2f(2.15, 0.3); 
    glTexCoord2f(3.35, 0.3); glVertex2f(2.35, 0.3); 
    glTexCoord2f(3.0 , 0.0); glVertex2f(2.0 , 0.0); 
    glTexCoord2f(2.83, 0.0); glVertex2f(1.83, 0.0); 

    // Wheel arch 
    glTexCoord2f(2.85, 0.3); glVertex2f(1.85, 0.3); 
    glTexCoord2f(2.86, 0.4); glVertex2f(1.86, 0.4); 
    glTexCoord2f(2.6 , 0.6); glVertex2f(1.6 , 0.6); 
    glTexCoord2f(2.2 , 0.6); glVertex2f(1.2 , 0.6); 
    glTexCoord2f(2.0 , 0.4); glVertex2f(1.0 , 0.4); 
    glTexCoord2f(2.0 , 0.3); glVertex2f(1.0 , 0.3); 
    glTexCoord2f(2.05, 0.0); glVertex2f(1.05, 0.0); 

    glEnd(); 
    glDisable(GL_TEXTURE_2D); 
} 
+0

以及我不明白現在的最後一位如此虐待做一點閱讀但至於第一點我已經改變了所有我的座標在0到1的範圍內,它仍然有點有趣,即時通訊假設我匹配錯誤的紋理座標與形狀:( – 2012-01-07 02:36:30

+0

我做了一個錯字;我的意思是,「...轉換凹多邊形...」沒有看到有趣的形狀,我只能猜測:也許這是因爲紋理車的輪廓與多邊形並不完全對齊 – 2012-01-07 03:06:16

+0

它將圖像擠壓到形狀的後半部分,然後廣告將圖像的一點點放在前面的白色空間中:/ http://i378.photobucket.com/albums/oo230/tcc_hellgate/carnew.png – 2012-01-07 10:45:55