OpenGL程序二:实现纹理映射到3D立方体上

在之前的程序进行的改动,用于创建纹理的图片在D:\\目录下放置,文件名为:11.bmp

下面是纹理映射的例子程序 Texture Map

#include <windows.h>		// Windows的头文件
#include <gl\gl.h>		// 包含最新的gl.h,glu.h库
#include   <gl\glu.h>
#include	<stdio.h>							// 标准输入/输出库的头文件
#include	<gl\glaux.h>							// GLaux库的头文件

HGLRC           hRC=NULL;							// 窗口着色描述表句柄
HDC             hDC=NULL;							// OpenGL渲染描述表句柄
HWND            hWnd=NULL;							// 保存我们的窗口句柄
HINSTANCE       hInstance;							// 保存程序的实例

   
bool	keys[256];								// 保存键盘按键的数组
bool	active=TRUE;								// 窗口的活动标志,缺省为TRUE
bool	fullscreen=TRUE;							// 全屏标志缺省,缺省设定成全屏模式
GLfloat		rtri;						// 用于三角形的角度
GLfloat		rquad;						// 用于四边形的角度

GLfloat		xrot;								// X 旋转量
GLfloat		yrot;								// Y 旋转量
GLfloat		zrot;								// Z 旋转量

GLuint		texture[1];							// 存储一个纹理


LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);				// WndProc的定义

AUX_RGBImageRec * LoadBMP(char *Filename)					// 载入位图图象
{
	FILE *File=NULL;							// 文件句柄
	if (!Filename)								// 确保文件名已提供
	{
		return NULL;
	}// 如果没提供,返回 NULL
		File=fopen(Filename,"r");						// 尝试打开文件
		if (File)								// 文件存在么?
		{
			fclose(File);							// 关闭句柄
			return auxDIBImageLoad(Filename);				// 载入位图并返回指针
		}
		return NULL;								// 如果载入失败,返回 NULL
	}
int LoadGLTextures(){							// 载入位图(调用上面的代码)并转换成纹理
	int Status=FALSE;							// 状态指示器
	AUX_RGBImageRec *TextureImage[1];					// 创建纹理的存储空间
	memset(TextureImage,0,sizeof(void *)*1);				// 将指针设为 NULL
	// 载入位图,检查有无错误,如果位图没找到则退出
	if (TextureImage[0]=LoadBMP("d:\\12.bmp"))
	{
		Status=TRUE;							// 将 Status 设为 TRUE
		glGenTextures(1, &texture[0]);					// 创建纹理

		// 使用来自位图数据生成 的典型纹理
		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_MIN_FILTER,GL_LINEAR);	// 线形滤波
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);	// 线形滤波
	}
	if (TextureImage[0])							// 纹理是否存在
	{
		if (TextureImage[0]->data)					// 纹理图像是否存在
		{
			free(TextureImage[0]->data);				// 释放纹理图像占用的内存
		}

		free(TextureImage[0]);	// 释放图像结构
	}
		return Status;								// 返回 Status
}

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)				// 重置OpenGL窗口大小
{
	if (height==0)								// 防止被零除
	{
		height=1;							// 将Height设为1
	}
	glViewport(0, 0, width, height);					// 重置当前的视口
	glMatrixMode(GL_PROJECTION);						// 选择投影矩阵
	glLoadIdentity();							// 重置投影矩阵
	// 设置视口的大小
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
	glMatrixMode(GL_MODELVIEW);						// 选择模型观察矩阵
	glLoadIdentity();	
}// 重置模型观察矩阵
	int InitGL(GLvoid)								// 此处开始对OpenGL进行所有设置
{
	if (!LoadGLTextures())							// 调用纹理载入子例程
	{
		return FALSE;							// 如果未能载入,返回FALSE
	}

	glEnable(GL_TEXTURE_2D);						// 启用纹理映射
	glShadeModel(GL_SMOOTH);						// 启用阴影平滑
	glClea
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值