2011-12-21 64 views
0

要紋理貼圖一個四下面的代碼工作:拉伸一個紋理在多個四邊形

glBegin(GL_QUADS); 
    glTexCoord2f(0,0) ; 
    glVertex3f(-1,-1,0); 

    glTexCoord2f(1,0); 
    glVertex3f( 1,-1,0); 

    glTexCoord2f(1,1); 
    glVertex3f( 1, 1,0); 

    glTexCoord2f(0,1); 
    glVertex3f(-1, 1,0); 
glEnd(); 

我的問題是,我怎麼能映射一個紋理以下多個四。 for循環創建由2個單元邊緣小四邊形做了10×10四,我想從1x1th四伸展我的紋理10x10th四:

void wall(int num) 
{ 
int wallx; 
int wally; 
for(wallx=0;wallx<num;wallx++) 
{ 
    for(wally=0;wally<num;wally++) 
    { 
    glPushMatrix(); 
     glBegin(GL_QUADS); 
     glVertex3f(-1 + wallx*2,-1+ wally*2,0);   
     glVertex3f( 1+ wallx*2,-1+ wally*2,0);    
     glVertex3f( 1+ wallx*2, 1+ wally*2,0);    
     glVertex3f( -1+ wallx*2, 1+ wally*2,0);   
      glEnd(); 
    glPopMatrix(); 
    } 
} 

}

+1

我的眼睛在欺騙我嗎? glBegin()和glEnd()?請不要使用它,它已被棄用。 – ScarletAmaranth 2011-12-21 23:07:55

+0

如何在不使用glBegin和glEnd的情況下做到這一點? – 2011-12-21 23:30:11

回答

0

如果你想一想,這只是爲每個四邊形指定正確的紋理座標。

float unitx = 1.0f/(float)num; 
float unity = 1.0f/(float)num; 
for(wallx=0;wallx<num;wallx++) 
{ 
    for(wally=0;wally<num;wally++) 
    { 
    glPushMatrix(); 
     glBegin(GL_QUADS); 
     glTexCoord2f(unitx * (float) wallx, unity * (float) wally); 
     glVertex3f(-1 + wallx*2,-1+ wally*2,0);  
     glTexCoord2f(unitx * (float) (wallx+1), unity * (float) wally); 
     glVertex3f( 1+ wallx*2,-1+ wally*2,0);    
     glTexCoord2f(unitx * (float) (wallx+1), unity * (float) (wally+1)); 
     glVertex3f( 1+ wallx*2, 1+ wally*2,0);    
     glTexCoord2f(unitx * (float) wallx, unity * (float) (wally+1)); 
     glVertex3f( -1+ wallx*2, 1+ wally*2,0);   
      glEnd(); 
    glPopMatrix(); 
    } 
} 
1

正如你可能會從你的第一個代碼告訴片段,紋理座標在0-1範圍內,所以0,0是一個拐角向1,1對角線相反。四邊形的單位大小無關緊要,紋理座標位於紋理空間中,而不是世界空間中。

因此,你只需要計算你的紋理座標爲1/n,其中n是你用來建立你的大四邊形的四邊形的數量。在這種情況下,第一個例子會有座標(0,0),(0,0.1),(0.1,0)和(0.1,0.1)。簡單地計算1/n,然後在你的循環中使用這個值來計算每個小四邊形的座標。如果你使用座標(0,0)在一個四邊形的一個角落,和(10,10)在對角相對的角落(在另外兩個正確的值),那麼你會得到你的紋理平鋪10倍四。