📄 tutorial_06.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>
<meta content="Microsoft FrontPage 6.0" name="GENERATOR"></head><body bgcolor="#000000" text="#ffffff">
<center><br>
<p><br>
</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td height="130" width="326"><img src="Tutorial_06_files/logo.png" height="130" width="326"></td>
<td align="center" valign="center" width="75%"><div align="center"><font color="#ffccaa" size="+3"><b><i>第06课</i></b></font></div></td>
</tr>
</tbody>
</table>
<!-- 上边框-->
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_06_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_06_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_06_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_06_files/l.gif"><img src="Tutorial_06_files/l.gif" height="28" width="28"></td>
<!-- 中部文字部分-->
<td valign="top" width="100%">
<table border="0" width="100%">
<tbody><tr>
<td width="23%"><img src="Tutorial_06_files/lesson06.jpg" height="180" width="240"></td>
<td width="77%"><p><font class="head">纹理映射:</font></p>
<p><font size="3">在这一课里,我将教会你如何把纹理映射到立方体的六个面。</font></p></td>
</tr>
</tbody></table>
</td>
<!-- 中部右边框-->
<td background="Tutorial_06_files/r.gif"><img src="Tutorial_06_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_06_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_06_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_06_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_06_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_06_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_06_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_06_files/l.gif"><img src="Tutorial_06_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">学
习 texture map
纹理映射(贴图)有很多好处。比方说您想让一颗导弹飞过屏幕。根据前几课的知识,我们最可行的办法可能是很多个多边形来构建导弹的轮廓并加上有趣的颜色。
使用纹理映射,您可以使用真实的导弹图像并让它飞过屏幕。您觉得哪个更好看?照片还是一大堆三角形和四边形?使用纹理映射的好处还不止是更好看,而且您的
程序运行会更快。导弹贴图可能只是一个飞过窗口的四边形。一个由多边形构建而来的导弹却很可能包括成百上千的多边形。很显然,贴图极大的节省了CPU时
间。<br>
现在我们在第一课的代码开始处增加五行新代码。新增的第一行是 #include <stdio.h> 。它允许我们对文件进行操作,为了在后面的代码中使用
fopen() ,我们增加了这一行。然后我们增加了三个新的浮点变量... xrot , yrot 和 zrot 。这些变量用来使立方体绕X、Y、Z轴旋转。最后一行
GLuint texture[1] 为一个纹理分配存储空间。如果您需要不止一个的纹理,应该将参数1改成您所需要的参数。</td>
<td background="Tutorial_06_files/r.gif"><img src="Tutorial_06_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_06_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_06_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_06_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre>#include <stdio.h> <font color="#ffffaa">// 标准输入/输出库的头文件</font>
#include <glaux.h> <font color="#ffffaa">// GLaux库的头文件</font>
GLfloat xrot; <font color="#ffffaa">// X 旋转量</font>
GLfloat yrot; <font color="#ffffaa">// Y 旋转量</font>
GLfloat zrot; <font color="#ffffaa">// Z 旋转量</font>
GLuint texture[1]; <font color="#ffffaa">// 存储一个纹理</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_06_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_06_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_06_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_06_files/l.gif"><img src="Tutorial_06_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">紧
跟上面的代码在 ReSizeGLScene() 之前,我们增加了下面这一段代码。这段代码用来加载位图文件。如果文件不存在,返回 NULL
告知程序无法加载位图。在我开始解释这段代码之前,关于用作纹理的图像我想有几点十分重要,并且您必须明白。此图像的宽和高必须是2的n次方;宽度和高度
最小必须是64象素;并且出于兼容性的原因,图像的宽度和高度不应超过256象素。如果您的原始素材的宽度和高度不是64,128,256象素的话,使用
图像处理软件重新改变图像的大小。可以肯定有办法能绕过这些限制,但现在我们只需要用标准的纹理尺寸。 <p>首先,我们创建一个文件句柄。句柄是个用来鉴别资源的数值,它使程序能够访问此资源。我们开始先将句柄设为 NULL 。</p></td>
<td background="Tutorial_06_files/r.gif"><img src="Tutorial_06_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_06_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_06_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_06_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre>AUX_RGBImageRec *LoadBMP(char *Filename) <font color="#ffffaa">// 载入位图图象</font>
{
FILE *File=NULL; <font color="#ffffaa">// 文件句柄</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_06_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_06_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_06_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_06_files/l.gif"><img src="Tutorial_06_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">接下来检查文件名是否已提供。因为 LoadBMP() 可以无参数调用,所以我们不得不检查一下。您可不想什么都没载入吧.....:)</td>
<td background="Tutorial_06_files/r.gif"><img src="Tutorial_06_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_06_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_06_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_06_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre> if (!Filename) <font color="#ffffaa">// 确保文件名已提供</font>
{
return NULL; <font color="#ffffaa">// 如果没提供,返回 NULL</font>
}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_06_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_06_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_06_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_06_files/l.gif"><img src="Tutorial_06_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">接着检查文件是否存在。下面这一行尝试打开文件。</td>
<td background="Tutorial_06_files/r.gif"><img src="Tutorial_06_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_06_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_06_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_06_files/br.gif" height="28" width="28"></td>
</tr>
</tbody>
</table>
<font color="#aaffaa" size="3">
<pre> File=fopen(Filename,"r"); <font color="#ffffaa">// 尝试打开文件</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td><img src="Tutorial_06_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_06_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_06_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_06_files/l.gif"><img src="Tutorial_06_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">如果我们能打开文件的话,很显然文件是存在的。使用 fclose(File) 关闭文件。
auxDIBImageLoad(Filename) 读取图象数据并将其返回。</td>
<td background="Tutorial_06_files/r.gif"><img src="Tutorial_06_files/r.gif" height="28" width="28"></td>
</tr>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -