登录 注册
当前位置:主页 > 资源下载 > 50 > 实现嵌入式系统编程的三维混合C/C++方案

实现嵌入式系统编程的三维混合C/C++方案

  • 更新:2024-06-23 23:41:32
  • 大小:859KB
  • 推荐:★★★★★
  • 来源:网友上传分享
  • 类别:嵌入式 - 硬件开发
  • 格式:PDF

资源介绍

二、 实现三维混合 也许你迫不及待的想要绘制一个三维的带有半透明物体的场景了。但是现在恐怕还不行, 还有一点是在进行三维场景的混合时必须注意的,那就是深度缓冲。 深度缓冲是这样一段数据,它记录了每一个像素距离观察者有多近。在启用深度缓冲测 试的情况下,如果将要绘制的像素比原来的像素更近,则像素将被绘制。否则,像素就 会被忽略掉,不进行绘制。这在绘制不透明的物体时非常有用——不管是先绘制近的物 体再绘制远的物体,还是先绘制远的物体再绘制近的物体,或者干脆以混乱的顺序进行 绘制,最后的显示结果总是近的物体遮住远的物体。 然而在你需要实现半透明效果时,发现一切都不是那么美好了。如果你绘制了一个近距 离的半透明物体,则它在深度缓冲区内保留了一些信息,使得远处的物体将无法再被绘 制出来。虽然半透明的物体仍然半透明,但透过它看到的却不是正确的内容了。 要解决以上问题,需要在绘制半透明物体时将深度缓冲区设置为只读,这样一来,虽然 半透明物体被绘制上去了,深度缓冲区还保持在原来的状态。如果再有一个物体出现在 半透明物体之后,在不透明物体之前,则它也可以被绘制(因为此时深度缓冲区中记录 的是那个不透明物体的深度)。以后再要绘制不透明物体时,只需要再将深度缓冲区设置 为可读可写的形式即可。嗯?你问我怎么绘制一个一部分半透明一部分不透明的物体? 这个好办,只需要把物体分为两个部分,一部分全是半透明的,一部分全是不透明的, 分别绘制就可以了。 即使使用了以上技巧,我们仍然不能随心所欲的按照混乱顺序来进行绘制。必须是先绘 制不透明的物体,然后绘制透明的物体。否则,假设背景为蓝色,近处一块红色玻璃, 中间一个绿色物体。如果先绘制红色半透明玻璃的话,它先和蓝色背景进行混合,则以 后绘制中间的绿色物体时,想单独与红色玻璃混合已经不能实现了。 总结起来,绘制顺序就是:首先绘制所有不透明的物体。如果两个物体都是不透明的, 则谁先谁后都没有关系。然后,将深度缓冲区设置为只读。接下来,绘制所有半透明的 物体。如果两个物体都是半透明的,则谁先谁后只需要根据自己的意愿(注意了,先绘 制的将成为“目标颜色”,后绘制的将成为“源颜色”,所以绘制的顺序将会对结果造成一 些影响)。最后,将深度缓冲区设置为可读可写形式。 调 用 glDepthMask(GL_FALSE); 可 将 深 度 缓 冲 区 设 置 为 只 读 形 式 。 调 用 glDepthMask(GL_TRUE);可将深度缓冲区设置为可读可写形式。 一些网上的教程,包括大名鼎鼎的 NeHe 教程,都在使用三维混合时直接将深度缓冲区 禁用,即调用 glDisable(GL_DEPTH_TEST);。这样做并不正确。如果先绘制一个不透明