那谁的技术博客

感兴趣领域:高性能服务器编程,存储,算法,Linux内核
随笔 - 210, 文章 - 0, 评论 - 1183, 引用 - 0
数据加载中……

NeHe OpenGL教程第六课--Texture Mapping(纹理映射)的学习笔记

前面几课基本上没有什么好多说的,所以我决定了从第六课开始,坚持着写下去,欢迎各位遇到问题的时候和我讨论,每篇笔记中我不想简单的重复或者翻译原文的内容,只想做到言简意赅的把要点列出来,把握住每课的重点:)
第六课的主要内容是纹理映射,从中可以学习到载入纹理数据之后如何绑定到纹理对象之中,然后使用相应的对象进行纹理映射.
首先,代码采用自己写的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, 
03, 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

posted on 2006-02-13 23:37 那谁 阅读(3752) 评论(0)  编辑 收藏 引用 所属分类: 图形学


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理