2014-07-08 28 views
1

我剛剛開始使用3D圖形編程,並且已經有了一個很好的封裝立方體對象。該類有一個render()方法,該方法繼續推送新矩陣,執行變換,指定所有頂點和紋理座標,並彈出矩陣。現在,我編寫了這個Cube類,其中包含在多維數據集的不同面上使用不同紋理的方法,但這不是在運行時發生的。我將紋理理解爲顏色,我可以通過在適當的頂點之前調用glColor來輕鬆更改每個立方體的每個面,但使用texture.bind()(來自slick-util庫)似乎什麼也不做。使用slick-util庫的LWJGL(OpenGL)中的紋理問題

這是我的渲染方法:

public void render(){ 
    glPushMatrix(); 

    top.bind(); 
    top.setTextureFilter(GL_NEAREST); 
    glColor4f(1, 1, 1, 0); 
    glTranslatef(x, y, z); 
    glRotatef(yaw, 0, 1, 0); 

    glBegin(GL_QUADS); 
    //Top 
    glTexCoord2f(0, 0); glVertex3f(0, size, 0); 
    glTexCoord2f(0, 1); glVertex3f(0, size, size); 
    glTexCoord2f(1, 1); glVertex3f(size, size, size); 
    glTexCoord2f(1, 0); glVertex3f(size, size, 0); 

    //Front 
    top.release(); 
    side.bind(); 
    glTexCoord2f(0, 0); glVertex3f(0, 0, 0); 
    glTexCoord2f(0, 1); glVertex3f(0, size, 0); 
    glTexCoord2f(1, 1); glVertex3f(size, size, 0); 
    glTexCoord2f(1, 0); glVertex3f(size, 0, 0); 

    //Left 
    glTexCoord2f(0, 0); glVertex3f(0, 0, size); 
    glTexCoord2f(0, 1); glVertex3f(0, size, size); 
    glTexCoord2f(1, 1); glVertex3f(0, size, 0); 
    glTexCoord2f(1, 0); glVertex3f(0, 0, 0); 

    //Right 
    glTexCoord2f(0, 0); glVertex3f(size, 0, size); 
    glTexCoord2f(0, 1); glVertex3f(size, size, size); 
    glTexCoord2f(1, 1); glVertex3f(size, size, 0); 
    glTexCoord2f(1, 0); glVertex3f(size, 0, 0); 

    //Back 
    glTexCoord2f(0, 0); glVertex3f(0, 0, size); 
    glTexCoord2f(0, 1); glVertex3f(0, size, size); 
    glTexCoord2f(1, 1); glVertex3f(size, size, size); 
    glTexCoord2f(1, 0); glVertex3f(size, 0, size); 

    //Bottom 
    side.release(); 
    bottom.bind(); 
    glTexCoord2f(0, 0); glVertex3f(0, 0, 0); 
    glTexCoord2f(0, 1); glVertex3f(0, 0, size); 
    glTexCoord2f(1, 1); glVertex3f(size, 0, size); 
    glTexCoord2f(1, 0); glVertex3f(size, 0, 0); 

    bottom.release(); 
    glEnd(); 
    glPopMatrix(); 
} 

變量topsidebottom是我希望把立方體的面上的紋理。

結果是立方體的每個面都具有「頂」紋理。

無論我是否撥打texture.release(),結果都是一樣的。

回答

4

您無法在glBegin()glEnd()之間綁定紋理。在glBegin()glEnd()(完整列表見https://www.opengl.org/sdk/docs/man2/xhtml/glBegin.xml)之間只能進行有限的GL呼叫,而glBindTexture()不是其中之一。

要結合不同的紋理每一面,你需要開始一個新的開始/結束對每方:

//Top 
top.bind(); 
glBegin(GL_QUADS); 
glTexCoord2f(0, 0); glVertex3f(0, size, 0); 
glTexCoord2f(0, 1); glVertex3f(0, size, size); 
glTexCoord2f(1, 1); glVertex3f(size, size, size); 
glTexCoord2f(1, 0); glVertex3f(size, size, 0); 
glEnd(); 

//Front 
side.bind(); 
glBegin(GL_QUADS); 
glTexCoord2f(0, 0); glVertex3f(0, 0, 0); 
... 
glEnd(); 

//Bottom 
bottom.bind(); 
glBegin(GL_QUADS); 
glTexCoord2f(0, 0); glVertex3f(0, 0, 0); 
... 
glEnd(); 
+0

,完美的工作,謝謝! –