我在使用opengl渲染纹理时遇到了一些麻烦。首先我渲染我的纹理,然后渲染一个正方形。要设置我的方块颜色,我使用glColor3f(1.0f,0.0f,0.0f);
这使方块变红。但是当我的纹理再次渲染时,它也会呈现红色。
这里有什么问题?
答案 0 :(得分:4)
当您致电glColor
时,您将为所有未来的绘制调用设置常量颜色 。如果你希望它回到你开始时的状态,你必须在绘制正方形后明确地将其设置回来。
通常(取决于纹理环境)顶点颜色和常量颜色在顶点着色期间组合,然后进行插值,然后在片段着色中与纹素颜色相乘。
如果你使用glColor3f(1,0,0)
,你最终会将纹理的红色通道乘以1.0,将绿色和蓝色通道乘以0.0 - 这样你就只得到纹理的红色通道。
您需要将常量颜色重置为1,1,1以查看常规纹理颜色。
一般来说,你需要提前设置所有常见的gl状态,然后在绘制需要不常见更改的任何内容后“返回”到该状态。这有时被称为“零状态”。您还会注意到许多性能调整文献建议将具有类似不常见的非零状态需求的事物一起批处理 - 这可能会也可能不会产生影响,具体取决于图形驱动程序,硬件等。
答案 1 :(得分:1)
这里的“问题”是(a)默认情况下,opengl使用GL_MODULATE texenv模式,因此片段的颜色乘以纹理的颜色以产生最终颜色,(b)openGL是状态机,所以只要你设置其他颜色,红色就会保持不变。
请注意,使用光照时,GL_MODULATE对于将光照计算的结果与纹理颜色组合非常有用。
如果您只想要纹理,可以在绘制纹理对象之前指定白色,我们使用另一种纹理环境模式,如GL_REPLACE:
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
请查看manpage of glTexEnv以获取该功能的说明以及可用的模式和选项。
答案 2 :(得分: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 ......