计算机图形学实验三纹理映射Word下载.docx
- 文档编号:19850917
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:12
- 大小:99.75KB
计算机图形学实验三纹理映射Word下载.docx
《计算机图形学实验三纹理映射Word下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验三纹理映射Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
intmOldY,mOldX;
boolfullscreen;
////////////////////////////////////
floateye[3]={0.0f,0.0f,7.0f};
floatrot[3]={45.0f,45.0f,0.0f};
constintESC=27;
intwireframe=0;
constintGL_WIN_WIDTH=640;
constintGL_WIN_HEIGHT=480;
constintGL_WIN_INITIAL_X=0;
constintGL_WIN_INITIAL_Y=0;
/*arraytoholdtexturehandles*/
GLuintg_TexturesArray[MAX_TEXTURES];
BOOLLoadTextureGL(char*Filename,GLuint&
texture)//加载一个bmp图片(new)
{
AUX_RGBImageRec*TextureImage;
//为纹理开辟存储空间
FILE*File=NULL;
//文件句柄
if(!
Filename)//确保文件名已经提供
{
returnNULL;
//如果没有则返回NULL
}
File=fopen(Filename,"
r"
);
//检查文件是否存在
if(File)//文件存在吗?
fclose(File);
//关闭File文件句柄
TextureImage=auxDIBImageLoad(Filename);
//载入图片并返回其指针
glGenTextures(1,&
texture);
//返回唯一的纹理名字来标识纹理,保存在texture中
//使用来自位图数据生成的典型纹理
glBindTexture(GL_TEXTURE_2D,texture);
//生成纹理
glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage->
sizeX,TextureImage->
sizeY,
0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage->
data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
//线形滤波
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
if(TextureImage)//纹理是否存在
if(TextureImage->
data)//纹理图像是否存在
{
free(TextureImage->
//释放纹理存储空间
}
free(TextureImage);
//释放图像结构
returntrue;
}
boolLoadBMP(char*filename,GLuint&
texture)//调贴图大小为2的幂
{AUX_RGBImageRec*pImage=NULL;
pImage=auxDIBImageLoad(filename);
//装入位图
if(pImage==NULL)returnfalse;
//位图没装入返回错误
//生成贴图(纹理)
glBindTexture(GL_TEXTURE_2D,texture);
//捆绑贴图(纹理)
gluBuild2DMipmaps(GL_TEXTURE_2D,4,//
pImage->
sizeX,//图形宽
sizeY,//图形高
GL_RGB,GL_UNSIGNED_BYTE,
data//图形数据
);
free(pImage->
//释放位图数据占据的内存资源
free(pImage);
//返回成功
voidInit()
//glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
//glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glClearColor(0.0,0.0,0.0,1.0);
//enabletextureandbindsatexturetothefirstelementofthearray
glEnable(GL_TEXTURE_2D);
//LoadTextureGL("
mybmp1.bmp"
g_TexturesArray[0]);
Cars.bmp"
g_TexturesArray[1]);
LoadBMP("
1.bmp"
2.bmp"
3.bmp"
g_TexturesArray[2]);
4.bmp"
g_TexturesArray[3]);
5.bmp"
g_TexturesArray[4]);
6.bmp"
g_TexturesArray[5]);
return;
//------------------------------------------------------------------------
//Windowresizefunction
voidglutResize(intwidth,intheight)
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/*modifythislinetochangeperspectivevalues*/
gluPerspective(45.0,(float)width/(float)height,1.0,300.0);
glMatrixMode(GL_MODELVIEW);
//Functionthathandleskeyboardinputs
voidglutKeyboard(unsignedcharkey,intx,inty)
switch(key)
caseESC:
exit(0);
case'
W'
:
w'
wireframe=!
wireframe;
voidclamp(float*v)
inti;
for(i=0;
i<
3;
i++)
if(v[i]>
360||v[i]<
-360)
v[i]=0;
//Movesthescreenbasedonmousepressedbutton
voidglutMotion(intx,inty)
if(mButton==BUTTON_LEFT)
/*rotatesscreen*/
rot[0]-=(mOldY-y);
rot[1]-=(mOldX-x);
clamp(rot);
elseif(mButton==BUTTON_RIGHT)
eye[2]-=(mOldY-y)*0.05f;
//hereImultiplybya0.2factorto
//slowdownthezoom
}
elseif(mButton==BUTTON_LEFT_TRANSLATE)
eye[0]+=(mOldX-x)*0.01f;
eye[1]-=(mOldY-y)*0.01f;
mOldX=x;
mOldY=y;
//Functionthathandlesmouseinput
voidglutMouse(intbutton,intstate,intx,inty)
if(state==GLUT_DOWN)
switch(button)
caseGLUT_LEFT_BUTTON:
if(glutGetModifiers()==GLUT_ACTIVE_CTRL)
mButton=BUTTON_LEFT_TRANSLATE;
break;
}else
mButton=BUTTON_LEFT;
caseGLUT_RIGHT_BUTTON:
mButton=BUTTON_RIGHT;
}elseif(state==GLUT_UP)
mButton=-1;
voidglutMenu(intvalue)
switch(value)
case1:
glutFullScreen();
return;
case2:
glutReshapeWindow(GL_WIN_WIDTH,GL_WIN_HEIGHT);
case3:
voidglutSpecial(intvalue,intx,inty)
caseGLUT_KEY_F1:
if(fullscreen)glutFullScreen();
elseglutReshapeWindow(GL_WIN_WIDTH,GL_WIN_HEIGHT);
fullscreen=!
fullscreen;
voidglutDisplay(void)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
if(wireframe)
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
else
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glPushMatrix();
/*translatecameratothecoordinatesprovidedbyeyearray*/
glTranslatef(-eye[0],-eye[1],-eye[2]);
/*rotatesthescreenbytheanglesprovidedbyrotarray*/
glRotatef(rot[0],1.0f,0.0f,0.0f);
glRotatef(rot[1],0.0f,1.0f,0.0f);
glRotatef(rot[2],0.0f,0.0f,1.0f);
glBindTexture(GL_TEXTURE_2D,g_TexturesArray[0]);
glBegin(GL_QUADS);
//FrontFace,red
glNormal3f(0.0f,0.0f,1.0f);
glTexCoord2f(0.0f,0.0f);
glColor3f(1.0f,1.0f,1.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);
glColor3f(1.7f,1.0f,1.0f);
glVertex3f(1.0f,1.0f,1.0f);
glTexCoord2f(0.0f,1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D,g_TexturesArray[1]);
//BackFace,green
glNormal3f(0.0f,0.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glColor3f(1.0f,0.7f,1.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glColor3f(1.0f,1.7f,1.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
//TopFace,blue
glBindTexture(GL_TEXTURE_2D,g_TexturesArray[2]);
glNormal3f(0.0f,1.0f,0.0f);
glColor3f(1.0f,1.0f,1.7f);
//BottomFace,yellow
glBindTexture(GL_TEXTURE_2D,g_TexturesArray[3]);
glNormal3f(0.0f,-1.0f,0.0f);
glColor3f(1.7f,1.7f,1.0f);
//Rightface,cyan
glBindTexture(GL_TEXTURE_2D,g_TexturesArray[4]);
glNormal3f(1.0f,0.0f,0.0f);
glColor3f(1.0f,1.7f,1.7f);
//LeftFace,magenta
glBindTexture(GL_TEXTURE_2D,g_TexturesArray[5]);
glNormal3f(-1.0f,0.0f,0.0f);
glColor3f(1.7f,1.0f,1.7f);
glPopMatrix();
glFlush();
glutSwapBuffers();
rot[1]+=0.1;
intmain(intargc,char**argv)
{glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH|GLUT_RGBA);
glutInitWindowPosition(GL_WIN_INITIAL_X,GL_WIN_INITIAL_Y);
glutInitWindowSize(GL_WIN_WIDTH,GL_WIN_HEIGHT);
glutInit(&
argc,argv);
glutCreateWindow("
bmp_maping"
glutReshapeFunc(glutResize);
//calledeverytimethescreenisresized
glutDisplayFunc(glutDisplay);
//calledwhenwindowneedstoberedisplayed
glutIdleFunc(glutDisplay);
//calledwhenevertheapplicationisidle
glutKeyboardFunc(glutKeyboard);
//calledwhentheapplicationreceivesainputfromtheke
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 纹理 映射