📄 tutorial_26.htm
字号:
}
}
}
return Status; <font color="#ffffaa">// 成功返回</font>
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_26_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_26_files/l.png"><img src="Tutorial_26_files/l.png"></td>
<td valign="top" width="100%">一个新的函数glClearStencil被加入到初始化代码中,它用来设置清空操作后蒙板缓存中的值。其他的操作保持不变。</td>
<td background="Tutorial_26_files/r.png"><img src="Tutorial_26_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_26_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
</font><pre><font color="#aaffaa" size="3">int InitGL(GLvoid) <font color="#ffffaa">// 初始化OpenGL</font>
{
if (!LoadGLTextures()) <font color="#ffffaa"> // 载入纹理</font>
{
return FALSE;
}
glShadeModel(GL_SMOOTH);
glClearColor(0.2f, 0.5f, 1.0f, 1.0f);
glClearDepth(1.0f);
glClearStencil(0); <font color="#ffffaa"> // 设置蒙板值</font>
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_TEXTURE_2D); <font color="#ffffaa">// 使用2D纹理</font></font></pre>
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_26_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_26_files/l.png"><img src="Tutorial_26_files/l.png"></td>
<td valign="top" width="100%">下面的代码用来启用光照</td>
<td background="Tutorial_26_files/r.png"><img src="Tutorial_26_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_26_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmb);
glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDif);
glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_26_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_26_files/l.png"><img src="Tutorial_26_files/l.png"></td>
<td valign="top" width="100%">下面的代码使用二次几何体创建一个球体,在前面的教程中都已经详纤,这里不再重复。</td>
<td background="Tutorial_26_files/r.png"><img src="Tutorial_26_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_26_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> q = gluNewQuadric(); <font color="#ffffaa">// 创建一个二次几何体</font>
gluQuadricNormals(q, GL_SMOOTH); <font color="#ffffaa"> // 使用平滑法线</font>
gluQuadricTexture(q, GL_TRUE); <font color="#ffffaa">// 使用纹理</font>
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); <font color="#ffffaa">// 设置球纹理映射</font>
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
return TRUE; <font color="#ffffaa">// 初始化完成,成功返回</font>
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_26_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_26_files/l.png"><img src="Tutorial_26_files/l.png"></td>
<td valign="top" width="100%">下面的代码绘制我们的球</td>
<td background="Tutorial_26_files/r.png"><img src="Tutorial_26_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_26_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>void DrawObject() <font color="#ffffaa">// 绘制我们的球</font>
{
glColor3f(1.0f, 1.0f, 1.0f); <font color="#ffffaa">// 设置为白色</font>
glBindTexture(GL_TEXTURE_2D, texture[1]); <font color="#ffffaa">// 设置为球的纹理</font>
gluSphere(q, 0.35f, 32, 16); <font color="#ffffaa">// 绘制球</font></pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_26_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_26_files/l.png"><img src="Tutorial_26_files/l.png"></td>
<td valign="top" width="100%">绘制完一个白色的球后,我们使用环境贴图来绘制另一个球,把这两个球按alpha混合起来。</td>
<td background="Tutorial_26_files/r.png"><img src="Tutorial_26_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_26_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> glBindTexture(GL_TEXTURE_2D, texture[2]); <font color="#ffffaa">// 设置为环境纹理</font>
glColor4f(1.0f, 1.0f, 1.0f, 0.4f); <font color="#ffffaa">// 使用alpha为40%的白色</font>
glEnable(GL_BLEND); <font color="#ffffaa">// 启用混合</font>
glBlendFunc(GL_SRC_ALPHA, GL_ONE); <font color="#ffffaa">// 把原颜色的40%与目标颜色混合</font>
glEnable(GL_TEXTURE_GEN_S); <font color="#ffffaa">// 使用球映射</font>
glEnable(GL_TEXTURE_GEN_T);
gluSphere(q, 0.35f, 32, 16); <font color="#ffffaa">// 绘制球体,并混合</font>
glDisable(GL_TEXTURE_GEN_S); <font color="#ffffaa">// 让OpenGL回到默认的属性</font>
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_BLEND);
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_26_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_26_files/l.png"><img src="Tutorial_26_files/l.png"></td>
<td valign="top" width="100%">绘制地板</td>
<td background="Tutorial_26_files/r.png"><img src="Tutorial_26_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_26_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>void DrawFloor()
{
glBindTexture(GL_TEXTURE_2D, texture[0]); <font color="#ffffaa">// 选择地板纹理,地板由一个长方形组成</font>
glBegin(GL_QUADS);
glNormal3f(0.0, 1.0, 0.0);
glTexCoord2f(0.0f, 1.0f); <font color="#ffffaa">// 左下</font>
glVertex3f(-2.0, 0.0, 2.0);
glTexCoord2f(0.0f, 0.0f); <font color="#ffffaa">// 左上</font>
glVertex3f(-2.0, 0.0,-2.0);
glTexCoord2f(1.0f, 0.0f); <font color="#ffffaa">// 右上</font>
glVertex3f( 2.0, 0.0,-2.0);
glTexCoord2f(1.0f, 1.0f); <font color="#ffffaa">// 右下</font>
glVertex3f( 2.0, 0.0, 2.0);
glEnd();
}
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_26_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_26_files/l.png"><img src="Tutorial_26_files/l.png"></td>
<td valign="top" width="100%">现在到了我们绘制函数的地方,我们将把所有的模型结合起来创建一个反射的场景。<br>
向往常一样先把各个缓存清空,接着定义我们的剪切平面,它用来剪切我们的图像。这个平面的方程为equ[]={0,-1,0,0},向你所看到的它的法线是指向-y轴的,这告诉我们你只能看到y轴坐标小于0的像素,如果你启用剪切功能的话。<br>
关于剪切平面,我们在后面会做更多的讨论。继续吧:)</td>
<td background="Tutorial_26_files/r.png"><img src="Tutorial_26_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_26_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre>int DrawGLScene(GLvoid)
{
<font color="#ffffaa">// 清除缓存</font>
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
<font color="#ffffaa">// 设置剪切平面</font>
double eqr[] = {0.0f,-1.0f, 0.0f, 0.0f}; </pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_26_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_26_files/l.png"><img src="Tutorial_26_files/l.png"></td>
<td valign="top" width="100%">下面我们把地面向下平移0.6个单位,因为我们的眼睛在y=0的平面,如果不平移的话,那么看上去平面就会变为一条线,为了看起来更真实,我们平移了它。</td>
<td background="Tutorial_26_files/r.png"><img src="Tutorial_26_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_26_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3">
<pre> glLoadIdentity();
glTranslatef(0.0f, -0.6f, zoom); <font color="#ffffaa">// 平移和缩放地面</font>
</pre>
</font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_26_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_26_files/l.png"><img src="Tutorial_26_files/l.png"></td>
<td valign="top" width="100%">下面我们设置了颜色掩码,在默认情况下所有的颜色都可以写入,即在函数glColorMask中,所有的参数都被设为GL_TRUE,如果设为零表示这部分颜色不可写入。现在我们不希望在屏幕上绘制任何东西,所以把参数设为0。</td>
<td background="Tutorial_26_files/r.png"><img src="Tutorial_26_files/r.png"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/bl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/bc.png" height="28" width="100%"></td><td><img src="Tutorial_26_files/br.png" height="28" width="28"></td></tr></tbody></table><font color="#aaffaa" size="3"><pre> glColorMask(0,0,0,0);
</pre></font><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="Tutorial_26_files/tl.png" height="28" width="28"></td><td width="100%"><img src="Tutorial_26_files/tc.png" height="28" width="100%"></td><td><img src="Tutorial_26_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_26_files/l.png"><img src="Tutorial_26_files/l.png"></td>
<td valign="top" width="100%"><p>下面来设置蒙板缓存和蒙板测试。<br>
首先我们启用蒙板测试,这样就可以修改蒙板缓存中的值。</p>
<p>下面我们来解释蒙板测试函数的含义:<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -