📄 tutorial_37.htm
字号:
<font color="#ffffaa">// 设置纹理</font>
glTexImage1D (GL_TEXTURE_1D, 0, GL_RGB, 32, 0, GL_RGB , GL_FLOAT, shaderData);
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_37_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_37_files/l.png"><img src="Tutorial_37_files/l.png"></td>
<td valign="top" width="100%">现在调整灯光方向。我已经使得它向下指向Z轴正方向,这意味着它将正面碰撞模型</td>
<td background="Tutorial_37_files/r.png"><img src="Tutorial_37_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_37_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> lightAngle.X = 0.0f;
lightAngle.Y = 0.0f;
lightAngle.Z = 1.0f;
Normalize (lightAngle);
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_37_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_37_files/l.png"><img src="Tutorial_37_files/l.png"></td>
<td valign="top" width="100%">读取Mesh文件,并返回</td>
<td background="Tutorial_37_files/r.png"><img src="Tutorial_37_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_37_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3"><pre> return ReadMesh (); <font color="#ffffaa">// 读取Mesh文件,并返回</font>
}
</pre></font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_37_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_37_files/l.png"><img src="Tutorial_37_files/l.png"></td>
<td valign="top" width="100%">与上面的函数相对应…… 卸载,删除由Initalize 和 ReadMesh 创建的纹理和多边形数据。</td>
<td background="Tutorial_37_files/r.png"><img src="Tutorial_37_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_37_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre>void Deinitialize (void)
{
glDeleteTextures (1, &shaderTexture[0]); <font color="#ffffaa">// 删除阴影纹理</font>
delete [] polyData; <font color="#ffffaa">// 删除多边形数据</font>
}
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_37_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_37_files/l.png"><img src="Tutorial_37_files/l.png"></td>
<td valign="top" width="100%">主要的演示循环。所有这些用来处理输入和更新角度。控制如下:
<p><SPACE> =锁定旋转</p>
<p>1 = 锁定轮廓绘制<br>
2 = 锁定轮廓 anti-aliasing </p>
<p><UP> =增加线宽<br>
<DOWN> = 减小线宽</p></td><td background="Tutorial_37_files/r.png"><img src="Tutorial_37_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_37_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3">void Update (DWORD milliseconds) <font color="#ffffaa">// 这里执行动作更新</font>
{
if (g_keys->keyDown [' '] == TRUE) <font color="#ffffaa">// 空格是否被按下</font>
{
modelRotate = !modelRotate; <font color="#ffffaa">// 锁定模型旋转开/关</font>
g_keys->keyDown [' '] = FALSE;
}
if (g_keys->keyDown ['1'] == TRUE) <font color="#ffffaa">// 1是否被按下</font>
{
outlineDraw = !outlineDraw; <font color="#ffffaa">// 切换是否绘制轮廓线</font>
g_keys->keyDown ['1'] = FALSE;
}
if (g_keys->keyDown ['2'] == TRUE) <font color="#ffffaa">// 2是否被按下</font>
{
outlineSmooth = !outlineSmooth; <font color="#ffffaa">// 切换是否使用反走样</font>
g_keys->keyDown ['2'] = FALSE;
}
if (g_keys->keyDown [VK_UP] == TRUE) <font color="#ffffaa">// 上键增加线的宽度</font>
{
outlineWidth++;
g_keys->keyDown [VK_UP] = FALSE;
}
if (g_keys->keyDown [VK_DOWN] == TRUE) <font color="#ffffaa">// 下减少线的宽度</font>
{
outlineWidth--;
g_keys->keyDown [VK_DOWN] = FALSE;
}
if (modelRotate) <font color="#ffffaa">// 是否旋转</font>
modelAngle += (float) (milliseconds) / 10.0f; <font color="#ffffaa">// 更新旋转角度</font>
}
</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_37_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_37_files/l.png"><img src="Tutorial_37_files/l.png"></td>
<td valign="top" width="100%">你一直在等待的函数。Draw 函数做每一件事情——计算阴影的值,着色网孔,着色轮廓,等等,这是它作的。</td>
<td background="Tutorial_37_files/r.png"><img src="Tutorial_37_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_37_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3"><pre>void Draw (void)
{
</pre></font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_37_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_37_files/l.png"><img src="Tutorial_37_files/l.png"></td>
<td valign="top" width="100%">TmpShade用来存储当前顶点的色度值。所有顶点数据同时被计算,意味着我们只需使用我们能继续使用的单个的变量。<br>
TmpMatrix, TmpVector 和 TmpNormal同样被用来计算顶点数据,TmpMatrix在函数开始时被调整一次并一直保持到Draw函数被再次调用。TmpVector
和 TmpNormal则相反,当另一个顶点被处理时改变。<br></td><td background="Tutorial_37_files/r.png"><img src="Tutorial_37_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_37_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre> float TmpShade; <font color="#ffffaa">// 临时色度值</font>
MATRIX TmpMatrix; <font color="#ffffaa">// 临时 MATRIX 结构体</font>
VECTOR TmpVector, TmpNormal; <font color="#ffffaa">// 临时 VECTOR结构体</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_37_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_37_files/l.png"><img src="Tutorial_37_files/l.png"></td>
<td valign="top" width="100%">清除缓冲区矩阵数据</td>
<td background="Tutorial_37_files/r.png"><img src="Tutorial_37_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_37_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre> glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); <font color="#ffffaa">// 清除缓冲区</font>
glLoadIdentity (); <font color="#ffffaa">// 重置矩阵</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_37_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_37_files/l.png"><img src="Tutorial_37_files/l.png"></td>
<td valign="top" width="100%">首先检查我们是否想拥有平滑的轮廓。如果是,我们就打开anti-alaising 。否则把它关闭。简单!</td>
<td background="Tutorial_37_files/r.png"><img src="Tutorial_37_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_37_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> if (outlineSmooth) <font color="#ffffaa">// 检查我们是否想要 Anti-Aliased 线条</font>
{
glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); <font color="#ffffaa">// 启用它们</font>
glEnable (GL_LINE_SMOOTH);
}
else <font color="#ffffaa">// 否则不启用</font>
glDisable (GL_LINE_SMOOTH); </pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_37_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_37_files/l.png"><img src="Tutorial_37_files/l.png"></td>
<td valign="top" width="100%">然后我们设置视口。我们反向移动摄象机2个单元,之后以一定角度旋转模型。注:由于我们首先移动摄象机,这个模型将在现场旋转。如果我们以另一种方法做,模型将绕摄象机旋转。<br>
我们之后从OpenGL中取最新创建的矩阵并把它存储在 TmpMatrix。<br></td><td background="Tutorial_37_files/r.png"><img src="Tutorial_37_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_37_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre> glTranslatef (0.0f, 0.0f, -2.0f); <font color="#ffffaa">// 移入屏幕两个单位</font>
glRotatef (modelAngle, 0.0f, 1.0f, 0.0f); <font color="#ffffaa">// 绕Y轴旋转这个模型</font>
glGetFloatv (GL_MODELVIEW_MATRIX, TmpMatrix.Data); <font color="#ffffaa">// 获得产生的矩阵</font>
</pre>
</font>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_37_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_37_files/l.png"><img src="Tutorial_37_files/l.png"></td>
<td valign="top" width="100%">戏法开始了。首先我们启用一维纹理,然后启用着色纹理。这被OpenGL用来当作一个look-up表格。我们之后调整模型的颜色(白色)我选择白色是因为它亮度高并且描影法比其它颜色好。我建议你不要使用黑色:)<br></td><td background="Tutorial_37_files/r.png"><img src="Tutorial_37_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_37_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3"> <font color="#ffffaa">// 卡通渲染代码</font>
glEnable (GL_TEXTURE_1D); <font color="#ffffaa">// 启用一维纹理</font>
glBindTexture (GL_TEXTURE_1D, shaderTexture[0]); <font color="#ffffaa">// 锁定我们的纹理</font>
glColor3f (1.0f, 1.0f, 1.0f); <font color="#ffffaa">// 调整模型的颜色</font>
</font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_37_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_37_files/l.png"><img src="Tutorial_37_files/l.png"></td>
<td valign="top" width="100%">现在我们开始绘制那些三角形。尽管我们看到在数组中的每一个多边形,然后旋转它的每一个顶点。第一步是拷贝法线信息到一个临时的结构中。因此我们能旋转法线,但仍然保留原来保存的值(没有精确降级)。<br></td><td background="Tutorial_37_files/r.png"><img src="Tutorial_37_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_37_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_37_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_37_files/br.png" height="28" width="28"></td></tr></tbody></table>
<font color="#aaffaa" size="3">
<pre> glBegin (GL_TRIANGLES); <font color="#ffffaa">// 告诉 OpenGL 我们即将绘制三角形</font>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -