2012-01-21 102 views
4

我對OpenGL相當陌生,所以也許答案會很明顯。我目前正在嘗試使用C++中的GL_TRIANGLE_FAN創建一個藍色圓圈。我的問題是,當我使用glColor4f設置顏色時,它將我所有其他紋理設置爲藍色,如下所示(這應該是銀色金屬)。glColor着色所有紋理

我繪製使用以下所示的方法中的紋理。

glLoadIdentity(); 
glTranslatef(x,y,0); 

glBindTexture(GL_TEXTURE_2D, this->texture); 

glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0,0,0); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(width,0,0); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(width,height,0); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0,height,0); 
glEnd(); 

我不確定我是否必須清除標誌才能正常工作,但我現在一直被困住了幾天。

回答

5

解除綁定的質地和顏色設置回白色大功告成繪製後:

glLoadIdentity(); 
glTranslatef(x,y,0); 

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, this->texture); 

glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0,0,0); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(width,0,0); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(width,height,0); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0,height,0); 
glEnd(); 

glColor4f(1, 1, 1, 1); 
glBindTexture(GL_TEXTURE_2D, 0); 

而且如果你沒有下一個對象上渲染紋理,紋理禁用:

glDisable(GL_TEXTURE_2D); 
+0

它工作!藍色已從其他對象中移除(不幸的是,它看起來好像圓圈沒有繪製),但這與線程的最初問題相切。謝謝! – Silvae

+2

對不起,但「解除紋理」?這是我第一次聽到這樣的廢話 –

+1

在這裏一樣,unbinding沒有必要。只需使用'glDisable(GL_TEXTURE_2D)' – Rookie

0

在綁定紋理之前,您需要啓用它。通常情況下,當你完成它時你應該禁用它。事情是這樣的:

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, this->texture); 

glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0,0,0); 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(width,0,0); 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(width,height,0); 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0,height,0); 
glEnd(); 

glDisable(GL_TEXTURE_2D); 
+0

我添加了啓用/禁用,但它似乎沒有解決問題。 – Silvae

+0

@Silvae在這種情況下,問題接近其他地方(而不是您發佈的代碼)。你如何創建紋理? –

+0

如果需要(我通過SDL完成),我將發佈有關如何加載紋理的代碼。然而,在我做之前我有一個簡短的陳述。如果我從我的代碼中刪除了繪製藍色圓圈的方法(或者甚至只是刪除glColor4f),我就沒有任何紋理變藍的問題。我覺得這種行爲不會表明紋理加載不正確,但我可能是錯的。 – Silvae

7

繪製你的藍圈後,你應該使用glColor4f(1.f, 1.f, 1.f, 1.f);顏色設置回白色(默認值)。請注意,默認情況下,紋理會被當前設置的顏色(在您的案例中爲藍色)調製,這就是爲什麼您的銀色材料變成藍色色調(最終顏色=藍色*紋理顏色)的原因。

+0

感謝您的回答!有效。我會給你複選標記,除了羅伯特在你之前發佈的。我仍然給你一個+1! – Silvae

1

當您啓用glEnable(GL_COLOR_MATERIAL)並通過glColor更改顏色時,則所有紋理都將受此顏色的影響。這是因爲默認情況下紋理以調製模式顯示(glColor乘以紋理顏色)。

如果您沒有啓用照明,恢復原始紋理顏色很簡單 - 只需將glColor設置爲白色:glColor4f(1.0,1.0,1.0,1.0)。 問題出現時,您的紋理啓用了照明。然後,將顏色設置爲白色或將紋理模式更改爲REPLACE根本無濟於事 - 您的照明效果將被刪除! (這似乎沒有人注意到!)原因是因爲啓用GL_COLOR_MATERIAL默認情況下會得到行爲,其中glColor命令同時更改Ambient和Diffuse顏色 - 因此環境和漫反射材質屬性將受到影響(丟失)。因此,所有你需要做的,恢復材料的狀態(因而燈光效果),您將glEnable(GL_COLOR_MATERIAL)收到了,是這樣的:

glDisable(GL_COLOR_MATERIAL); //disable color influence 
GLfloat ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f }; //default material has this ambient color! 
GLfloat diffuse[] = { 0.8f ,0.8f ,0.8f, 1.0f }; //default material has this diffuse color! 
glMaterialfv(GL_FRONT, GL_AMBIENT, ambient); //restore default material ambient color 
glMaterialfv(GL_FRONT, GL_AMBIENT, diffuse); //restore default material diffuse color 

請注意,什麼是默認的環境和漫默認材質的顏色!那裏沒有純白色!

這樣,您從這一點使用的所有紋理將按預期繪製(具有正確的顏色和光照效果)。 花了我一些時間來找到這個東西,所以我想在這裏提到它很好。

+0

嗨!我仍然困惑。那麼上面的代碼應該在draw_object函數之前插入還是之後?謝謝! –