2013-05-05 50 views
0

我在使用opengl渲染紋理時遇到了一些麻煩。首先渲染我的紋理,然後渲染一個正方形。要將我的廣場的顏色設置爲0,請使用glColor3f(1.0f,0.0f,0.0f);這會使方形變成紅色。但是當我的紋理再次被渲染時,它也被渲染成紅色。紋理獲取錯誤的顏色

這裏有什麼問題?

回答

4

當您撥打glColor時,您將爲所有未來繪圖調用設置恆定顏色。如果你想讓它恢復到開始時的狀態,你必須在繪製廣場後明確地重新設置它。

通常(取決於紋理環境)頂點的顏色和穩定的色彩被頂點着色期間被組合,然後內插,後來乘以針對在片段着色的紋理像素的顏色。

如果您使用glColor3f(1,0,0),則最終會將紋理的紅色通道乘以1.0,並將綠色和藍色通道乘以0.0--這樣您將只能得到紋理的紅色通道。

您需要將常量顏色重置爲1,1,1以查看常規紋理顏色。

一般而言,您需要提前設置所有常見gl狀態,然後在繪製需要非常規變化的任何內容後「返回」該狀態。這有時稱爲「零狀態」。您還會注意到,很多性能優化文獻認爲配料的東西放在一起有類似的罕見非零狀態的需求 - 這取決於顯卡驅動程序,硬件等

1

這裏的「問題」是(a)默認情況下,opengl使用GL_MODULATE texenv模式,因此片段的顏色乘以紋理的顏色以產生最終顏色,(b)openGL是一個狀態機,所以只要您設置其他顏色,顏色就會保持不變。

請注意,使用光照時,GL_MODULATE對於將光照計算結果與紋理顏色相結合非常有用。

如果你只想紋理原樣,你既可以繪製紋理對象之前指定一個白色的顏色,我們用另一個紋理enivronment模式像GL_REPLACE:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

看一看的manpage of glTexEnv爲該功能的說明以及可用的模式和選項。

+0

我喜歡這個比我的回答更好。爲你+1! – leander 2013-05-05 18:42:12

+0

@leander:呵呵,我剛剛提出了你的答案,因爲我覺得它回答了和我一樣好的問題。 – derhass 2013-05-05 18:45:05

+0

:提示帽子:謝謝親切=) – leander 2013-05-05 18:55:51

0

這可能會或可能不會有效果如果只想繪製紋理(甚至是亮度),則在繪製紋理之前,如果只想繪製紋理,則不需要使用白色。你只在繪製函數頂點之前剛剛指定coordenates,像這樣的例子:

 
void dibujarTexturaIluminacionPlana(GLuint texName){

glShadeModel(GL_FLAT); //Flat model ilumination glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texName); glBegin(GL_TRIANGLES); for(int i=0; i<caras.size(); i++){ glNormal3f(normales[i].x, normales[i].y, normales[i].z); glTexCoord2f(cTs[caras[i]._0].x, cTs[caras[i]._0].y); glVertex3f(vertices[caras[i]._0].x, vertices[caras[i]._0].y ,vertices[caras[i]._0].z); glTexCoord2f(cTs[caras[i]._1].x, cTs[caras[i]._1].y); glVertex3f(vertices[caras[i]._1].x, vertices[caras[i]._1].y ,vertices[caras[i]._1].z); glTexCoord2f(cTs[caras[i]._2].x, cTs[caras[i]._2].y); glVertex3f(vertices[caras[i]._2].x, vertices[caras[i]._2].y ,vertices[caras[i]._2].z); } glEnd(); glFlush(); glDisable(GL_TEXTURE_2D); }

Wherein caras is "faces", normales is "normal" and vertices is "vertex".

So, if you want draw the texture, only you call the function.

glEnable(GL_LIGHTING); figuraPerfilCompleto.dibujarTexturaIluminacionPlana2(texturas[0]); glDisable(GL_LIGHTING);

是不是要glTexEnv necesary電話...