辉光效果经常用来做一些物体的自发光,这种发光效果不需要光照计算,只是在贴图上进行发光的模拟效果,所以有着很好的效率。辉光效果意味着贴图会变亮。为了对发光的部分做计算,需要一张glowmap贴图,当我们使用src和dst都为GL_ONE的方式,混合glowmap和原图时,原图就会对按照glowmap的样子变亮了~但是作为辉光的效果,仅仅只有变亮是不够的,由于光线在穿过空气时亮度会衰减,所以周围会有一圈逐渐消失的光晕。所以我们利用原图的模糊贴图的做glowmap,这样辉光就会有很好的光晕效果了~因为简单模糊效果不够细腻,光晕效果会不是很好,所以我们用高斯模糊来实现~
这次,我们需要对一个节点树的做高斯模糊处理,原因是这样之后,可以实现节点树的辉光效果,另外,单张贴图图片边缘不能模糊延伸的问题也可以得到解决~由于之前高斯模糊是需要做一次RTT才能实现的,而在这之前,要得到节点树的整屏贴图也要做一次RTT,所以,这次渲染过程中包含有两次RTT,按照先后顺序,具体作用分别是:生成节点树的贴图,做横向的高斯模糊。
void CCEffectSprite::visitGlow()
{
float blursDis[2] = {_pixelSpan/_screenBufferSize.width, _pixelSpan/_screenBufferSize.height};
GLint size = sizeof(ccV3F_C4B_T2F);
long data = (long)&m_sQuad;
/**/
// gen a empty texture
glGenTextures(1, &_texture);
glBindTexture(GL_TEXTURE_2D, _texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _screenBufferSize.width, _screenBufferSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// gen a off-screen framebuffer
GLint oldFBO;
glGetIntegerv(GL_RENDERBUFFER_BINDING, &oldFBO);
glGenFramebuffers(1, &_framebuff