前面几课基本上没有什么好多说的,所以我决定了从第六课开始,坚持着写下去,欢迎各位遇到问题的时候和我讨论,每篇笔记中我不想简单的重复或者翻译原文的内容,只想做到言简意赅的把要点列出来,把握住每课的重点:)
第六课的主要内容是纹理映射,从中可以学习到载入纹理数据之后如何绑定到纹理对象之中,然后使用相应的对象进行纹理映射.
首先,代码采用自己写的LoadBMP函数载入位图数据,之后绑定并且生成对应的纹理对象.相应的代码如下:
// Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))
{
Status=TRUE; // Set The Status To TRUE
glGenTextures(1, &texture[0]); // Create The Texture
// Typical Texture Generation Using Data From The Bitmap
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);
} glGenTextures函数生成纹理对象,第一个参数是纹理参数的数量,第二个参数是存放纹理对象的数组,这里只生成了一个纹理对象,如果多的话就要写一个循环来逐个生成.
glBindTexture函数把当前纹理状态绑定到纹理对象中,第一个参数指明了绑定的纹理目标,第二个参数是纹理对象.调用这个函数之后,后面的操作都是对这个纹理对象进行的操作.首先是使用glTexImage2D函数读取位图数据来生成纹理,之后的glTexParameteri函数分别指定了发大和缩小过滤器的参数.
在具体使用纹理对象的时候同样的要使用glBindTexture函数,如前所述,这个函数是把当前状态绑定到对应的纹理对象中去,也就是说使用了这个函数之后,后面的对纹理图像的生成或者是使用都在这个纹理对象上面进行的,因此在后面的渲染部分的函数中同样也使用了glBindTexture函数.
OK,本课没有太多的难点,需要注意的两个地方是:
1)使用位图数据生成纹理图像之后要记得释放位图数据的内存,代码中有体现,不再详述.
2)在程序结束或者不再使用某一个纹理对象的时候要使用glDeleteTextures释放纹理对象的内存,代码中并没有这个函数的使用,它的参数和glGenTextures是一样的,一个负责生成一个负责销毁.
纹理对象的使用方便了对纹理的管理,尤其是当纹理数量较多的时候,可以很方便的切换纹理,可以把纹理对象看作是管理纹理图像的"指针".
本课主要需要掌握的函数是:
1)glGenTextures:生成纹理对象
2)glBindTexture:绑定纹理对象
3)glDeleteTextures:销毁纹理对象
4)glTexImage2D:根据图形数据生成纹理图像
5)glTexParameteri:设置纹理参数.
原文链接:
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=06