为什么OpenGL纹理出来后前面板总是透视?
下面是我做的一个纹理的3d箱子模型程序,可是运行后前面板总是透视,移动到箱子里面后看到的就不是透视的。很奇怪,请各位仁兄指点迷津。
#include "gl/glut.h"
#include "gl/glaux.h"
BOOL light=TRUE;
BOOL lp,fp;
GLfloat xrot,yrot;
GLfloat xspeed,yspeed;
GLfloat z=-5.0f;
GLfloat LightAmbient[]={0.8,0.8,0.8,1.0};
GLfloat LightDiffuse[]={1.0,1.0,1.0,1.0};
GLfloat LightPosition[]={0.0,0.0,2.0};
GLuint filter;
GLuint Texture[3];
void LoadGLTextures()
{//载入位图并转换成纹理
AUX_RGBImageRec *TextureImage[1];
memset(TextureImage,0,sizeof(void *)*1); // 将指针设为 NULL
TextureImage[0]=auxDIBImageLoad("DATA/Crate.bmp");
glGenTextures(3,&Texture[0]);
//生成Nearset纹理
glBindTexture(GL_TEXTURE_2D,Texture[0]);
glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
//生成线性纹理
glBindTexture(GL_TEXTURE_2D,Texture[1]);
glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
//Mipmapped纹理
glBindTexture(GL_TEXTURE_2D,Texture[2]);
//建立二维多重映射
gluBuild2DMipmaps(GL_TEXTURE_2D,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
free(TextureImage[0]->data);
free(TextureImage[0]);
}
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,0.0f,z);//为什么不加这句就不显示模型?
//因为当前坐标是(0,0,0)我认为在屏幕上移动就跑到屏幕外边了
glRotatef(xrot,1.0,0.0,0.0);
glRotatef(yrot,0.0,1.0,0.0);
glBindTexture(GL_TEXTURE_2D,Texture[filter]);
glBegin(GL_QUADS);
// 前面
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);
// 后面
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);
// 地面
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);
// 右面
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);
// 左面
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();
//光照
//设置环境光
glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient);
glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse);
glLightfv(GL_LIGHT1,GL_POSITION,LightPosition);
glEnable(GL_LIGHT1);
xrot+=xspeed;
yrot+=yspeed;
glFlush();
}
void InitGL()
{
LoadGLTextures();
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClear(1.0);
glEnable(GL_DEPTH);
glDepthFunc(GL_LEQUAL);
}
void ChangeSize(int w,int h)
{
float ratio;
if(h==0)
h=1;
ratio=1.0*w/h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 100);
gluPerspective(45,ratio,1,100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse);
gluLookAt(0.0,0.0,8.0,0.0,0.0,0.0,0.0,0.0,1.0);
}
void ProcessSpecialKeys(int key,int x,int y)
{//特殊键控制处理函数
if(key==GLUT_KEY_LEFT)yspeed-=0.05f;
if(key==GLUT_KEY_RIGHT)yspeed+=0.05f;
if(key==GLUT_KEY_UP)xspeed-=0.05f;
if(key==GLUT_KEY_DOWN)xspeed+=0.05f;
if(key==GLUT_KEY_PAGE_UP)z-=0.05f;
if(key==GLUT_KEY_PAGE_DOWN)z+=0.05f;
}
void ProcessNormalKeys(unsigned char key,int x,int y)
{//普通键处理函数
if(key=='l')light=!light;
if(light==TRUE)glEnable(GL_LIGHTING);
elseglDisable(GL_LIGHTING);
if(key=='f')
if(filter>=2)
filter=0;
else
filter++;
}
void main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_SINGLE);
glutInitWindowPosition(50,50);
glutInitWindowSize(500,500);
glutCreateWindow("光照和键盘控制");
InitGL();
glutDisplayFunc(RenderScene);
glutKeyboardFunc(ProcessNormalKeys);
glutSpecialFunc(ProcessSpecialKeys);
glutIdleFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutMainLoop();
}
[解决办法]
glEnable(GL_DEPTH);
改为glEnable(GL_DEPTH_TEST);//启动深度测试