我对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();
我不确定是否只需要清除标志就可以了,但我已经被困了几天了。
答案 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 );