📄 tutorial_17.htm
字号:
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td><img src="Tutorial_17_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_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_17_files/l.gif"><img src="Tutorial_17_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">下面的几行代码检查我们读取的位图数据是否在内存里。如果是,释放内存。注意我们还要检查并释放rgb图像记录。如果我们使用了3个不同的图像来创建纹理,我们要检查并释放3个rgb图像记录。</td>
<td background="Tutorial_17_files/r.gif"><img src="Tutorial_17_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_17_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_files/br.gif" height="28" width="28"></td>
</tr>
</tbody></table>
<font color="#aaffaa" size="3">
<pre> for (loop=0; loop<2; loop++)
{
if (TextureImage[loop]) <font color="#ffffaa">// 纹理是否存在</font>
{
if (TextureImage[loop]->data) <font color="#ffffaa">// 纹理图像是否存在</font>
{
free(TextureImage[loop]->data); <font color="#ffffaa">// 释放纹理图像占用的内存</font>
}
free(TextureImage[loop]); <font color="#ffffaa">// 释放图像结构</font>
}
}
return Status; <font color="#ffffaa">// 返回 Status</font>
}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td><img src="Tutorial_17_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_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_17_files/l.gif"><img src="Tutorial_17_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">现在我们将创建字体。我将以同样的细节来解释这段代码。这并没那么复杂,但是有些数学要了解,我知道不是每个人都喜欢数学。</td>
<td background="Tutorial_17_files/r.gif"><img src="Tutorial_17_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_17_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_files/br.gif" height="28" width="28"></td>
</tr>
</tbody></table>
<font color="#aaffaa" size="3">
<pre>GLvoid BuildFont(GLvoid) <font color="#ffffaa">// 创建我们的字符显示列表</font>
{
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td><img src="Tutorial_17_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_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_17_files/l.gif"><img src="Tutorial_17_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">下面两个变量将用来保存字体纹理中每个字的位置。cx将用来保存纹理中水平方向的位置,cy将用来保存纹理中竖直方向的位置。<br></td>
<td background="Tutorial_17_files/r.gif"><img src="Tutorial_17_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_17_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_files/br.gif" height="28" width="28"></td>
</tr>
</tbody></table>
<font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3">float cx; <font color="#ffffaa">// 字符的X坐标</font>
float cy; <font color="#ffffaa">// </font><font color="#aaffaa" size="3"><font color="#ffffaa">字符的</font><font color="#aaffaa" size="3"><font color="#ffffaa">Y</font></font><font color="#ffffaa">坐标</font></font></font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td><img src="Tutorial_17_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_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_17_files/l.gif"><img src="Tutorial_17_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">接着我们告诉OpenGL我们要建立256个显示列表。变量base将指向第一个显示列表的位置。第二个显示列表将是base+1,第三个是base+2,以此类推。
<p>下面的第二行代码选择我们的字体纹理(texture[0])。</p></td>
<td background="Tutorial_17_files/r.gif"><img src="Tutorial_17_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_17_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_files/br.gif" height="28" width="28"></td>
</tr>
</tbody></table>
<font color="#aaffaa" size="3">
<pre> base=glGenLists(256); <font color="#ffffaa">// 创建256个显示列表</font>
glBindTexture(GL_TEXTURE_2D, texture[0]); <font color="#ffffaa">// 选择字符图象</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td><img src="Tutorial_17_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_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_17_files/l.gif"><img src="Tutorial_17_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">现在我们开始循环。循环间创建所有的256个字符,每个存在它自己的显示列表里。 </td>
<td background="Tutorial_17_files/r.gif"><img src="Tutorial_17_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_17_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_files/br.gif" height="28" width="28"></td>
</tr>
</tbody></table>
<font color="#aaffaa" size="3">
<pre> for (loop=0; loop<256; loop++) <font color="#ffffaa">// 循环256个显示列表</font>
{
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td><img src="Tutorial_17_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_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_17_files/l.gif"><img src="Tutorial_17_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%"><p>下面的第一行或许看上去让人有点困惑。%符号表示loop除以16的余数。cx将我们通过字体纹理从左至右移动。你将注意到在后面的代码中我们用1减去cy从而从上到下而不是从下到上移动我们。%符号很难解释,但我将尝试去解释。</p>
<p>我
们真正关心的是(loop%16)。/16只是将结果转化为纹理坐标。所以如果loop等于16,cx将等于16/16的余数也就是0。但cy将等于
16/16也就是1。所以我们将下移一个字符的高度,且我们将不往右移。如果loop等于17,cx将等于17/16也就是1.0625。余数0.625
也等于1/16。意味着我们将右移一个字符。cy将仍是1因为我们只关心小数点左边的数字。18/16将右移2个字符,但仍下移一个字符。如果loop是
32,cx将再次等于0,因为32除以16没有余数,但cy将等于2。因为小数点左边的数字现在是2,将下移2个字符。这么讲清楚吗? </p></td>
<td background="Tutorial_17_files/r.gif"><img src="Tutorial_17_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_17_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_files/br.gif" height="28" width="28"></td>
</tr>
</tbody></table>
<font color="#aaffaa" size="3">
<pre> cx=float(loop%16)/16.0f; <font color="#ffffaa">// 当前字符的X坐标</font>
cy=float(loop/16)/16.0f; <font color="#ffffaa">// 当前字符的Y坐标</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td><img src="Tutorial_17_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_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_17_files/l.gif"><img src="Tutorial_17_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">Ok。
现在我们通过从字体纹理中依据cx和cy的值选择一个单独的字符创建了2D字体。在下面的行里我们给base的值加上loop,若不这么做,每个字都将建
在第一个显示列表里。我们当然不想要那样的事发生,所以通过给base加上loop,我们创建的每个字都被存在下个可用的显示列表里。</td>
<td background="Tutorial_17_files/r.gif"><img src="Tutorial_17_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_17_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_files/br.gif" height="28" width="28"></td>
</tr>
</tbody></table>
<font color="#aaffaa" size="3">
<pre> glNewList(base+loop,GL_COMPILE); <font color="#ffffaa">//开始创建显示列表</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr>
<td><img src="Tutorial_17_files/tl.jpg" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/tc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_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_17_files/l.gif"><img src="Tutorial_17_files/l.gif" height="28" width="28"></td>
<td valign="top" width="100%">现在我们已选择了我们要创建的显示列表,我们创建字符。这是通过绘制四边形,然后给他贴上字体纹理中的单个字符的纹理来完成的。</td>
<td background="Tutorial_17_files/r.gif"><img src="Tutorial_17_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_17_files/bl.gif" height="28" width="28"></td>
<td width="100%"><img src="Tutorial_17_files/bc.gif" height="28" width="100%"></td>
<td><img src="Tutorial_17_files/br.gif" height="28" width="28"></td>
</tr>
</tbody></table>
<font color="#aaffaa" size="3">
<pre> glBegin(GL_QUADS); <font color="#ffffaa">// 使用四边形显示每一个字符</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -