2013-05-05 39 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电话...