【OpenGL】nehe教程第六课学习笔记

nehe的第六课的内容是给六面的盒子贴上材质texture,流程主要分两步,一,利用glaux库的函数auxDIBImageLoad将图片从硬盘读到内存,再利用OpenGL的函数检测图片,给它打上"可用的标签"。二,学习将texture的坐标与盒子的一面对齐,就像是小时候的贴纸,你要贴齐而且要方向正确。

先来看第一步,涉及的函数挺多,一共有5个,分别是auxDIBImageLoad、glGenTextures、glBIndTexture、glTexParameteri、glTexImage2D、glEnable(GL_TEXTURE_2D),分别来说道,还有个变量类型AUX_RGBImageRec

ps:手头暂时没有原码,而且工具用的是vc++6.0,so,先饶小弟一次,将就着理解吧,等以后有时间换个IDE从原码鼓捣

auxDIBImageLoad,DIB是设备无关位图文件,一般格式是bmp或者dib,其他格式这个函数是读不了的。另外对图片本身也有要求,和一般的游戏一样(毕竟OpenGL是根嘛),要求图片分辨率必须是2的n次方,也就是只有32*32、64*64,128*128,256*256这些,而且还加了限制最小64,最大256,太小的比如32还不行,更大只能用其它方式绕开,这个暂时不理。

函数参数是一个字符串,如果是相对地址的话会从.cpp的位置走,小小的实验了一下,绝对地址也行,能跳出去。又试了下,../上一级目录也能用,猜测和命令行的地址规则一样,估摸还是用的File库函数。

返回值是AUX_RGBImageRec,记得用指针。

glGenTextures是让OpenGL给材质分配序号。参数有两个,第一个是材质的数量,第二个是AUX_RGBImageRec类型的指针,也就是aux_DIBImageLoad加载到的指针。

glBIndTexture是告诉OpenGL,指定的纹理将是2D纹理,让OpenGL指向可用内存。参数有两个,第一个是常量GL_TEXTURE_2D,第二个常量是材质的地址.
这两个函数奇怪的是,它不是必须的,当笔者将nehe的代码这两句注释掉的时候,依然能加载出来,跟这个情况一样的函数还有glBIndTexture。从网上的一些资料来看,这两个函数应该属于OpenGL用来管理材质的系统,然而大家都是套路了同一种解释,这个问题就先存着吧(已解决,参加下面的资料)。

glTexParameteri这个函数可以设置纹理的过滤模式和过渡模式,什么叫过滤呢,我理解是纹理的扩大和缩小以匹配物体的大小。过渡模式是指当相机或者物体移动时,纹理的切换方法,GL_LINEAR是线性插值,可以让图像运动变的更平缓。

glTexImage2D,是最主要的函数,参数很多,一共有9或更多个。分别简单的讲解,这个详细的参见glTexImage2d的资料

第一个参数是常量,指定纹理的样式,一共有三个,GL_TEXTURE_1D,GL_TEXTURE_2D,GL_TEXTURE_3D.

第二个参数是int类型,指定纹理的细节层级,参见下面mipmap,默认为0.

第三个参数是int类型,指定颜色组件,比如RGB是三个,RGBA是四个。

第四-五个参数是指定宽度和高度,也可以通过AUX_RGBImageRec结构体的sizeX、sizeY自动获得,比如这样写texture1-> sizeX,texture1-> sizeY

第六个是边界/框,一般指定为0.

第七个是颜色模式,与第三个参数保持一致,GL_RGB

第八个是指定图像数据由无符号字节还是有符号字节构成,bmp是无符号的,GL_UNSIGNED_BYTE.

第九个是指定图像的数据区,AUX_RGBImageRec结构体的date,例如,texture1-> data

glEnable(GL_TEXTURE_2D),是OpenGL运行使用TEXTURE_2D纹理。在InitGL里先调用LoadGLTextures函数,在加上这句就行了。

ps:互联网还是伟大的,我还是找到了详细的介绍,他们都是纹理映射系统Mipmap的一部分,是为了解决图像闪烁和性能优化的问题,详见https://my.oschina.net/sweetdark/blog/177812

glTexImage2d的资料是百科的,详见这里百度百科

以上,nehe把它们封装成了一个函数,现在把函数完整的贴出来


GLuint texture[1]; // Storage for 1 texture
// Load Bitmaps And Convert To Textures
GLvoid LoadGLTextures()
{
// Load Texture
AUX_RGBImageRec *texture1;
texture1 = auxDIBImageLoad("Data/NeHe.bmp");
if (!texture1) exit(1);

//Create Texture
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
};

第二步是应用纹理。涉及到glTexCoord2f函数.

glTexCoord2f函数是分配2d纹理的坐标,以便能和glVertex3f描绘的点吻合,类似于glColor3f一样的作用.

glTexCoord2f函数是确定纹理的坐标,纹理的左下角的位置是(0,0),右上角是(1,1),纹理坐标最好也是按照一定顺序(顺时针或逆时针)去布点,如果随机比如按照对角线,那么纹理会扭曲的超越你想象,当然你说把正方形的点也按照对角线的顺序出现,纹理是没错,不过图案都变了。所以在添加纹理时,点的顺序最好和纹理顺序一致,如果可以的话,封装个函数最好。

Vertex3f

点坐标

glVertex3f(1.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,0.0f);
glVertex3f(-1.0f,1.0f,0.0f);

glTexCoord2f

纹理坐标

效果图
glTexCoord2f(0.0f,0.0f);
glTexCoord2f(0.0f,1.0f);
glTexCoord2f(1.0f,1.0f);
glTexCoord2f(1.0f,0.0f);

旋转180
glTexCoord2f(1.0f,1.0f);
glTexCoord2f(1.0f,0.0f);
glTexCoord2f(0.0f,0.0f);
glTexCoord2f(0.0f,1.0f);

Vertex和TexCoord点的位置

和顺序一致时,正好是正确的

glTexCoord2f(0.0f,0.0f);
glTexCoord2f(1.0f,1.0f);
glTexCoord2f(0.0f,1.0f);
glTexCoord2f(1.0f,0.0f);
对角线放置,结果反了
纹理和quads都按照对角线走

转载请加上原文地址http://blog.csdn.net/lzh1590/article/details/66478252

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值