Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Page 1 of 2 12 LastLast
Results 1 to 10 of 13

Thread: Gaussian Blur on texture

  1. #1
    Advanced Member Frequent Contributor
    Join Date
    Dec 2005
    Location
    Italy
    Posts
    655

    Gaussian Blur on texture

    Hi All,

    I have a texture generated on the fly (via FBO) with the model shadow. This is a black and transparent texture with - of course - many stair steps between (on/off) pixels.

    I was thiking to add Gaussian Blur on the whole bitmap. I found the algorithm you see below but it works pixel by pixel.

    Now the questions are:

    1) Does OpenGL provide some built in algorithm to do this?
    2) What is the fastest method to change pixel color on a texture?
    3) Does some other different approach exist to obtain the same result?

    Thanks so much as usually!

    Alberto

    Code :
    #define gauss_width 7
     
    sumr=0;
    sumg=0;
    sumb=0;
     
    int gauss_fact[gauss_width]={1,6,15,20,15,6,1};
    int gauss_sum=64;
     
    for(i=1;i<temp->w-1;i++){
      for(j=1;j<temp->h-1;j++){
        sumr=0;
        sumg=0;
        sumb=0;
        for(k=0;k<gauss_width;k++){
          color=getpixel(temp,i-((gauss_width-1)>>1)+k,j);
          r=getr32(color);
          g=getg32(color);
          b=getb32(color);
          sumr+=r*gauss_fact[k];
          sumg+=g*gauss_fact[k];
          sumb+=b*gauss_fact[k];
     
        }
        putpixel(temp1,i,j,makecol(sumr/gauss_sum,sumg/gauss_sum,
          sumb/gauss_sum));
      } 
    }
     
    for(i=1;i<temp->w-1;i++){
      for(j=1;j<temp->h-1;j++){
        sumr=0;
        sumg=0;
        sumb=0;
        for(k=0;k<gauss_width;k++){
          color=getpixel(temp1,i,j-((gauss_width-1)>>1)+k);
          r=getr32(color);
          g=getg32(color);
          b=getb32(color);
     
          sumr+=r*gauss_fact[k];
          sumg+=g*gauss_fact[k];
          sumb+=b*gauss_fact[k];
        }
        sumr/=gauss_sum;
        sumg/=gauss_sum;
        sumb/=gauss_sum;
     
        putpixel(temp2,i,j,makecol(sumr,sumg,sumb));
      } 
    }

  2. #2
    Advanced Member Frequent Contributor yooyo's Avatar
    Join Date
    Apr 2003
    Location
    Belgrade, Serbia
    Posts
    872

    Re: Gaussian Blur on texture

    As you can see in that algorithm.. do the same.. but you cant write (setpixel) into the same texture. So.. do the ping-pong... create another texture (same size as original) and do horizontal blur. Then use that new texture as source for vertical blur.
    Code :
    fbo1 is original fbo
    fbo2 is temporary fbo
     
    fbo2 = horizontal_blur(fbo1) // step 1.. read from fbo1, write to fbo2
    fbo1 = vertical_blur(fbo2)   // step 2.. read from fbo2, write to fbo1
     
    now, fbo1 contains blurred image.

    Even more, you can repeat step1 and step2 several times to blur more.

  3. #3
    Senior Member OpenGL Pro dletozeun's Avatar
    Join Date
    Jan 2006
    Location
    FRANCE
    Posts
    1,367

    Re: Gaussian Blur on texture


  4. #4
    Advanced Member Frequent Contributor
    Join Date
    Dec 2005
    Location
    Italy
    Posts
    655

    Re: Gaussian Blur on texture

    Thanks guy,

    I now have the doubt that using this extension "EXT_convolution" I can do it via hardware. Do you know if it is true?

    Thanks.

    Alberto

  5. #5
    Junior Member Regular Contributor
    Join Date
    Aug 2007
    Location
    USA
    Posts
    243

    Re: Gaussian Blur on texture

    In my experience some/most of the imaging extensions (including convolution) are not HW accelerated.

  6. #6
    Advanced Member Frequent Contributor
    Join Date
    Dec 2005
    Location
    Italy
    Posts
    655

    Re: Gaussian Blur on texture

    No I am certain, the best way to do what we need are Shaders. Does anybody know a good 'basic' tutorial on the Shaders based convulution filter?

    Thanks.

    Alberto

  7. #7
    Member Regular Contributor
    Join Date
    Jul 2005
    Location
    Germany
    Posts
    304

    Re: Gaussian Blur on texture

    Code :
    /////////////////////////////////////////////////
    // 7x1 gaussian blur fragment shader
    /////////////////////////////////////////////////
     
    varying vec2 v_Coordinates;
     
    uniform vec2 u_Scale;
    uniform sampler2D u_Texture0;
     
    const vec2 gaussFilter[7] = 
    { 
    	-3.0,	0.015625,
    	-2.0,	0.09375,
    	-1.0,	0.234375,
    	0.0,	0.3125,
    	1.0,	0.234375,
    	2.0,	0.09375,
    	3.0,	0.015625
    };
     
    void main()
    {
    	vec4 color = 0.0;
    	for( int i = 0; i < 7; i++ )
    	{
    		color += texture2D( u_Texture0, vec2( v_Coordinates.x+gaussFilter[i].x*u_Scale.x, v_Coordinates.y+gaussFilter[i].x*u_Scale.y ) )*gaussFilter[i].y;
    	}
     
    	gl_FragColor = color;
    }

    u_Scale is vec2(0, 1.0/height ) for vertical blur and vec2(1.0/width, 0 ) for horizontal blur.

  8. #8
    Advanced Member Frequent Contributor
    Join Date
    Dec 2005
    Location
    Italy
    Posts
    655

    Re: Gaussian Blur on texture

    Thanks a lot vexator,

    You all Shaders expert use shader program only code samples but for us old OpenGL programmers the rest is still not so easy to add.

    Can you please add also the gl calls to make this shader to run?

    Thanks so much,

    Alberto

  9. #9
    Senior Member OpenGL Pro dletozeun's Avatar
    Join Date
    Jan 2006
    Location
    FRANCE
    Posts
    1,367

    Re: Gaussian Blur on texture

    You will need a good glsl tutorial:
    http://www.lighthouse3d.com/opengl/glsl/

  10. #10
    Advanced Member Frequent Contributor
    Join Date
    Dec 2005
    Location
    Italy
    Posts
    655

    Re: Gaussian Blur on texture

    Hi Vexator,


    Please help me to make this shader to work.

    What are variables we need to initialize?

    How can we perform the blur in both directions?


    Thanks,

    Alberto

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •