⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tutorial_33.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<!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 &lt;windows.h&gt;			<font color="#ffffaa">// 标准Windows头文件</font>
	#include &lt;stdio.h&gt;				<font color="#ffffaa">// 标准文件I/O头文件 </font>
	#include &lt;gl\gl.h&gt;				<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 + -