昨天被纹理贴图的颜色干扰问题弄的很是郁闷,自己也知道OpenGL是个状态机,状态设定好后就一直是有效的,但就是想不明白后面设置的状态怎么会影响到前面呢?
在csdn上请教了高手后,终于知道问题改怎么解决了,只需要在绑定纹理前开启纹理,并且在使用完纹理后就关闭纹理,否则的话纹理就一直处于开启状态,所以会影响到不使用纹理贴图的那个物体的绘制,修改后代码如下:
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 );
glEnable(GL_TEXTURE_2D);
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(); // 正方形绘制结束
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glPopAttrib();
glFlush();
return TRUE; // Everything Went OK
}
最终效果如图所示: