📄 tutorial_24.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><!-- 这篇文章由Dancingwind翻译,作者的联系方式zhouwei02@mails.tsinghua.edu.cn --><title>NeHe OpenGL教程第二十四课,DancingWind翻译</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
A:link {COLOR: #ccaaff; TEXT-DECORATION: none}
A:visited {COLOR: #ccaaff; TEXT-DECORATION: none}
A:active {COLOR: #ccaaff; TEXT-DECORATION: none}
A:hover {COLOR: #ffccaa; TEXT-DECORATION: none}
</style></head><body bgcolor="#000000" text="#ffffff"><br><br>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td height="130" width="326"><img src="Tutorial_24_files/logo.png" height="130" width="326"></td>
<td align="center" valign="middle" width="75%"><font color="#ffccaa" size="+3"><b><i>第24课</i></b></font></td>
</tr></tbody></table>
<!-- 上边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_24_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_24_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_24_files/tr.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<!-- 中部-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<!-- 中部左边框-->
<td background="Tutorial_24_files/l.gif"><img src="Tutorial_24_files/l.gif" height="28" width="28"></td>
<!-- 中部文字部分-->
<td valign="top" width="100%">
<table border="0" width="100%">
<tbody><tr>
<td width="29%"><img src="Tutorial_24_files/lesson24.jpg" height="180" width="240"></td>
<td width="71%"><p><font class="head">扩展,剪裁和TGA图像文件的加载:</font></p>
<p><font size="3">在这一课里,你将学会如何读取你显卡支持的OpenGL的扩展,并在你指定的剪裁区域把它显示出来。</font></p></td>
</tr>
</tbody></table>
</td>
<!-- 中部右边框-->
<td background="Tutorial_24_files/r.gif"><img src="Tutorial_24_files/r.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<!-- 下边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_24_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_24_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_24_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_24_files/l.png"><img src="Tutorial_24_files/l.png"></td>
<td valign="top" width="100%">这个教程有一些难度,但它会让你学到很多东西。我听到很多朋友问我扩展方面的内容和怎样找到它们。这个教程将交给你这<br>
一切。<br>
我将教会你怎样滚动屏幕的一部分和怎样绘制直线,最重要的是从这一课起,我们将不使用AUX库,以及*.bmp文件。我将告诉你如何使用Targa(TGA)图像文件。因为它简单并且支持alpha通道,它可以使你更容易的创建酷的效果。
<p>接下来我们要做的第一件事就是不包含glaux.h头文件和glaux.lib库。另外,在使用glaux库时,经常会发生一些可疑的警告,现在我们可以测定告别它了。</p></td><td background="Tutorial_24_files/r.png"><img src="Tutorial_24_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>#include <stdarg.h> <font color="#ffffaa">// 处理可变参数的函数的头文件</font>
#include <string.h> <font color="#ffffaa">// 处理字符串的头文件</font>
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_24_files/l.png"><img src="Tutorial_24_files/l.png"></td>
<td valign="top" width="100%">接下来我们添加一些变量,第一个为滚动参数。第二给变量记录扩展的个数,swidth和sheight记录剪切矩形的大小。base为字体显示列表的开始值。</td>
<td background="Tutorial_24_files/r.png"><img src="Tutorial_24_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>int scroll; <font color="#ffffaa">// 用来滚动屏幕</font>
int maxtokens; <font color="#ffffaa">// 保存扩展的个数</font>
int swidth; <font color="#ffffaa">// 剪裁宽度</font>
int sheight; <font color="#ffffaa"> // 剪裁高度</font>
GLuint base; <font color="#ffffaa">// 字符显示列表的开始值</font>
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_24_files/l.png"><img src="Tutorial_24_files/l.png"></td>
<td valign="top" width="100%">现在我们创建一个数据结构用来保存TGA文件,接着我们使用这个结构来加载纹理。</td>
<td background="Tutorial_24_files/r.png"><img src="Tutorial_24_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>typedef struct <font color="#ffffaa">// 创建加载TGA图像文件结构</font>
{
GLubyte *imageData; <font color="#ffffaa">// 图像数据指针</font>
GLuint bpp; <font color="#ffffaa">// 每个数据所占的位数(必须为24或32)</font>
GLuint width; <font color="#ffffaa">// 图像宽度</font>
GLuint height; <font color="#ffffaa">// 图像高度</font>
GLuint texID; <font color="#ffffaa">// 纹理的ID值</font>
} TextureImage; <font color="#ffffaa">// 结构名称</font>
TextureImage textures[1]; <font color="#ffffaa">// 保存一个纹理</font>
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_24_files/l.png"><img src="Tutorial_24_files/l.png"></td>
<td valign="top" width="100%">这个部分的代码将要加载一个TGA文件并把它转换为纹理。必须注意的是这部分代码只能加载24/32位的不压缩的TGA文件。<br>
这个函数包含两个参数,一个保存载入的图像,一个为将载入的文件名。<br>
TGA文件包含一个12个字节的文件头,载入图像后,我们用type来设置图像中像素格式在OpenGL中的对应。如果是24位的图像我们使用GL_RGB,如果是32位的图像我们使用GL_RGBA。</td>
<td background="Tutorial_24_files/r.png"><img src="Tutorial_24_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>bool LoadTGA(TextureImage *texture, char *filename) <font color="#ffffaa">// 把TGA文件加载入内存</font>
{
GLubyte TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0}; <font color="#ffffaa">// 无压缩的TGA文件头</font>
GLubyte TGAcompare[12]; <font color="#ffffaa">// 保存读入的文件头信息</font>
GLubyte header[6]; <font color="#ffffaa">// 保存最有用的图像信息,宽,高,位深</font>
GLuint bytesPerPixel; <font color="#ffffaa">// 记录每个颜色所占用的字节数</font>
GLuint imageSize; <font color="#ffffaa">// 记录文件大小</font>
GLuint temp; <font color="#ffffaa">// 临时变量</font>
GLuint type=GL_RGBA; <font color="#ffffaa">// 设置默认的格式为GL_RGBA,即32位图像</font>
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_24_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_24_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_24_files/tr.png" height="28" width="28"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td background="Tutorial_24_files/l.png"><img src="Tutorial_24_files/l.png"></td>
<td valign="top" width="100%"><p>下面这个函数读取TGA文件,并记录文件信息。TGA文件格式如下所示: </p>
<p>Tga图像格式<br>
无颜色表 rgb 图像 </p>
<table border="1" width="100%">
<tbody><tr>
<td width="6%">偏移</td>
<td width="9%">长度</td>
<td width="62%">描述</td>
<td width="21%">32位常用图像文件各个字节的值</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>指出图像信息字段的长度,其取值范围是 0 到 255 ,当它为 0 时表示没有图像的信息字段。</td>
<td>0</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>是否使用颜色表,0 表示没有颜色表,1 表示颜色表存在</td>
<td>0</td>
</tr>
<tr>
<td>2</td>
<td>1</td>
<td>该字段总为 2。图像类型码,tga一共有6种格式,2表示无颜色表 rgb 图像</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td rowspan="5">5</td>
<td rowspan="5">颜色表规格,总为0。</td>
<td>0</td>
</tr>
<tr>
<td>4</td>
<td>0</td>
</tr>
<tr>
<td>5</td>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -