OpenGL has a wide array of different blend functions that it
will do for you with the change of a state.
However getting your scene to blend
nicely can be tricky, especially when you have multiple passes you want to
composite together and having transparent objects just makes blending even
trickier.
The OpenGL wiki has a fantastic page about all of the
different blending options in OpenGL so I won’t spend a lot of time restating what that very
descriptive wiki page already states.
The basic idea of blending is: if you are
drawing an object on top of another, how do the overlapping fragments behave.
If you have an opaque
object with depth testing enabled, the fragments that belong to the object that
is closer to the camera will be drawn with full opacity. Simple enough but if
you have a transparent object in front of an object, you need to take the alpha
channel of the fragment into considering. Fortunately there are built in OpenGL
blend functions that do this for you. However it is up to you to draw the
objects in the correct order (transparent objects are drawn last).
Here is a demonstration of the light accumulation pass in A
Case of the Mondays using a couple of
different blending modes.
Above is a screenshot of the light accumulation using the following blending states:
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Here is the same screenshot using different blending options:
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);
Notice that the two images look very different and all I did was change a few OpenGL states. The first image is a lot darker than the second. In the game we use the second option simply because the light has more of a presence and therefore influence in the scene.
No comments:
Post a Comment