![]()
![]()
![]()
 Blending is commonly used to make objects translucent.
  
  To view and understand some blending effects, it requieres some learning on how OpenGl computes Blending. This is a little longer so I put this in a Lesson 3.
  It is highly recommanded to read it for an accurate understanding of this
  tutorial.
   
![]()
In this tutorial, we will see some blending application, the
technique part is written in Lesson 3.
  
 Make an object translucent
  
  Mixing Pictures
  
 Filter effect
  
  Many other other effects can be created with blending. This tutorial will
  helps you understanding and create basic effects before trying to implement
  more advanced effects.
   
Translucent objects is the common use of Blending.
Physically, opaque material blocks light. In case of translucent material, light
is not blocked and go throw him. That's why we can see an object that is behind
another.
Without blending, when an object is rendered, all pixels drawn replace existing
pixels in the frame buffer. Transparency can be achieved by adding the
translucent object's color (srcColor) with the existing color (destColor).
  We can do this with the following factor :
    gl.glBlendFunc(GL.GL_ONE,
GL.GL_ONE)
  
  The Blending formula
  defined with glBlendFunc is :
    srcColor+destColor
 
Translucent object (1)  | 
    
     ...     //draw the background  | 
    
In case of multiple translucent object, disable the
writting in the depth buffer (Lesson
3). Original depth value will be keeped and will let all translucent object
be rendered if they are closer than opaque objects.
  
  You can control how the object is translucent. To do this, we will use the
  alpha component of the color : 
    gl.glBlendFunc(GL.GL_SRC_ALPHA,
GL.GL_ONE)
  The equivalent Blending formula is :
  alpha*srcColor+destColor
 
Translucent object (2)  | 
    
     ...     //draw the background  | 
    
    
    Translucent object
I will show you how to mix textures using blending. We have two images
and we want to mix them by keeping 25% of the first one with 75% of the second
one.
  
  Here, I explain  two  methods, based on the alpha value, to creates this  effect.
   
To achieve this effect, we draw the first image with blending mode disabled
(first image can be the background of the scene).
  
  After, we will to keeps only 25% of the color of this picture (ie 25% of its 'brightness').
  At this step, this picture is the destination because it is already drawn in
  the frame buffer. The source is the second image and we want 75% of its color.
  To achieve this effect, we need to multiply the source color by 75% (which is
  the source factor) and the destination color by 25% (which is the destination
  factor).
  
  We can notice the destination factor is 1 minus the source factor, so the
  blending formula is :
    srcAlpha*srcColor+(1-srcColor)*destColor
  which can be translated to OpenGl (using Blending formula)
  with :
    //                 3/4 of the src     1-3/4 = 1/4 of the dest
    gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
  
  The alpha value is 0.75.
   
Mixing two pictures (1)  | 
    
     gl.glEnable(GL_BLEND)  | 
    
Here is second method to do exactly the same thing.
Instead of drawing the first picture at full brightness, we will keep only 25%
of its color. For this we will set a alpha value of 0.25 as source factor, the
destination factor will be 0 (GL_ZERO).
The second picture will be drawn with the same source factor but with 0.75 as
alpha. The destination factor is one (GL_ONE)
to keep all existing color (already blended with first step).
 
Mixing two pictures (2)  | 
    
     gl.glEnable(GL_BLEND)  | 
    
By varying the mixing percentage between two pictures, I've made this little animation :
 
  Mixing effect animation
This exemple show how to use blending to make a color filter.
Previous effect was based on the alpha value of the color, here we will use the
rgb color components.
   
A mask is a picture which defines two areas. An area which
blocks color (black pixels of the mask picture), another area which leave
un-touched color (white pixels of the mask).
  
  An exemple of this effect is shown by those pictures :
![]()  | 
      
![]()  | 
      
| Mask on pictures | 
This effect can be used to apply a mask on the entire scene to clip a region of the scene (ex: sight of a weapon on a shooter game, binoculars ...).
One region can be used to render the scene, the second region for rendering the
menu
  
  We draw the mask first with blending disabled. We obtain an area with black (0, 0, 0) or white (1, 1, 1)
  pixels.
  Now, we want to render the second picture only onto white pixels. This is
  equivalent to multiply the source color with the destination color.
  Effectively, where the destination contains black pixel then the result is
  zero (blocked) and where the destination contains white color then the result
  is the source color (keep un-touched).
  
  So, we want :
    srcColor*destColor
  This can be achieved with (using ):
    gl.glBlendFunc(GL_DST_COLOR, GL_ZERO)    
  //Blending formula with
  these factors : srcColor*destColor+0*destColor = srcColor*destColor
 
Mask on pictures  | 
    
    
      ...    //draw the mask  | 
    
 Remark : This is equivalent to draw the image first, then the mask.
  Note: If you want to draw on black pixel, try
  GL_ONE_MINUS_DST_COLOR instead of
  GL_DST_COLOR.
 
Suppose that we have a photographic filter that blocks 50% of the red, 10% of green and 25% of the blue. The color that we saw is composed of 50% of red, 90% of green and 75% of blue of the original color.
  We will see how to do this.
  
  This filter is equivalent to multiply the (r, g, b) color by (0.5, 0.9, 0.75).
  The background is already drawn (landscape for exemple), it is the destination.
  The destination color is fixed and we can't modify it.
  To multiply the destination by (0.5, 0.9, 0.75), we needs a source color equal to this value. To have this source color, you can create a picture in your paint program. Set the background to the color to (0.5*255, 0.9*255, 0.75*255)
  ie (127, 229, 191).
   
Color Filter  | 
    
    
      ...      //drawing of the background  | 
    
Here is a rainbow of color that is filter by the filter described previously. This animation below show the result with and without blending activated.
 
  Enable/disable photographic filter
You can notice the red strip lose a lot of brightness. In the opposite, the
green strip keeps pratically its original brightness.
This method can be extended to a variable filter by using a filter picture with
variable color. For example, a high filter concentrated at the center which
becomes lighter at the bounds.
Note: the filter described here be achieved
without blending like described underneath, using blending is only valuable in
case of a variable filter.
Color Filter (without blending)  | 
    
     
      gl.glColor3f(0.5f, 0.9f, 0.75f);  | 
    
 ![]()
 1-6 : select a scene
  B : enable/disable  blending
  + : increase  alpha value (for the scenes 1, 2 & 3)
  - : decrease  alpha value (for the scenes 1, 2 & 3)
   
 ![]()
Remember to download the GraphicEngine-1.1.2 to run this tutorial !
Tutorial 9 src (142 ko) //Port to Jogl JSR-231 initially done by Magarrett Dias
If you've got any remarks on this tutorial, please let
me know to improve
it.
Thanks for your feedback.
 
![]()
![]()
| Copyright © 2004-2012 Jérôme Jouvie - All rights reserved. | http://jerome.jouvie.free.fr/ |