2013-02-02 97 views
0

我在我的遊戲中有一個地板,由100x100四邊形組成。我不能只用1個方塊來做,因爲這會毀了照明。這就是問題所在 - 我如何在它們上面放置一個紋理? 該代碼將紋理放在每個四邊形上,但它不是我想要的效果。OpenGL - 我該如何映射紋理?

glBegin(GL_QUADS); 
glNormal3f(0,0,1); 

for(float j = 0; j < 1; j+=0.01) 
{  
     for(float i = 0; i < 1; i+=0.01) 
    {   
     glTexCoord2f(0.0,0.0); glVertex2f(i,j+0.01); 
     glTexCoord2f(1.0,0.0); glVertex2f(i,j); 
     glTexCoord2f(1.0,1.0); glVertex2f(i+0.01,j); 
     glTexCoord2f(0.0,1.0); glVertex2f(i+0.01,j+0.01); 
    } 

} 
glEnd(); 
glPopMatrix(); 
+0

照明將正常工作,如果你拋棄了舊的固定功能GL接口以及所使用的可編程管線。 – JasonD

回答

0

快速和骯髒的解決方案可以使用相同的值,紋理座標作爲地板:

glTexCoord2f(i, j+0.01);  glVertex2f(i, j+0.01); 
glTexCoord2f(i, j);   glVertex2f(i, j); 
glTexCoord2f(i+0.01, j);  glVertex2f(i+0.01, j); 
glTexCoord2f(i+0.01, j+0.01); glVertex2f(i+0.01, j+0.01); 
0

嗯,它看起來像你正在使用OpenGL的舊版本,以便您可能沒有提供給您,但使用自定義片段着色器可以解決您的問題。這是我會做的。 但我認爲你正在尋找的是你只需要插入紫外線的座標。 例如,如果你有4個方格,而不是

0.0f,0.0f 
1.0f,0.0f 
1.0f,1.0f 
0.0f,1.0f 

,首先應該是

0.0f,0.0f 
.5f,0.0f 
.5f,.5f 
.0f,.5f 

我還要去整數您的for循環更可預測的行爲,但與你有什麼你可以調整你計算頂點位置到指數的方式。

glTexCoord2f(i,j); glVertex2f(i,j+0.01); 
    glTexCoord2f(i+.01,j); glVertex2f(i,j); 
    glTexCoord2f(i+.01,j+.01); glVertex2f(i+0.01,j); 
    glTexCoord2f(i,j+.01); glVertex2f(i+0.01,j+0.01); 

請注意tex座標的順序。

-1

我不能這樣做只是與1四,因爲它會毀了照明。

這是每個像素照明都是關於什麼。每頂點照明只在頂點評估照明顏色,並在整個三角形內插,當三角形相對於它與光線的距離相當大時(如在地板情況下),效果不佳。如果您使用每像素照明,則必須編寫自己的片段着色器,但是無論光線多麼近或遠,您都可以在整個地板上只使用一個四邊形,並且照明將是正確的。

參見:http://www.swiftless.com/tutorials/glsl/5_lighting_perpixel.htmlhttp://en.wikipedia.org/wiki/Per-pixel_lighting

+0

-1:有用的信息,但不能解決實際問題。 –

+0

@NicolBolas:我認爲「指出一個更好的解決問題的辦法」有助於解決問題。但那只是我而已? – sheu

+0

但它不解決實際問題;它*隱藏*它。他仍然不知道如何使紋理工作正確;你的方法只會讓他隱藏他的無知。畢竟,有理由對這樣的一個表面使用多個多邊形,而不僅僅是照明。作爲評論,你的答案會更好。 –