资源简介
Nehe第6课纹理映射,如何把纹理映射到立方体的六个面。
代码片段和文件信息
#include // Windows的头文件
#include // 包含最新的gl.hglu.h库
#include // 包含OpenGL实用库
#include // GLaux库的头文件
#include // 标准输入/输出库的头文件
GLfloat xrot;
GLfloat yrot;
GLfloat zrot;
GLuint texture[1]; //存储纹理,如果纹理大于1个改为相应数值
HGLRC hRC=NULL; //窗口着色描述表句柄
HDC hDC=NULL; //设备渲染描述表句柄
HWND hWND=NULL; //窗口句柄
HINSTANCE hInstance; //保存程序的实例
bool keys[256];
bool active=TRUE; //窗口的活动状态,缺省为true
bool fullscreen=TRUE; //全屏的缺省状态=true
GLfloat rtri=7; //用于三角形角度
GLfloat rquad=45; //用于四边形角度
LRESULT CALLBACK WndProc(HWND UINTWPARAM LPARAM);
/* 在 ReSizeGLScene() 之前,我们增加了下面这一段代码。这段代码用来加载位图文件。
* 如果文件不存在,返回 NULL 告知程序无法加载位图。
* 关于用作纹理的图像。图像的宽和高必须是2的n次方;宽度和高度最小必须是64象素;
* 并且出于兼容性的原因,图像的宽度和高度不应超过256象素。如果您的原始素材的宽度
* 和高度不是64128256象素的话,使用图像处理软件重新改变图像的大小。*/
AUX_RGBImageRec *LoadBMP(char*Filename)
{
// 首先,我们创建一个文件句柄。句柄是个用来鉴别资源的数值,它使程序能够
//访问此资源。我们开始先将句柄设为 NULL 。
FILE *File=NULL;
if (!Filename) //确保文件名已提供
{
return NULL;
}
File=fopen(Filename“r“);
if (File)// 文件存在么?
{
fclose(File);
return auxDIBImageLoad(Filename); // 载入位图并返回指针
}
return NULL;
}
int LoadGLTextures()//载入位图(调用上面的代码)并转换成纹理
{
//然后设置一个叫做 Status 的变量。我们使用它来跟踪是否能够载入位图以及能否创建纹理。
//Status 缺省设为 FALSE (表示没有载入或创建任何东东)。
int Status=FALSE;
//创建存储位图的图像记录。次记录包含位图的宽度、高度和数据。
AUX_RGBImageRec *TextureImage[1]; // 创建纹理的存储空间
//清除图像记录,确保其内容为空
memset(TextureImage0sizeof(void *)*1); // 将指针设为 NULL
if (TextureImage[0]=LoadBMP(“Data/Nehe.bmp“))
{
Status=true;
/*
使用TextureImage[0] 的数据创建纹理。第一行 glGenTextures(1 &texture[0]) 告诉OpenGL
我们想生成一个纹理名字(如果您想载入多个纹理,加大数字)。
第二行 glBindTexture(GL_TEXTURE_2D texture[0]) 告诉OpenGL将纹理名字 texture[0] 绑定
到纹理目标上。2D纹理只有高度(在 Y 轴上)和宽度(在 X 轴上)。主函数将纹理名字指派给纹理
数据。本例中我们告知OpenGL,&texture[0] 处的内存已经可用。我们创建的纹理将存储在
&texture[0] 的 指向的内存区域。
*/
glGenTextures(1&texture[0]);
glBindTexture(GL_TEXTURE_2Dtexture[0]);
/*
下面一行告诉OpenGL此纹理是一个2D纹理 ( GL_TEXTURE_2D )。参数“0”代表图像的详细程度,
通常就由它为零去了。参数三是数据的成分数。因为图像是由红色数据,绿色数据,蓝色数据
三种组分组成。 TextureImage[0]->sizeX 是纹理的宽度。如果您知道宽度,您可以在这里填入,
但计算机可以很容易的为您指出此值。 TextureImage[0]->sizey 是纹理的高度。参数零是边框
的值,一般就是“0”。 GL_RGB 告诉OpenGL图像数据由红、绿、蓝三色数据组成。
GL_UNSIGNED_BYTE 意味着组成图像的数据是无符号字节类型的。最后... TextureImage[0]->data
告诉OpenGL纹理数据的来源。此例中指向存放在 TextureImage[0] 记录中的数据。
*/
glTexImage2D(GL_TEXTURE_2D03TextureImage[0]->sizeXTextureImage[0]->sizeY0
GL_RGBGL_UNSIGNED_BYTETextureImage[0]->data);
/*
下面的两行告诉OpenGL在显示图像时,当它比放大得原始的纹理大 ( GL_TEXTURE_MAG_FILTER )或
缩小得比原始得纹理小( GL_TEXTURE_MIN_FILTER )时OpenGL采用的滤波方式。通常这两种情况下
我都采用 GL_LINEAR 。这使得纹理从很远处到离屏幕很近时都平滑显示。使用 GL_LINEAR 需要
CPU和显卡做更多的运算。如果您的机器很慢,您也许应该采用 GL_NEAREST 。过滤的纹理在放大
的时候,看起来斑驳的很『译者注:马赛克啦』。您也可以结合这两种滤波方式。在近处时使用
GL_LINEAR ,远处时 GL_NEAREST 。
*/
glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MAG_FILTERGL_LINEAR);
glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MIN_FILTERGL_LINEAR);//线性滤波
}
/*
现在我们释放
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 196664 2000-03-06 02:10 Nehe第6课纹理映射20120318\Data\NeHe.bmp
文件 2769920 2012-03-18 12:26 Nehe第6课纹理映射20120318\Debug\Nehe.bsc
文件 217158 2012-03-18 12:26 Nehe第6课纹理映射20120318\Debug\Nehe.exe
文件 349768 2012-03-18 12:26 Nehe第6课纹理映射20120318\Debug\Nehe.ilk
文件 109832 2012-03-18 12:26 Nehe第6课纹理映射20120318\Debug\nehe.obj
文件 6183932 2012-03-18 12:19 Nehe第6课纹理映射20120318\Debug\Nehe.pch
文件 631808 2012-03-18 12:26 Nehe第6课纹理映射20120318\Debug\Nehe.pdb
文件 0 2012-03-18 12:26 Nehe第6课纹理映射20120318\Debug\nehe.sbr
文件 156672 2012-03-18 12:26 Nehe第6课纹理映射20120318\Debug\vc60.idb
文件 110592 2012-03-18 12:26 Nehe第6课纹理映射20120318\Debug\vc60.pdb
文件 18624 2012-03-18 12:26 Nehe第6课纹理映射20120318\nehe.cpp
文件 3959 2012-03-18 10:59 Nehe第6课纹理映射20120318\Nehe.dsp
文件 531 2012-03-03 16:22 Nehe第6课纹理映射20120318\Nehe.dsw
文件 50176 2012-03-18 12:26 Nehe第6课纹理映射20120318\Nehe.ncb
文件 54784 2012-03-18 12:26 Nehe第6课纹理映射20120318\Nehe.opt
文件 1307 2012-03-18 12:26 Nehe第6课纹理映射20120318\Nehe.plg
目录 0 2012-03-18 11:54 Nehe第6课纹理映射20120318\Data
目录 0 2012-03-18 12:26 Nehe第6课纹理映射20120318\Debug
目录 0 2012-03-18 12:26 Nehe第6课纹理映射20120318
----------- --------- ---------- ----- ----
10855727 19
评论
共有 条评论