资源简介
做的是把一个旋转立方体的6个面贴上6幅不同的图片,设置了两个键盘控制,一个是通过glutKeyboardFunc(keyboard);来控制灯光的开和关,用glutSpecialFunc(special);来分别改变立方体延x,y,z轴的旋转角度。
代码片段和文件信息
#pragma comment (lib“glaux.lib“)
#include
#include
#include
#include
#include
#include
#include
#include
GLuint texture[6]; //存储纹理数据
GLfloat x = 0.0fy = 0.0fz = 0.0f;//旋转角度
GLfloat deltax = 0.0fdeltay = 0.0f;//旋转变化量
GLfloat depth = 0.0f;//缩放变化量
bool lightlp;
GLfloat LightAmbient[] = {0.0f0.0f1.0f1.0f};//环境光颜色:蓝色
GLfloat LightDiffuse[] = {1.0f1.0f1.0f1.0f};//散射光颜色
GLfloat LightPosition[] = {0.0f0.0f2.0f1.0f};//指定光源的位置
AUX_RGBImageRec *LoadBMP(char *Filename) // 载入位图图象
{
FILE *File=NULL;
if (!Filename) //确定给定的文件名有效
{
return NULL; // 如果没提供,返回 NULL
}
File = fopen(Filename“r“); // 打开文件
if (File)
{
fclose(File); // 关闭文件句柄
File = NULL;
return auxDIBImageLoad(Filename); // 载入位图并返回指针
}
return NULL; // 如果载入失败,返回 NULL
}
int LoadGLTextures() // 根据加载的位图创建纹理
{
int Status=FALSE; // 指示纹理创建是否成功的标志
AUX_RGBImageRec *TextureImage[6]; // 创建一个纹理图像数组,这里指定数组大小为6
memset(TextureImage0sizeof(void *)*6); // 初始化纹理图像数组,为其分配内存
char *pictures[] = { // 创建一个位图名称数组,对应6幅位图
“d:/我的文档/Visual Studio 2005/Projects/黄美燕的作业/Data/data1.bmp“
“d:/我的文档/Visual Studio 2005/Projects/黄美燕的作业/Data/data2.bmp“
“d:/我的文档/Visual Studio 2005/Projects/黄美燕的作业/Data/data3.bmp“
“d:/我的文档/Visual Studio 2005/Projects/黄美燕的作业/Data/data4.bmp“
“d:/我的文档/Visual Studio 2005/Projects/黄美燕的作业/Data/data5.bmp“
“d:/我的文档/Visual Studio 2005/Projects/黄美燕的作业/Data/data6.bmp“
};
for(int i=0; i<6; i++) // 遍历位图名称数组,根据位图名称分别生成
{
if (TextureImage[i]=LoadBMP(pictures[i])) // 加载位图i成功,修改状态标志变量Status为TRUE
{
Status=TRUE;
glGenTextures(1 &texture[i]); // 为第i个位图创建纹理
glBindTexture(GL_TEXTURE_2D texture[i]); // 将生成的纹理的名称绑定到指定的纹理上
glTexImage2D(GL_TEXTURE_2D 0 3 TextureImage[i]->sizeX TextureImage[i]->sizeY 0 GL_RGB GL_UNSIGNED_BYTE TextureImage[i]->data);//用来指定二维纹理图像
glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MIN_FILTERGL_LINEAR);//实现线形滤波的功能,当纹理映射到图形表面以后,如果因为其它条件的设置导致纹理不能更好地显示的时候,进行过滤,按照指定的方式进行显示,可能会过滤掉显示不正常的纹理像素。
glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MAG_FILTERGL_LINEAR);//线性滤波
}
if (TextureImage[i]) // 纹理是否存在
{
if (TextureImage[i]->data) // 纹理图像是否存在
{
free(TextureImage[i]->data); // 释放纹理图像占用的内存
}
free(TextureImage[i]); // 释放图像结构
}
}
return Status; // 创建纹理并加载,返回成功或者失败的标志Status
}
void reshape(int wint h)
{
glViewport(00(GLsizei)w(GLsizei)h);// 指定视口的位置和大小
glMatrixMode(GL_PROJECTION);// 切换当前矩阵到投影矩阵
glLoadIdentity();// 设置投影矩阵为一个单位矩阵
gluPerspective(6015-5);//设置透视投影矩阵
glMatrixMode(GL_MODELVIEW);// 切换当前矩形到模型视景矩阵
glLoadIdentity();// 设置模型视景矩阵为一个单位矩阵
gluLookAt(0.00.010.00.00.00.00.01.00.0);//设置眼睛参数
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix()
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 10413 2011-01-06 10:17 opengl纹理贴图\aa.cpp
文件 196662 2011-01-04 12:48 opengl纹理贴图\Data\data1.bmp
文件 196662 2011-01-04 12:48 opengl纹理贴图\Data\data2.bmp
文件 196662 2011-01-04 12:48 opengl纹理贴图\Data\data3.bmp
文件 196662 2011-01-04 12:48 opengl纹理贴图\Data\data4.bmp
文件 196662 2011-01-04 12:48 opengl纹理贴图\Data\data5.bmp
文件 196662 2011-01-04 12:49 opengl纹理贴图\Data\data6.bmp
..A.SH. 82944 2011-01-04 12:49 opengl纹理贴图\Data\Thumbs.db
目录 0 2011-03-11 17:04 opengl纹理贴图\Data
目录 0 2011-03-11 17:04 opengl纹理贴图
----------- --------- ---------- ----- ----
1273329 10
评论
共有 条评论