OpenGL矩阵变换问题
各位大侠好,我先在程序中加载了个教室的模型,并在教室模型对面的墙上画了个长方形区域,我是用了渲染到纹理的方法把我想实现的效果都渲染到对面的那个长方形区域了,比如在那个区域上显示图形、图像、播放视频等,但当我渲染了视频后,再渲染其它的(如模型、图片)时,这些东西的位置都乱了,效果图如下所示。其中渲染视频中用到了个函数是glMultMatrixf(代码如下),我跟踪了下,就是这个函数的问题,但在渲染到纹理时,我也用了glPushMatrix()和glPopMatrix()两个函数来保存当前矩阵的独立性(代码如下),但是没用,请问该怎么解决呢???求指教啊
1、渲染视频前时渲染的图像,是正常的:
渲染了视频后渲染的图像,就错位了:
2、这是播放视频是的代码:
void CPlayVideo::Render()
{
if(bStart)
{
glPushMatrix();
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMultMatrixf(matTexture);//出问题的函数
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_Textures[0]);
DrawBack();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, m_Textures[0]);
UpdateEvent(m_pVT);
BYTE * data = (BYTE *)GetTexture(m_pVT);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, nTexWidth, nTexHeight,GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
}
}
glPushMatrix();
glDisable(GL_LIGHT1);
DisplayScene();
glPushMatrix();
glViewport(0, 0, 512, 512);
switch(sel)
{
case 1 :
//绘制茶壶
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-4.0f);
glRotatef(g_Rotate, 1.0f, 1.0f, 1.0f);
glBindTexture(GL_TEXTURE_2D, Texture[1]);
glutSolidTeapot(1.0f);
g_Rotate += 3;
glPopMatrix();
break;
case 2:
//绘制图片
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-4.0f);
glScalef(1.0f,1.0f,1.0f);
m_tex.RenderTex(Texture[2]);
glPopMatrix();
break;
case 3:
//播放视频
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
m_playvideo->Render();
glPopMatrix();
break;
case 4:
//显示网页
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-3.7f);
glScalef(1.6f,1.0f,1.0f);
m_tex.RenderTex(Texture[3]);
glPopMatrix();
break;
}
glBindTexture(GL_TEXTURE_2D,Texture[0]);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 512, 512, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 1.0f, 0.0f, 1.0);
glViewport(0, 0, glnWidth, glnHeight);
glPopMatrix();
//放置教室
glLoadName(JIAOSHI);
glPushMatrix();
glRotatef(-90,0.0f,1.0f,0.0f);
glTranslatef(0.0f,-9.0f,-24.0f);
glScalef(1.0f,1.2f,1.0f);
g_3dsModel[0]->Draw();
glPopMatrix();
glPushMatrix();
glBindTexture(GL_TEXTURE_2D, Texture[0]);
glRotatef(-90,0.0f,1.0f,0.0f);
glBegin(GL_QUADS);
glTexCoord2f( 1, 0.0f);glVertex3f( 13.2f,-0.3f, -66.3f);//右下
glTexCoord2f( 1, 1);glVertex3f( 13.2f, 13.0f, -66.3f);//右上
glTexCoord2f(0.0f, 1);glVertex3f(-7.6f, 13.0f, -66.3f); //左上
glTexCoord2f(0.0f, 0.0f);glVertex3f(-7.6f,-0.3f, -66.3f);//左下
glEnd();
glPopMatrix();
glPopMatrix();
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glLoadIdentity();
glMultMatrixf(matTexture);
glPopMatrix( );
glMatrixMode(GL_MODELVIEW);
……