首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

OpenGL中进行纹理贴图出现颜色干扰的有关问题,请

2012-02-06 
OpenGL中进行纹理贴图出现颜色干扰的问题,请高手指点今天发现了一个奇怪的现象:如果我要画两个物体,第一个

OpenGL中进行纹理贴图出现颜色干扰的问题,请高手指点
今天发现了一个奇怪的现象:如果我要画两个物体,第一个不用纹理贴图,而第2个要纹理贴图,就发现第一个的颜色会干扰到纹理贴图的,结果两个物体的颜色都变得很怪了,怎么能让画完第一个物体后,它的颜色不对第2个产生影响呢?
我现在的代码如下,第一个画三菱锥(不用纹理贴图,只用平滑着色),第二个画一个正方体并用纹理贴图:

int   COpenGLDemoView::DrawGLScene()                                                                      
{//   Here 's   Where   We   Do   All   The   Drawing

        glClear(GL_COLOR_BUFFER_BIT   |   GL_DEPTH_BUFFER_BIT);         //   Clear   Screen   And   Depth   Buffer

glPushAttrib(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_CURRENT_BIT);
glPushMatrix();

glShadeModel(GL_SMOOTH);
        glLoadIdentity();                                                                         //   Reset   The   Current   Modelview   Matrix
glTranslatef(-1.5f,0.0f,-6.0f);//物体左移1.5,向内移6,相当于移动镜头一样,让物体进入镜头中
glRotatef(rTri,0.0f,1.0f,0.0f);
glBegin(GL_TRIANGLES);//   绘制三角形
glColor3f(1.0f,0.0f,0.0f);//   红色
glVertex3f(   0.0f,   1.0f,   0.0f);//   三角形的上顶点   (前侧面)
glColor3f(0.0f,1.0f,0.0f);//   绿色
glVertex3f(-1.0f,-1.0f,   1.0f);//   三角形的左下顶点   (前侧面)
glColor3f(0.0f,0.0f,1.0f);//   蓝色
glVertex3f(   1.0f,-1.0f,   1.0f);//   三角形的右下顶点   (前侧面)
glColor3f(1.0f,0.0f,0.0f);//   红色
glVertex3f(   0.0f,   1.0f,   0.0f);//   三角形的上顶点   (右侧面)
glColor3f(0.0f,0.0f,1.0f);//   蓝色
glVertex3f(   1.0f,-1.0f,   1.0f);//   三角形的左下顶点   (右侧面)
glColor3f(0.0f,1.0f,0.0f);//   绿色
glVertex3f(   1.0f,-1.0f,   -1.0f);//   三角形的右下顶点   (右侧面)
glColor3f(1.0f,0.0f,0.0f);//   红色
glVertex3f(   0.0f,   1.0f,   0.0f);//   三角形的上顶点   (后侧面)
glColor3f(0.0f,1.0f,0.0f);//   绿色
glVertex3f(   1.0f,-1.0f,   -1.0f);//   三角形的左下顶点   (后侧面)
glColor3f(0.0f,0.0f,1.0f);//   蓝色
glVertex3f(-1.0f,-1.0f,   -1.0f);//   三角形的右下顶点   (后侧面)
glColor3f(1.0f,0.0f,0.0f);//   红色
glVertex3f(   0.0f,   1.0f,   0.0f);//   三角形的上顶点   (左侧面)
glColor3f(0.0f,0.0f,1.0f);//   蓝色
glVertex3f(-1.0f,-1.0f,-1.0f);//   三角形的左下顶点   (左侧面)
glColor3f(0.0f,1.0f,0.0f);//   绿色
glVertex3f(-1.0f,-1.0f,   1.0f);//   三角形的右下顶点   (左侧面
glEnd();//   三角形绘制结束

glPopMatrix();
glPopAttrib();


glPushAttrib(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_CURRENT_BIT);
glPushMatrix();

glLoadIdentity();
glTranslatef(1.5f,0.0f,-6.0f);

glRotatef(xrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glRotatef(zrot,0.0f,0.0f,1.0f);
glBindTexture(GL_TEXTURE_2D,   texture[0]);
glBegin(GL_QUADS);//     绘制正方形

//   Front   Face
glNormal3f(   0.0f,   0.0f,   1.0f);//   法线指向观察者
glTexCoord2f(0.0f,   0.0f);   glVertex3f(-1.0f,   -1.0f,     1.0f);
glTexCoord2f(1.0f,   0.0f);   glVertex3f(   1.0f,   -1.0f,     1.0f);


glTexCoord2f(1.0f,   1.0f);   glVertex3f(   1.0f,     1.0f,     1.0f);
glTexCoord2f(0.0f,   1.0f);   glVertex3f(-1.0f,     1.0f,     1.0f);

//   Back   Face
glNormal3f(   0.0f,   0.0f,-1.0f);//   法线背向观察者
glTexCoord2f(1.0f,   0.0f);   glVertex3f(-1.0f,   -1.0f,   -1.0f);
glTexCoord2f(1.0f,   1.0f);   glVertex3f(-1.0f,     1.0f,   -1.0f);
glTexCoord2f(0.0f,   1.0f);   glVertex3f(   1.0f,     1.0f,   -1.0f);
glTexCoord2f(0.0f,   0.0f);   glVertex3f(   1.0f,   -1.0f,   -1.0f);

//   Top   Face
glNormal3f(   0.0f,   1.0f,   0.0f);//   法线向上
glTexCoord2f(0.0f,   1.0f);   glVertex3f(-1.0f,     1.0f,   -1.0f);
glTexCoord2f(0.0f,   0.0f);   glVertex3f(-1.0f,     1.0f,     1.0f);
glTexCoord2f(1.0f,   0.0f);   glVertex3f(   1.0f,     1.0f,     1.0f);
glTexCoord2f(1.0f,   1.0f);   glVertex3f(   1.0f,     1.0f,   -1.0f);

//   Bottom   Face
glNormal3f(   0.0f,-1.0f,   0.0f);//   法线朝下
glTexCoord2f(1.0f,   1.0f);   glVertex3f(-1.0f,   -1.0f,   -1.0f);
glTexCoord2f(0.0f,   1.0f);   glVertex3f(   1.0f,   -1.0f,   -1.0f);
glTexCoord2f(0.0f,   0.0f);   glVertex3f(   1.0f,   -1.0f,     1.0f);
glTexCoord2f(1.0f,   0.0f);   glVertex3f(-1.0f,   -1.0f,     1.0f);
//   Right   face
glNormal3f(   1.0f,   0.0f,   0.0f);//   法线朝右
glTexCoord2f(1.0f,   0.0f);   glVertex3f(   1.0f,   -1.0f,   -1.0f);
glTexCoord2f(1.0f,   1.0f);   glVertex3f(   1.0f,     1.0f,   -1.0f);
glTexCoord2f(0.0f,   1.0f);   glVertex3f(   1.0f,     1.0f,     1.0f);
glTexCoord2f(0.0f,   0.0f);   glVertex3f(   1.0f,   -1.0f,     1.0f);
//   Left   Face
glNormal3f(-1.0f,   0.0f,   0.0f);//   法线朝左
glTexCoord2f(0.0f,   0.0f);   glVertex3f(-1.0f,   -1.0f,   -1.0f);
glTexCoord2f(1.0f,   0.0f);   glVertex3f(-1.0f,   -1.0f,     1.0f);
glTexCoord2f(1.0f,   1.0f);   glVertex3f(-1.0f,     1.0f,     1.0f);
glTexCoord2f(0.0f,   1.0f);   glVertex3f(-1.0f,     1.0f,   -1.0f);
glEnd();//   正方形绘制结束

glPopMatrix();
glPopAttrib();

glFlush();

        return   TRUE;                                                                                 //   Everything   Went   OK
}

结果第2个正方体正常地画出来并且贴好纹理了,没有受到干扰,但第一个被干扰了,并且颜色变的很奇怪。

如果上面描述不够清楚的话,我具体的情况和工程源代码放在这篇blog里面,请高手指点下我,http://www.cnblogs.com/phinecos/archive/2007/08/09/849277.html,谢谢了,问题一解决,立马给分。。。

[解决办法]
glBindTexture(GL_TEXTURE_2D, texture[0]);
在这句前要用glEnable(GL_TEXTURE_2D)
结束后glDisable(GL_TEXTURE_2D)


记住,opengl是状态机,状态一开,不关闭前一直有效的。

热点排行