OpenGL绘制半透明物体

http://bbs.pfan.cn/post-224877.htmlhtml

http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html
函数

1、使用混合来实现半透明效果
post

混合是什么呢?混合就是把两种颜色混在一块儿。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,经过某种方式混在一块儿,从而实现特殊的效果。
假设咱们须要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么能够先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,因而获得一种新的颜色,看上去就好像玻璃是半透明的。
要使用OpenGL的混合功能,只须要调用:glEnable(GL_BLEND);便可。
要关闭OpenGL的混合功能,只须要调用:glDisable(GL_BLEND);便可。
注意:只有在RGBA模式下,才可使用混合功能,颜色索引模式下是没法使用混合功能的。
测试

源因子和目标因子是能够经过glBlendFunc函数来进行设置的。
spa

2、二维图形混合orm

3、三维混合htm

深度缓冲是这样一段数据,它记录了每个像素距离观察者有多近。在启用深度缓冲测试的状况下,若是将要绘制的像素比原来的像素更近,则像素将被绘制。不然,像素就会被忽略掉,不进行绘制。这在绘制不透明的物体时很是有用——无论是先绘制近的物体再绘制远的物体,仍是先绘制远的物体再绘制近的物体,或者干脆以混乱的顺序进行绘制,最后的显示结果老是近的物体遮住远的物体。
然而在你须要实现半透明效果时,发现一切都不是那么美好了。若是你绘制了一个近距离的半透明物体,则它在深度缓冲区内保留了一些信息,使得远处的物体将没法再被绘制出来。虽然半透明的物体仍然半透明,但透过它看到的却不是正确的内容了。
要解决以上问题,须要在绘制半透明物体时将深度缓冲区设置为只读,这样一来,虽然半透明物体被绘制上去了,深度缓冲区还保持在原来的状态。若是再有一个物体出如今半透明物体以后,在不透明物体以前,则它也能够被绘制(由于此时深度缓冲区中记录的是那个不透明物体的深度)。之后再要绘制不透明物体时,只须要再将深度缓冲区设置为可读可写的形式便可。嗯?你问我怎么绘制一个一部分半透明一部分不透明的物体?这个好办,只须要把物体分为两个部分,一部分全是半透明的,一部分全是不透明的,分别绘制就能够了。
即便使用了以上技巧,咱们仍然不能为所欲为的按照混乱顺序来进行绘制。必须是先绘制不透明的物体,而后绘制透明的物体。
总结起来,绘制顺序就是:首先绘制全部不透明的物体。若是两个物体都是不透明的,则谁先谁后都没有关系。而后,将深度缓冲区设置为只读。接下来,绘制全部半透明的物体。若是两个物体都是半透明的,则谁先谁后只须要根据本身的意愿(注意了,先绘制的将成为“目标颜色”,后绘制的将成为“源颜色”,因此绘制的顺序将会对结果形成一些影响)。最后,将深度缓冲区设置为可读可写形式。
调用glDepthMask(GL_FALSE);可将深度缓冲区设置为只读形式。调用glDepthMask(GL_TRUE);可将深度缓冲区设置为可读可写形式。

blog

当先绘制半透明物体A时,若是不透明物体B在A的前面,这样将形成B、A同时绘制的错误。索引

相关文章
相关标签/搜索