📄 tutorial_33.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_33_files/logo.png" height="130" width="326"></td>
<td align="center" valign="middle" width="75%"><font color="#ffccaa" size="+3"><b><i>第33课
</i></b></font></td>
</tr></tbody></table>
<!-- 上边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_33_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_33_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_33_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_33_files/l.gif"><img src="Tutorial_33_files/l.gif" height="28" width="28"></td>
<!-- 中部文字部分-->
<td valign="top" width="100%">
<table border="0" width="100%">
<tbody><tr>
<td width="31%"><img src="Tutorial_33_files/lesson33.jpg" height="180" width="240"></td>
<td width="69%"><p><font class="head">加载压缩和未压缩的TGA文件:</font></p>
<p><font size="3">在这一课里,你将学会如何加载压缩和为压缩的TGA文件,由于它使用RLE压缩,所以非常的简单,你能很快地熟悉它的。</font></p></td>
</tr>
</tbody></table>
</td>
<!-- 中部右边框-->
<td background="Tutorial_33_files/r.gif"><img src="Tutorial_33_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_33_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_33_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_33_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_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
<td valign="top" width="100%"><p>我见过很多人在游戏开发论坛或其它地方询问关于TGA读取的问题。接下来的程序及注释将会向你展示如何读取未压缩的TGA文件和RLE压缩的文件。这个详细的教程适合于OpenGL,但是我计划改进它使其在将来更具普遍性。</p>
<p>我们将从两个头文件开始。第一个文件控制纹理结构,在第二个里,结构和变量将为程序读取所用。</p>
<p>就像每个头文件那样,我们需要一些包含保护措施以防止文件被重复包含。</p>
<p>在文件的顶部加入这样几行程序:<br>
</p></td><td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre> #ifndef __TEXTURE_H__ <font color="#ffffaa">// 看看此头文件是否已经被包含</font>
#define __TEXTURE_H__ <font color="#ffffaa">// 如果没有,定义它</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
<td valign="top" width="100%">然后滚动到程序底部并添加:</td>
<td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3"><pre> #endif <font color="#ffffaa">// __TEXTURE_H__ 结束包含保护</font>
</pre></font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
<td valign="top" width="100%"><p>这三行程序防止此文件被重复包含。文件中剩下的代码将处于这头两行和这最后一行之间。</p>
<p>在这个头文件中,我们将要加入完成每件工作所需的标准头文件。在#define __TGA_H__后添加如下几行:</p></td>
<td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre> #pragma comment(lib, "OpenGL32.lib") <font color="#ffffaa">// 链接 Opengl32.lib</font>
#include <windows.h> <font color="#ffffaa">// 标准Windows头文件</font>
#include <stdio.h> <font color="#ffffaa">// 标准文件I/O头文件 </font>
#include <gl\gl.h> <font color="#ffffaa">// 标准OpenGL头文件</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
<td valign="top" width="100%"><p>第一个头文件是标准Windows头文件,第二个是为我们稍后的文件I/O所准备的,第三个是OpenGL32.lib所需的标准OpenGL头文件。</p>
<p>我们将需要一块空间存储图像数据以及OpenGL生成纹理所需的类型。我们将要用到以下结构:</p></td>
<td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3"> typedef struct
{
GLubyte* imageData; <font color="#ffffaa">// 控制整个图像的颜色值</font>
GLuint bpp; <font color="#ffffaa">// 控制单位像素的bit数</font>
GLuint width; <font color="#ffffaa">// 整个图像的宽度</font>
GLuint height; <font color="#ffffaa">// 整个图像的高度</font>
GLuint texID; <font color="#ffffaa">// 使用glBindTexture所需的纹理ID.</font>
GLuint type; <font color="#ffffaa">// 描述存储在*ImageData中的数据(GL_RGB Or GL_RGBA)</font>
} Texture;
</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
<td valign="top" width="100%"><p>现在说说其它的,更长的头文件。同样我们需要一些包含保护措施,这和上述最后一个是一样的。</p>
<p>接下来,看看另外两个结构,它们将在处理TGA文件的过程中使用。<br>
</p></td><td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre> typedef struct
{
GLubyte Header[12]; <font color="#ffffaa">// 文件头决定文件类型</font>
} TGAHeader;
typedef struct
{
GLubyte header[6]; <font color="#ffffaa"> // 控制前6个字节</font>
GLuint bytesPerPixel; <font color="#ffffaa">// 每像素的字节数 (3 或 4)</font>
GLuint imageSize; <font color="#ffffaa">// 控制存储图像所需的内存空间</font>
GLuint type; <font color="#ffffaa">// 图像类型 GL_RGB 或 GL_RGBA</font>
GLuint Height; <font color="#ffffaa">// 图像的高度</font>
GLuint Width; <font color="#ffffaa">// 图像宽度</font>
GLuint Bpp; <font color="#ffffaa">// 每像素的比特数 (24 或 32)</font>
} TGA;
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
<td valign="top" width="100%">现在我们声明那两个结构的一些实例,那样我们可以在程序中使用它们。</td>
<td background="Tutorial_33_files/r.png"><img src="Tutorial_33_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_33_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> TGAHeader tgaheader; <font color="#ffffaa">// 用来存储我们的文件头</font>
TGA tga; <font color="#ffffaa">// 用来存储文件信息</font>
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_33_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_33_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_33_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_33_files/l.png"><img src="Tutorial_33_files/l.png"></td>
<td valign="top" width="100%">我们需要定义一对文件头,那样我们能够告诉程序什么类型的文件头处于有效的图像上。如果是未压缩的TGA图像,前12字节将会是0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -