﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-创的技术博客-随笔分类-图形学</title><link>http://www.cppblog.com/converse/category/921.html</link><description>C++对我而言就是有STL带class能处理多态,继承的C.</description><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 07:04:45 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 07:04:45 GMT</pubDate><ttl>60</ttl><item><title>NeHe OpenGL教程第六课--Texture Mapping(纹理映射)的学习笔记</title><link>http://www.cppblog.com/converse/archive/2006/02/13/3244.html</link><dc:creator>创</dc:creator><author>创</author><pubDate>Mon, 13 Feb 2006 15:37:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/02/13/3244.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/3244.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/02/13/3244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/3244.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/3244.html</trackback:ping><description><![CDATA[<P>前面几课基本上没有什么好多说的,所以我决定了从第六课开始,坚持着写下去,欢迎各位遇到问题的时候和我讨论,每篇笔记中我不想简单的重复或者翻译原文的内容,只想做到言简意赅的把要点列出来,把握住每课的重点:)<BR>第六课的主要内容是纹理映射,从中可以学习到载入纹理数据之后如何绑定到纹理对象之中,然后使用相应的对象进行纹理映射.<BR>首先,代码采用自己写的LoadBMP函数载入位图数据,之后绑定并且生成对应的纹理对象.相应的代码如下:</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Load&nbsp;The&nbsp;Bitmap,&nbsp;Check&nbsp;For&nbsp;Errors,&nbsp;If&nbsp;Bitmap's&nbsp;Not&nbsp;Found&nbsp;Quit</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(TextureImage[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">]</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">LoadBMP(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Data/NeHe.bmp</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">))<BR><IMG id=Codehighlighter1_114_599_Open_Image onclick="this.style.display='none'; Codehighlighter1_114_599_Open_Text.style.display='none'; Codehighlighter1_114_599_Closed_Image.style.display='inline'; Codehighlighter1_114_599_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_114_599_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_114_599_Closed_Text.style.display='none'; Codehighlighter1_114_599_Open_Image.style.display='inline'; Codehighlighter1_114_599_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_114_599_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cppblog.com/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_114_599_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Status</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">TRUE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Set&nbsp;The&nbsp;Status&nbsp;To&nbsp;TRUE</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glGenTextures(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">texture[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Create&nbsp;The&nbsp;Texture<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Typical&nbsp;Texture&nbsp;Generation&nbsp;Using&nbsp;Data&nbsp;From&nbsp;The&nbsp;Bitmap</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBindTexture(GL_TEXTURE_2D,&nbsp;texture[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">]);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexImage2D(GL_TEXTURE_2D,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">,&nbsp;TextureImage[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">]</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">sizeX,&nbsp;TextureImage[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">]</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">sizeY,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;GL_RGB,&nbsp;GL_UNSIGNED_BYTE,&nbsp;TextureImage[</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">]</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">data);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN></DIV>glGenTextures函数生成纹理对象,第一个参数是纹理参数的数量,第二个参数是存放纹理对象的数组,这里只生成了一个纹理对象,如果多的话就要写一个循环来逐个生成.<BR>glBindTexture函数把当前纹理状态绑定到纹理对象中,第一个参数指明了绑定的纹理目标,第二个参数是纹理对象.调用这个函数之后,后面的操作都是对这个纹理对象进行的操作.首先是使用glTexImage2D函数读取位图数据来生成纹理,之后的glTexParameteri函数分别指定了发大和缩小过滤器的参数.<BR><BR>在具体使用纹理对象的时候同样的要使用glBindTexture函数,如前所述,这个函数是把当前状态绑定到对应的纹理对象中去,也就是说使用了这个函数之后,后面的对纹理图像的生成或者是使用都在这个纹理对象上面进行的,因此在后面的渲染部分的函数中同样也使用了glBindTexture函数.<BR><BR>OK,本课没有太多的难点,需要注意的两个地方是:<BR>1)使用位图数据生成纹理图像之后要记得释放位图数据的内存,代码中有体现,不再详述.<BR>2)在程序结束或者不再使用某一个纹理对象的时候要使用glDeleteTextures释放纹理对象的内存,代码中并没有这个函数的使用,它的参数和glGenTextures是一样的,一个负责生成一个负责销毁.<BR><BR>纹理对象的使用方便了对纹理的管理,尤其是当纹理数量较多的时候,可以很方便的切换纹理,可以把纹理对象看作是管理纹理图像的"指针".<BR><BR>本课主要需要掌握的函数是:<BR>1)glGenTextures:生成纹理对象<BR>2)glBindTexture:绑定纹理对象<BR>3)glDeleteTextures:销毁纹理对象<BR>4)glTexImage2D:根据图形数据生成纹理图像<BR>5)glTexParameteri:设置纹理参数.<BR><BR>原文链接:<BR><A href="http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=06">http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=06</A><img src ="http://www.cppblog.com/converse/aggbug/3244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">创</a> 2006-02-13 23:37 <a href="http://www.cppblog.com/converse/archive/2006/02/13/3244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>