This is glow effect w/o fragment program/shader. This code use RenderTexture class (you can find it on sourceforge). Trick is to do ping-pong between two pbuffers. First do horizontal blur and then vertical using same gaussian coefficients.
RenderTexture* MakeGlow(RenderTexture* src, RenderTexture* rtt, int w, int h, int num_passes, float* c, int len, float scale)
{
int i,j;
src->BeginCapture();
{
glClear(GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION); glLoadIdentity();
glMatrixMode(GL_MODELVIEW); glLoadIdentity();
}
src->EndCapture();
rtt->BeginCapture();
{
glClear(GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION); glLoadIdentity();
glMatrixMode(GL_MODELVIEW); glLoadIdentity();
}
rtt->EndCapture();
float pola = len/2.0f;
float dx = 1.0f/(float)w;
float dy = 1.0f/(float)h;
RenderTexture* t;
for (i=0; i<num_passes; i++)
{
rtt->BeginCapture();
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
src->Bind();
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE);
glBegin(GL_QUADS);
for (j=0; j<=len; j++)
{
float xofs = (float)(j-pola)*dx*scale;
glColor4f(c[j], c[j], c[j], 1.0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f+xofs, -1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f+xofs, -1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f+xofs, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f+xofs, 1.0f, 0.0f);
}
glEnd();
glDisable(GL_BLEND);
}
rtt->EndCapture();
t = src; src = rtt; rtt = t;
}
for (i=0; i<num_passes; i++)
{
rtt->BeginCapture();
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
src->Bind();
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE);
glBegin(GL_QUADS);
for (j=0; j<=len; j++)
{
float yofs = (float)(j-pola)*dy*scale;
glColor4f(c[j], c[j], c[j], 1.0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f+yofs, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f+yofs, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f+yofs, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f+yofs, 0.0f);
}
glEnd();
glDisable(GL_BLEND);
}
rtt->EndCapture();
t = src; src = rtt; rtt = t;
}
return src;
}
And use it:
// size of texture
#define RTTX 128
#define RTTY 128
// select your convolution kernel size
#define BLUR_KERNEL_LEVEL 10
float blurKernel[BLUR_KERNEL_LEVEL+1] = {place your normalized gaussian coeeffs};
float blur_scale = 1.0f; // optional param for overbright control
rtt1->BeginCapture();
{
RenderYourScene();
}
rtt1->EndCapture();
RenderTexture* BLUR = MakeGlow(rtt1, rtt2, RTTX, RTTY, 1, blurKernel, BLUR_KERNEL_LEVEL, blur_scale);
// now BLUR contain blured scene
yooyo