|
Features

Real-Time
Glow
Other Uses for Blur
Beyond the use discussed so far--simulating
the perception of high-dynamic-range intensity values--this method
of convolution and blurring can be used for a variety of other effects.
It can be used to compute various degrees of focus for depth-of-field
effects, where scene depth information may be used to control the
degree of blur. It can be used to soften the edges of projected
texture shadows or to accumulate results for percentage-closer filtering
of depth shadow maps. A large-area convolution can be applied to
an environment map to create an approximate irradiance map for more
realistic scene lighting (Ramamoorthi and Hanrahan 2001). Many nonphotorealistic
rendering techniques and other special effects can be done with
large-area convolutions.
Among these are effects for frosted
glass, lens flares that simulate diffraction, and
approximations of subsurface scattering for rendering
skin.
Adding the Effects to a Game
Engine
Next, we focus on how the visual
effects were used for Buena Vista Interactives
game, Tron 2.0, in which they played a significant
role in the unique visual style of the game. Implementing
these effects was surprisingly straightforward. However,
some important issues had to be addressed before the
effects could be robust enough for use throughout
the wide range of situations in the game. Plus, some
interesting effects and alternate uses for the glow
were discovered during development.
Rendering Context. The first issue we
addressed was how to render the source image that would be blurred
to create the final screen glow. In Tron 2.0, there were
two rendering pipelines: one for rendering the world geometry and
one for rendering the models. Both rendering pipelines needed to
be extended to support the concept of a rendering context, which
allows the scene to be rendered in different ways for different
purposes. Two rendering contexts were needed for Tron 2.0.
One was normal rendering, which was used to handle the initial
rendering of the scene without any screen glow. The second rendering
context was glow rendering, which was used when rendering
the source image for the glow.
The implementation of a rendering
context varies widely among applications, but for
illustrative purposes, we will describe how we created
the model-rendering pipeline in Tron 2.0. The
model rendering is based on a mesh and a collection
of render states that indicate how the model should
be rendered. These render states are stored as an
external resource called a render style. To
support the idea of contexts, this system was extended
to allow artists to set up a table that would map
any render style to a corresponding render style when
rendering the glow. Through this mechanism, when rendering
the scene normally, the original render style would
be used, which would render the model as one would
see it if the glow were disabled. Then when rendering
the source image for the glow, it would instead use
the render style that was found in the map that the
artists had set up, which would render the glowing
parts of the model. The artists found this system
to be very flexible and easy to use, as it gave them
control over which objects should glow and how each
object should glow. Figure 21-7 shows the plain character
model, the artist-created glow texture information,
and the glow effect applied to the model.
Aliasing Issues. The problem of aliasing
immediately appeared when we extended the glow effect from a simple
test case to a full game scene. The Tron universe is characterized
by strips of brightly colored geometry within the scene, almost
like neon edging on the characters and their surroundings. In addition,
most of the environments are vast, so these glowing strips of geometry
range from very close to the camera to far off in the distance.
We used a glow texture of 256×256 for Tron 2.0 to allow
for a fairly large blur with a minimal number of passes. The downside
to this approach, though, was that this caused serious aliasing
issues when rendering to the source image, and the aliasing became
very apparent as the player moved or looked around.
To address this issue, we added
support for artist-controlled fog that would be used
only when rendering the source image for the screen
glow. The fog would be enabled in large levels and
set to black. Because of the additive blending of
the screen glow, the black fog in the source image
would result in distant objects contributing only
faintly, if at all, to the final screen glow. Thus,
the aliasing in the distance was made much less noticeable.
It isn't a perfect solution--for example, parts
of the scene in the distance will not glow--but it is generally
more acceptable visually than the aliasing artifacts are. In addition
to avoiding aliasing, the fog was used in several places throughout
the game in unanticipated ways to create extra atmosphere, such
as that shown in Figure 8.
DirectX 7 Accuracy Issues. To fit the
blend weight into a color component, the initial DirectX 7 implementation
scaled it from the initial range of [0, 1] to an integer between
0 and 255. Most of these weights were very small, though, and thus
not well spread over the full range. Consequently, the errors that
occurred when converting to an integer resulted in a substantial
visual difference between the DirectX 7 and 8 implementations. Even
with rounding, the glow still appeared significantly different.
The solution? Perform the rounding,
but first determine how much the resulting value differed
from the actual value, and then apply the difference
to the next weight calculated. For example, a weight
of 0.13, when scaled by 255, is 33.15, which rounds
to the integer value of 33. Therefore, the weight
used for the color would be 33, and the left-over
portion (the 0.15) would be added to the next weight
to be rendered. As a result, the DirectX 7 and 8 implementations
were visually almost identical.
The After-Image Effect. One effect didnt
make it into Tron 2.0 because it was discovered too late.
It turns out that the previous frames source texture can be
added to the current frames source texture, resulting in a
very nice streaking of the glow as players move or look around.
The technique is very simple to implement. It consists of an extra
texture surface so the source image can be preserved for the following
frame, and an additive blend that adds the previous source image
to the current source image. This technique works by saving the
image immediately before the blur is applied and then applying the
blur. The saved image is added to the source image of the next frame,
but it is dimmed slightly. As this process is repeated over a number
of frames, it allows objects to fade out of the glow instead of
instantly disappearing, which not only makes the effect more compelling,
but also helps hide aliasing of the source image.
The degree of dimming applied to
the previous frame before adding the frame to the
current frames glow source can be changed dynamically,
resulting in a wide range of appearance. For example,
by dimming the previous frame significantly, there
will be very little after-image, and it will appear
to users as only a brief burn-in of light in their
retina, giving the look of a much brighter light.
By dimming the previous frame less before adding it,
the blurring and streaking becomes much more apparent
and has the effect on the player of appearing drunk
or near death.
One alternative does not require
an additional buffer. We can use the previous frames
final screen-glow texture after the blur, which saves
memory because the source image does not need to be
preserved. However, this solution does have certain
issues. If the previous frames glow texture
is too bright, it can bleed out of control when recursively
added, continually blurring outward in each frame,
eventually resulting in a fully white screen glow.
To avoid this case, we have to be careful when setting
up the blend weights and determining how much to dim
the previous frame.
The Variable Ramping Effect. The screen
glow must use a certain set of parameters--such as blending weights
and fog--to create the final blur for a single frame. However, that
doesn't mean the parameters cant change from frame to frame.
In fact, by varying any of these parameters, you can achieve a variety
of interesting effects. For example, in one of the levels of Tron
2.0, the player is inside a corrupted server that has a sickly
green glow. To convey the unstable feeling, the blend weights of
the blur were ramped from low to high to create a dull pulsing of
the screen glow. See Figure 9.
Although not used in the game, other
effects can be just as easily achieved. For example,
by ramping the screen glow fog in and out, or changing
the color of the fog, you can easily and efficiently
make the atmosphere of a level feel as if it were
constantly changing.
Conclusion
Large blurs and convolutions can be computed
efficiently in real time on a broad range of graphics hardware.
The code for processing and creating these effects is easily encapsulated
into a few C++ classes or a small library. These classes and sample
code are available on NVIDIA's Developer Web site, developer.nvidia.com.
The effect requires additional data to specify the brightness of
glow sources, and this data can be incorporated into existing texture
assets, namely the texture alpha channel. The effect offers intuitive
controls for the brightness and shape of the glow. The ability to
apply largearea convolutions to full-screen rendering is useful
for a wide variety of effects. It is key to depicting bright objects
in a scene and can greatly enhance the look and quality of real-time
rendering.
Screen glow is one of the rare effects
that are robust enough to be easily extended for use
in nearly every situation, yet it is versatile enough
to allow numerous additional effects to be created
through it. The final effect is subtle but powerful,
and well worth prototyping in any game.
References
Chiu, K., M. Herf, P. Shirley, S. Swamy, C.
Wang, and K. Zimmerman. 1993. "Spatially Nonuniform Scaling
Functions for High Contrast Images."Graphics Interface
'93, pp. 245-253. GPGPU Web site. 2003. http://www.gpgpu.org
James, Greg. 2001. "Operations for Hardware-Accelerated
Procedural Texture Animation." In Game Programming Gems
2, edited by Mark DeLoura, pp. 497-509. Charles River Media.
Kawase, Masaki. 2003. Personal Web
site. http://www.daionet.gr.jp/~masa/column/2003-03-21.html
Nakamae, Eihachiro, Kazufumi Kaneda, Takashi
Okamoto, and Tomoyuki Nishita. 1990. "A Lighting Model Aiming
at Drive Simulators." In Proceedings of SIGGRAPH 90,
pp. 395-404. NVIDIA Developer Web site. 2003. http://developer.nvidia.com
OpenGL.org Web site. 2003. "Advanced Graphics
Programming Techniques Using OpenGL." Course notes, SIGGRAPH
99. Mathematics of separable convolution. http://www.opengl.org/resources/tutorials/sig99/advanced99/notes/node235.html
Ramamoorthi, Ravi, and Pat Hanrahan. 2001. "An
Efficient Representation for Irradiance Environment Maps."In
Proceedings of SIGGRAPH 2001, pp. 497-500. Available online
at http://graphics.stanford.edu/papers/envmap
Spencer, Greg, Peter S. Shirley, Kurt Zimmerman,
and Donald P. Greenberg. 1995. "Physically Based Glare Effects
for Digital Images."In Proceedings of SIGGRAPH 95, pp.
325-334.
We offer tremendous thanks to the
Developer Technology group at NVIDIA and to Monolith
Productions for encouraging and assisting in the development
of this technique and for transforming a
simple tech demo into gorgeous visuals in the final
shipping game.
______________________________________________________
|