计算机图形学实验三(纹理映射)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三纹理映射
一、实验目的
(1)掌握OpenGl的三维图形制作方法
(2)掌握Visual C++环境下的OpenGL图形开发
二、实验内容
在三维图像上添加纹理映射
三、实验结果
实验代码如下:
/***********************************************
* glut_application writen by yyb * ***********************************************/
#include
#include
#include
#include
#pragma comment(lib,"glaux.lib")
#define MAX_TEXTURES 6 // max textures displayed
/* creates a enum type for mouse buttons */
enum {
BUTTON_LEFT = 0,
BUTTON_RIGHT,
BUTTON_LEFT_TRANSLATE,
};
int mButton = -1;
int mOldY, mOldX;
bool fullscreen;
////////////////////////////////////
float eye[3] = {0.0f, 0.0f, 7.0f};
float rot[3] = {45.0f, 45.0f, 0.0f};
const int ESC = 27;
int wireframe = 0;
const int GL_WIN_WIDTH = 640;
const int GL_WIN_HEIGHT = 480;
const int GL_WIN_INITIAL_X = 0;
const int GL_WIN_INITIAL_Y = 0;
/* array to hold texture handles */
GLuint g_TexturesArray[MAX_TEXTURES];
BOOL LoadTextureGL(char *Filename,GLuint &texture) // 加载一个bmp图片(new)
{
AUX_RGBImageRec *TextureImage; // 为纹理开辟存储空间
FILE *File = NULL; // 文件句柄
if (!Filename) // 确保文件名已经提供
{
return NULL; // 如果没有则返回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->data); // 释放纹理存储空间}
free(TextureImage); // 释放图像结构}
return true;
}
bool LoadBMP(char *filename, GLuint &texture)//调贴图大小为2的幂
{ AUX_RGBImageRec *pImage = NULL;
pImage = auxDIBImageLoad(filename); // 装入位图
if(pImage == NULL) return false; // 位图没装入返回错误
glGenTextures(1, &texture); // 生成贴图(纹理)
glBindTexture (GL_TEXTURE_2D,texture);// 捆绑贴图(纹理)
gluBuild2DMipmaps(GL_TEXTURE_2D,4, //
pImage->sizeX, // 图形宽
pImage->sizeY, // 图形高
GL_RGB, GL_UNSIGNED_BYTE,
pImage->data // 图形数据
);
free(pImage->data); // 释放位图数据占据的内存资源free(pImage);
return true; // 返回成功
}
void Init()
{
//glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
//glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glClearColor(0.0,0.0,0.0,1.0);
// enable texture and binds a texture to the first element of the array
glEnable(GL_TEXTURE_2D);
// LoadTextureGL("mybmp1.bmp",g_TexturesArray[0]);
// LoadTextureGL("Cars.bmp",g_TexturesArray[1]);
LoadBMP("1.bmp",g_TexturesArray[0]);
LoadBMP("2.bmp",g_TexturesArray[1]);
LoadBMP("3.bmp",g_TexturesArray[2]);
LoadBMP("4.bmp",g_TexturesArray[3]);
LoadBMP("5.bmp",g_TexturesArray[4]);
LoadBMP("6.bmp",g_TexturesArray[5]);
return;
}
//------------------------------------------------------------------------
// Window resize function
//------------------------------------------------------------------------
void glutResize(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/* modify this line to change perspective values */
gluPerspective(45.0, (float)width/(float)height, 1.0, 300.0);