glColor着色所有纹理

时间:2012-01-21 21:13:50

标签: c++ opengl textures

我对OpenGL相当新,所以答案可能很明显。我目前正在尝试使用C ++中的GL_TRIANGLE_FAN创建一个蓝色圆圈。我的问题是,当我使用glColor4f设置颜色时,它会将我所有的其他纹理设置为在其上面具有蓝色,如下所示(这应该是银色金属)。

我使用下面显示的方法绘制纹理。

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();

我不确定是否只需要清除标志就可以了,但我已经被困了几天了。

4 个答案:

答案 0 :(得分:7)

取消绑定纹理并在完成绘制后将颜色设置为白色:

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 );

答案 1 :(得分:7)

绘制蓝色圆圈后,应使用glColor4f(1.f, 1.f, 1.f, 1.f);将颜色设置为白色(默认值)。请注意,默认情况下,纹理会被当前设置的颜色调整(在您的情况下为蓝色),这就是为什么您的银色材质会变成蓝色调(最终颜色=蓝色*纹理颜色)的原因。

答案 2 :(得分:1)

当您启用glEnable(GL_COLOR_MATERIAL)并通过glColor更改颜色时,所有纹理都将受此颜色的影响。这是因为默认情况下,纹理以调制模式显示(glColor乘以纹理颜色)。

如果你没有启用光照,恢复原始纹理颜色很简单 - 只需将glColor设置为白色:glColor4f(1.0,1.0,1.0,1.0)。 当您在纹理上启用了光照时,问题就出现了。然后,将颜色设置为白色或将纹理模式更改为REPLACE根本没有用 - 您的灯光效果将被删除! (似乎没有人注意到!)原因是因为默认情况下启用GL_COLOR_MATERIAL会导致行为,其中glColor命令同时更改环境颜色和漫反射颜色 - 因此环境和漫反射材质属性将受到影响(丢失)。因此,在应用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

请注意,默认材质的默认环境和漫反射颜色是什么!那里没有纯白色!

这样,您在此点使用的所有纹理都将按预期绘制(具有正确的颜色和光照效果)。 花了我一些时间来找到这些东西,所以我想在这里提一下很好。

答案 3 :(得分: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 );