颜色干扰的问题解决了

昨天被纹理贴图的颜色干扰问题弄的很是郁闷,自己也知道OpenGL是个状态机,状态设定好后就一直是有效的,但就是想不明白后面设置的状态怎么会影响到前面呢?


csdn 上请教了高手后,终于知道问题改怎么解决了,只需要在绑定纹理前开启纹理,并且在使用完纹理后就关闭纹理,否则的话纹理就一直处于开启状态,所以会影响到不使用纹理贴图的那个物体的绘制,修改后代码如下:

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
int COpenGLDemoView::DrawGLScene()
{
// Here'sWhereWeDoAllTheDrawing

glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT); // ClearScreenAndDepthBuffer

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

glShadeModel(GL_SMOOTH);
glLoadIdentity();
// ResetTheCurrentModelviewMatrix
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 );
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,texture[
0 ]);

glBegin(GL_QUADS);
// 绘制正方形

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

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

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

// BottomFace
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 );
// Rightface
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 );
// LeftFace
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();
// 正方形绘制结束
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glPopAttrib();

glFlush();

return TRUE; // EverythingWentOK
}

最终效果如图所示:

200781001.jpg


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值