⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tutorial_26.htm

📁 如果你相信它就好好学学吧,同样这里也只是个入门
💻 HTM
📖 第 1 页 / 共 4 页
字号:
当你使用glEnable(GL_STENCIL_TEST)启用蒙板测试之后,蒙板函数用于确定一个颜色片段是应该丢弃还是保留(被绘制)。蒙板缓存区
中的值与参考值ref进行比较,比较标准是func所指定的比较函数。参考值和蒙板缓存区的值都可以与掩码进行为AND操作。蒙板测试的结果还导致蒙板缓
存区根据glStencilOp函数所指定的行为进行修改。<br>
        func的参数值如下: </p>
      <table border="1" width="100%">
  <tbody><tr> 
    <td>常量</td>
    <td>含义</td>
  </tr>
  <tr> 
    <td>GL_NEVER</td>
    <td>从不通过蒙板测试</td>
  </tr>
  <tr> 
    <td>GL_ALWAYS</td>
    <td>总是通过蒙板测试</td>
  </tr>
  <tr> 
    <td>GL_LESS</td>
    <td>只有参考值&lt;(蒙板缓存区的值&amp;mask)时才通过</td>
  </tr>
  <tr> 
    <td>GL_LEQUAL</td>
    <td>只有参考值&lt;=(蒙板缓存区的值&amp;mask)时才通过</td>
  </tr>
  <tr> 
    <td>GL_EQUAL</td>
    <td>只有参考值=(蒙板缓存区的值&amp;mask)时才通过</td>
  </tr>
  <tr> 
    <td>GL_GEQUAL</td>
    <td>只有参考值&gt;=(蒙板缓存区的值&amp;mask)时才通过</td>
  </tr>
  <tr> 
    <td>GL_GREATER</td>
    <td>只有参考值&gt;(蒙板缓存区的值&amp;mask)时才通过</td>
  </tr>
  <tr> 
    <td>GL_NOTEQUAL</td>
    <td>只有参考值!=(蒙板缓存区的值&amp;mask)时才通过</td>
  </tr>
</tbody></table>
	  
      <p>接下来我们解释glStencilOp函数,它用来根据比较结果修改蒙板缓存区中的值,它的函数原形为:<br>
        void glStencilOp(GLenum sfail, GLenum zfail, GLenum zpass),各个参数的含义如下:<br>
        <strong>sfail</strong><br>
        当蒙板测试失败时所执行的操作
</p><p><strong>zfail</strong><br>
  当蒙板测试通过,深度测试失败时所执行的操作 </p>
<p><strong>zpass</strong><br>
  当蒙板测试通过,深度测试通过时所执行的操作</p>
具体的操作包括以下几种<br>
<table border="1" width="100%">
  <tbody><tr> 
    <td>常量</td>
    <td>描述</td>
  </tr>
  <tr> 
    <td>GL_KEEP</td>
    <td>保持当前的蒙板缓存区值</td>
  </tr>
  <tr> 
    <td>GL_ZERO</td>
    <td>把当前的蒙板缓存区值设为0</td>
  </tr>
  <tr> 
    <td>GL_REPLACE</td>
    <td>用glStencilFunc函数所指定的参考值替换蒙板参数值</td>
  </tr>
  <tr> 
    <td>GL_INCR</td>
    <td>增加当前的蒙板缓存区值,但限制在允许的范围内</td>
  </tr>
  <tr> 
    <td>GL_DECR</td>
    <td>减少当前的蒙板缓存区值,但限制在允许的范围内</td>
  </tr>
  <tr> 
    <td>GL_INVERT</td>
    <td>将当前的蒙板缓存区值进行逐位的翻转</td>
  </tr>
</tbody></table>

      <p>当完成了以上操作后我们绘制一个地面,当然现在你什么也看不到,它只是把覆盖地面的蒙板缓存区中的相应位置设为1。</p>
      </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>	glEnable(GL_STENCIL_TEST);				<font color="#ffffaa">// 启用蒙板缓存</font>
	glStencilFunc(GL_ALWAYS, 1, 1);			<font color="#ffffaa">// 设置蒙板测试总是通过,参考值设为1,掩码值也设为1</font>
	glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);		<font color="#ffffaa">// 设置当深度测试不通过时,保留蒙板中的值不变。如果通过则使用参考值替换蒙板值</font>
	glDisable(GL_DEPTH_TEST);				<font color="#ffffaa">// 禁用深度测试</font>
	DrawFloor();					<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%">我们现在已经在蒙板缓存区中建立了地面的蒙板了,这是绘制影子的关键,如果想知道为什么,接着向后看吧:)
      <p>下面我们启用深度测试和绘制颜色,并相应设置蒙板测试和函数的值,这种设置可以使我们在屏幕上绘制而不改变蒙板缓存区的值。</p></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>	glEnable(GL_DEPTH_TEST);						<font color="#ffffaa">//启用深度测试</font>
	glColorMask(1,1,1,1);						<font color="#ffffaa">// 可以绘制颜色</font>
	glStencilFunc(GL_EQUAL, 1, 1);					<font color="#ffffaa">//下面的设置指定当我们绘制时,不改变蒙板缓存区的值</font>
	glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);		</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>	glEnable(GL_CLIP_PLANE0);						<font color="#ffffaa">// 使用剪切平面</font>
	glClipPlane(GL_CLIP_PLANE0, eqr);					<font color="#ffffaa">// 设置剪切平面为地面,并设置它的法线为向下</font>
	glPushMatrix();							<font color="#ffffaa">// 保存当前的矩阵</font>
		glScalef(1.0f, -1.0f, 1.0f);				<font color="#ffffaa">// 沿Y轴反转</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%">由于上面已经启用了蒙板缓存,则你只能在蒙板中值为1的地方绘制,反射的实质就是在反射屏幕的对应位置在绘制一个物体,并把它放置在反射平面中。下面的代码完成这个功能</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_POSITION, LightPos);			<font color="#ffffaa">// 设置灯光0</font>
		glTranslatef(0.0f, height, 0.0f);				
		glRotatef(xrot, 1.0f, 0.0f, 0.0f);				
		glRotatef(yrot, 0.0f, 1.0f, 0.0f);				
		DrawObject();						<font color="#ffffaa">// 绘制反射的球</font>
	glPopMatrix();							<font color="#ffffaa">// 弹出保存的矩阵</font>
	glDisable(GL_CLIP_PLANE0);						<font color="#ffffaa">// 禁用剪切平面</font>
	glDisable(GL_STENCIL_TEST);						<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>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -