以前用OGRE3D的时候,可以使用合成器来实现各种后期效果的合成。个人觉得运动模糊最炫了。于是就自己尝试着使用OPENGL渲染了一下。本方法完全属于我个人独创。(红宝书里没给例子,只是一带而过。网上的代码都不完整,看的我头晕~~于是才决定自己实现~~)。其实,这东东很简单。首先,你必须理解OPENGL累加缓存的意义和作用。明白自己要实现效果(比如运动模糊,景深,抗锯齿等等)的基本原理,OK,你就可以自己来实现你所想要的效果了。
首先,说说OPENGL累加缓存。和模板缓存一样,你不能直接去写它。必须从一个颜色缓存往里拷贝。实现各种叠加和累积操作之后,再从累加缓存中考到需要的缓存中(比如,颜色缓存)。这样就可以实现各种帧与帧之间的累积混合效果。
使用方法也很简单:
1. 设置刷新默认值, glClearAccum(r,g,b,a);
2. 在需要的时候进行刷新,glClear(GL_ACCUM_BUFFER_BIT); // 建议独立使用,没必要和深度、颜色、模板等在一起
3. 在需要的地方进行需要的操作, glAccum( op, value ); // 第一个参数指定操作类型,第二个为缩放因子(和操作配合使用)
详细的函数说明,可以参考OGL官网地址,如下:
http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node115.html
下面说说如何实现运动模糊。其实,运动模糊是把多次渲染的画面进行按比例叠加。如果世界是静止的,渲染所得到的所有图像都一样,那也就无所谓运动模糊了。在OGL里,我们可以在累加缓存中进行叠加,然后输出到颜色缓存。OK,太简单了吧?~是啊,的确很简单。我的实现都不超过50行代码,呵呵。下面说说我的实现思路。
第一次渲染:
首先,我把累加缓存清空(就清空这么一次,看来和其他缓存的清空分离是有必要的~)。
然后,渲染一次场景(如果你不想全场景都实现模糊,当然可以随意选择部分物体~),完全累加到累加缓存(GL_ACCUM操作,参数1)。
最后,把累加缓存的东东写到颜色缓存(GL_RETURN操作,参数1)。
逐帧渲染:
首先,渲染一次场景,按一定比例累加到累加缓存(GL_ACCUM操作,参数1/N)。
其次,然后缩放累加缓存中的值(GL_MULT操作,参数N/(N+1))。
最后,把累加缓存中的东东写到颜色缓存(GL_RETURN操作,参数1)。
OK,!~一切搞定。~~
这里对上述操作稍做说明:
首先,因为要逐帧累加,故第一次要全值拷到颜色缓存,不然,最初显示会由暗慢慢变量。(呵呵,这不是我需要的效果~~)
其次,因为不断的累加颜色,会导致很快超额”曝光“,整个屏幕就一片泛白了~所以,需要在每次累加之后进行适当的缩放。~
最后,N取值要适当,不能太大。否则,拖影会消失的很慢。太小会看不到效果~~(下面截图,我的取值为4)
好了,看看效果。是不是和OGRE合成器的效果一样呢~
呵呵,是不是这样的粒子系统更炫~~
呵呵,是不是有点感觉。嗯,作为对比。再来看看OGRE3D合成器的效果: