I remember seeing a shader application demo in the forums somewhere sometime ago, but the thing that sets that apart from yours is that your method can allow multiple shaders to be applied to one image at a time. Works great.
Actually, one problem I have right now is the picture getting brighter when I apply a shader. I'm pretty much a noob at GLSL so please help me out!
(Based on
http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/)
"blurHorizontal.frg"
Code:
uniform sampler2D RTScene; // the texture with the scene you want to blur
varying vec2 vTexCoord;
const float blurSize = 1.0/512.0; // I've chosen this size because this will result in that every step will be one pixel wide if the RTScene texture is of size 512x512
void main(void)
{
vec4 sum = vec4(0.0);
// blur in x (horizontal)
// take nine samples, with the distance blurSize between them
sum += texture2D(RTScene, gl_TexCoord[0].st + vec2(vTexCoord.x - 4.0*blurSize, vTexCoord.y)) * 0.05;
sum += texture2D(RTScene, gl_TexCoord[0].st + vec2(vTexCoord.x - 3.0*blurSize, vTexCoord.y)) * 0.09;
sum += texture2D(RTScene, gl_TexCoord[0].st + vec2(vTexCoord.x - 2.0*blurSize, vTexCoord.y)) * 0.12;
sum += texture2D(RTScene, gl_TexCoord[0].st + vec2(vTexCoord.x - blurSize, vTexCoord.y)) * 0.15;
sum += texture2D(RTScene, gl_TexCoord[0].st + vec2(vTexCoord.x, vTexCoord.y)) * 0.16;
sum += texture2D(RTScene, gl_TexCoord[0].st + vec2(vTexCoord.x + blurSize, vTexCoord.y)) * 0.15;
sum += texture2D(RTScene, gl_TexCoord[0].st + vec2(vTexCoord.x + 2.0*blurSize, vTexCoord.y)) * 0.12;
sum += texture2D(RTScene, gl_TexCoord[0].st + vec2(vTexCoord.x + 3.0*blurSize, vTexCoord.y)) * 0.09;
sum += texture2D(RTScene, gl_TexCoord[0].st + vec2(vTexCoord.x + 4.0*blurSize, vTexCoord.y)) * 0.05;
gl_FragColor = sum;
}
"blurVertical.frg"Code:
uniform sampler2D colorMap; // this should hold the texture rendered by the horizontal blur pass
varying vec2 vTexCoord;
const float blurSize = 1.0 / 512.0;
void main( void )
{
vec4 sum = vec4( 0.0 );
// blur in y (vertical)
// take nine samples, with the distance blurSize between them
sum += texture2D(colorMap, gl_TexCoord[0].st + vec2(vTexCoord.x, vTexCoord.y - 4.0*blurSize)) * 0.05;
sum += texture2D(colorMap, gl_TexCoord[0].st + vec2(vTexCoord.x, vTexCoord.y - 3.0*blurSize)) * 0.09;
sum += texture2D(colorMap, gl_TexCoord[0].st + vec2(vTexCoord.x, vTexCoord.y - 2.0*blurSize)) * 0.12;
sum += texture2D(colorMap, gl_TexCoord[0].st + vec2(vTexCoord.x, vTexCoord.y - blurSize)) * 0.15;
sum += texture2D(colorMap, gl_TexCoord[0].st + vec2(vTexCoord.x, vTexCoord.y)) * 0.16;
sum += texture2D(colorMap, gl_TexCoord[0].st + vec2(vTexCoord.x, vTexCoord.y + blurSize)) * 0.15;
sum += texture2D(colorMap, gl_TexCoord[0].st + vec2(vTexCoord.x, vTexCoord.y + 2.0*blurSize)) * 0.12;
sum += texture2D(colorMap, gl_TexCoord[0].st + vec2(vTexCoord.x, vTexCoord.y + 3.0*blurSize)) * 0.09;
sum += texture2D(colorMap, gl_TexCoord[0].st + vec2(vTexCoord.x, vTexCoord.y + 4.0*blurSize)) * 0.05;
gl_FragColor = sum;
}
"basicVert.vrt"Code:
uniform float width;
uniform float height;
void main(void)
{
vec4 a = gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_FrontColor = gl_Color;
gl_Position = gl_ModelViewProjectionMatrix * a;
}
The code:
Init
Code:
blurH = Shader.makeShader( "data/basicVert.vrt", "data/blurHorizontal.frg" );
blurV = Shader.makeShader( "data/basicVert.vrt", "data/blurVertical.frg" );
Render
Code:
blurH.startShader();
blurV.startShader();
myImage.draw( x, y );