2011-11-08 114 views
1

我正在渲染一個棋盤,使用2種不同的紋理。一個用於黑色方塊,一個用於白色方塊。然而,不是每個不同的正方形都擁有自己的紋理,它們都採用最後一個我稱爲glBindTexture(GL_TEXTURE_2D, id);的紋理。我使用glBindTexture有什麼問題?

這是我的方法:

glEnable(GL_TEXTURE_2D);  
glBegin(GL_QUADS); 
    // square 0, 0 (front left) 
    glBindTexture(GL_TEXTURE_2D, textureBlackSquare->texID); 
    glNormal3f(0, 1, 0); 
    glTexCoord2f(0, 0); glVertex3f(-8.0, 0.5, 8.0); 
    glTexCoord2f(1, 0); glVertex3f(-6.0, 0.5, 8.0); 
    glTexCoord2f(1, 1); glVertex3f(-6.0, 0.5, 6.0); 
    glTexCoord2f(0, 1); glVertex3f(-8.0, 0.5, 6.0); 
glEnd(); 

glBegin(GL_QUADS); 
    // square 1, 0   
    glBindTexture(GL_TEXTURE_2D, textureWhiteSquare->texID); 
    glTexCoord2f(0, 0); glVertex3f(-6.0, 0.5, 8.0); 
    glTexCoord2f(1, 0); glVertex3f(-4.0, 0.5, 8.0); 
    glTexCoord2f(1, 1); glVertex3f(-4.0, 0.5, 6.0); 
    glTexCoord2f(0, 1); glVertex3f(-6.0, 0.5, 6.0); 
glEnd(); 

當我運行這段代碼,無論四邊形有白色紋理約束。我如何讓每個四元組擁有自己的紋理?

+0

請詳細說明您的問題標題。目前沒有其他人會認識到你的問題,這是一個_community_不是一次性支持網站。 –

+0

我再次抱歉,我不確定要爲我的標題放什麼,我希望我的問題是一個簡單的解決方案,可以用一兩句話來解釋。當你不確定問題出在哪裏時,很難預測問題的範圍。 – mikestaub

回答

10

您不能在glBegin/End中間撥打glBindTexture。您只能在開始/結束時調用頂點函數。另外,你爲什麼不把單個紋理作爲一個8x8棋盤,然後渲染一個四邊形來繪製整個棋盤呢?

+0

我想分別將紋理綁定到每個方塊,因爲我的程序實際上是交互式的,紋理需要爲每個方塊動態更新。 – mikestaub

3

the documentation:如果glBindTexture是 之間執行的glBegin的執行和glEnd對應的執行

GL_INVALID_OPERATION被生成。

您忘記檢查錯誤,從而錯過了您的程序無效。

+2

**注意:**我花了1分14秒的時間通過谷歌搜索「glBindTexture」查找該手冊頁,並找到了解釋代碼無法正常工作的原因,然後將其寫入此處。 –

+0

我的錯誤,我甚至沒有意識到GL_INVALID_OPERATION,所以我不知道檢查它。該程序執行得很好,並綁定紋理,只是不按我預期的順序。這讓我覺得這是微不足道的,我不瞭解紋理。 – mikestaub

+1

@pixelpusher:...總是在文檔中查看它的最佳時間! –

2

您無法在glBegin-glEnd塊中綁定紋理。此外,您應該儘可能避免切換紋理,因爲切換紋理是您可以要求GPU執行的最昂貴的事情之一(紋理切換會使所有紋素拾取緩存失效)。

取而代之,您可以使用它們使用的紋理對場景對象進行排序,然後按此組合它們。所以你首先使用第一個紋理(比如白色)渲染所有棋盤四邊形,然後使用第二個紋理渲染所有四邊形(然後是黑色)。