计算机图形学实验三(纹理映射)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

相关文档
最新文档