OpenGL中进行纹理贴图出现颜色干扰的问题,请高手指点

phinecos 2007-08-09 07:33:01
今天发现了一个奇怪的现象:如果我要画两个物体,第一个不用纹理贴图,而第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,谢谢了,问题一解决,立马给分。。。
...全文
1286 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
budingningmeng 2012-07-30
  • 打赏
  • 举报
回复
但是我又遇到类似的问题,我将背景换成带星星(白色)的黑色背景的话,那么我画的物体都变成黑色的了,而不是原来我按平滑着色方式显示的红色哦,怎么解决哦?
(这里背景的设置我是利用一张纹理贴图(带星星的黑色图片),贴在一个矩形上,然后设置在我屏幕方向上的(正对着我的方向),从而看上去像是夜空的背景。)
谢谢~也不知道我说清楚没哦~~~
budingningmeng 2012-07-30
  • 打赏
  • 举报
回复
谢谢~刚才也遇到相同的问题~
maso2 2012-01-31
  • 打赏
  • 举报
回复
higter(川湘菜)
必须要谢谢
新手不懂,折腾好半天
s_jfdeng 2007-12-02
  • 打赏
  • 举报
回复
我也遇到这种问题,现在明白啦,谢谢各位达人
phinecos 2007-08-10
  • 打赏
  • 举报
回复
higter(川湘菜) ,多谢你了,帮我把问题解决了
higter 2007-08-10
  • 打赏
  • 举报
回复
glColor3f这句也一样
用纹理贴图前最后用glColor3f(1,1,1);
以免前用过颜色影响后面的。
higter 2007-08-10
  • 打赏
  • 举报
回复 4
glBindTexture(GL_TEXTURE_2D, texture[0]);
在这句前要用 glEnable(GL_TEXTURE_2D)
结束后 glDisable(GL_TEXTURE_2D)


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

679

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧