📄 tutorial_06.htm
字号:
<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> glGenTextures(1, &texture[0]); <font color="#ffffaa">// 创建纹理</font>
<font color="#ffffaa">// 使用来自位图数据生成 的典型纹理</font>
glBindTexture(GL_TEXTURE_2D, texture[0]);
</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%">下来我们创建真正的纹理。下面一行告诉OpenGL此纹理是一个2D纹理 ( GL_TEXTURE_2D
)。参数“0”代表图像的详细程度,通常就由它为零去了。参数三是数据的成分数。因为图像是由红色数据,绿色数据,蓝色数据三种组分组成。 TextureImage[0]->sizeX
是纹理的宽度。如果您知道宽度,您可以在这里填入,但计算机可以很容易的为您指出此值。 TextureImage[0]->sizey 是纹理的高度。参数零是边框的值,一般就是“0”。
GL_RGB 告诉OpenGL图像数据由红、绿、蓝三色数据组成。<br>
GL_UNSIGNED_BYTE 意味着组成图像的数据是无符号字节类型的。最后... TextureImage[0]->data 告诉OpenGL纹理数据的来源。此例中指向存放在
TextureImage[0] 记录中的数据。</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> <font color="#ffffaa">// 生成纹理</font>
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
</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%">下面的两行告诉OpenGL在显示图像时,当它比放大得原始的纹理大 ( GL_TEXTURE_MAG_FILTER
)或缩小得比原始得纹理小( GL_TEXTURE_MIN_FILTER )时OpenGL采用的滤波方式。通常这两种情况下我都采用 GL_LINEAR
。这使得纹理从很远处到离屏幕很近时都平滑显示。使用 GL_LINEAR 需要CPU和显卡做更多的运算。如果您的机器很慢,您也许应该采用 GL_NEAREST
。过滤的纹理在放大的时候,看起来斑驳的很『译者注:马赛克啦』。您也可以结合这两种滤波方式。在近处时使用 GL_LINEAR ,远处时 GL_NEAREST
。</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> glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); <font color="#ffffaa">// 线形滤波</font>
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); <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%">现在我们释放前面用来存放位图数据的内存。我们先查看位图数据是否存放在处。如果是的话,再查看数据是否已经存储。如果已经存储的话,删了它。接着再释放
TextureImage[0] 图像结构以保证所有的内存都能释放。</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 (TextureImage[0]) <font color="#ffffaa">// 纹理是否存在</font>
{
if (TextureImage[0]->data) <font color="#ffffaa">// 纹理图像是否存在</font>
{
free(TextureImage[0]->data); <font color="#ffffaa">// 释放纹理图像占用的内存</font>
}
free(TextureImage[0]); <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%">最后返回状态变量。如果一切OK,变量 Status 的值为 TRUE 。否则为 FALSE
。</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> return Status; <font color="#ffffaa">// 返回 Status</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%">我只在 InitGL 中增加很少的几行代码。但为了方便您查看增加了哪几行,我这段代码全部重贴一遍。
if (!LoadGLTextures()) 这行代码调用上面讲的子例程载入位图并生成纹理。如果因为任何原因 LoadGLTextures()
调用失败,接着的一行返回FALSE。如果一切OK,并且纹理创建好了,我们启用2D纹理映射。如果您忘记启用的话,您的对象看起来永远都是纯白色,这一定不是什么好事。</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>int InitGL(GLvoid) <font color="#ffffaa">// 此处开始对OpenGL进行所有设置</font>
{
if (!LoadGLTextures()) <font color="#ffffaa">// 调用纹理载入子例程</font>
{
return FALSE; <font color="#ffffaa">// 如果未能载入,返回FALSE</font>
}
glEnable(GL_TEXTURE_2D); <font color="#ffffaa">// 启用纹理映射</font>
glShadeModel(GL_SMOOTH); <font color="#ffffaa">// 启用阴影平滑</font>
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); <font color="#ffffaa">// 黑色背景</font>
glClearDepth(1.0f); <font color="#ffffaa">// 设置深度缓存</font>
glEnable(GL_DEPTH_TEST); <font color="#ffffaa">// 启用深度测试</font>
glDepthFunc(GL_LEQUAL); <font color="#ffffaa">// 所作深度测试的类型</font>
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); <font color="#ffffaa">// 真正精细的透视修正</font>
return TRUE; <font color="#ffffaa">// 初始化 OK</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%">现在我们绘制贴图『译者注:其实贴图就是纹理映射。将术语换来换去不好,我想少打俩字。^_^』过的立方体。这段代码被狂注释了一把,应该很好懂。开始两行代码
glClear() 和 glLoadIdentity() 是第一课中就有的代码。 glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT) 清除屏幕并设为我们在 InitGL() 中选定的颜色,本例中是黑色。深度缓存也被清除。模型观察矩阵也使用glLoadIdentity()重置。</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>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -