by Kyle
Olszewski (kolszewski3@mail.gatech.edu)
Renderer Warm-Up Project
CS7490 – Image Synthesis
Professor Greg Turk
Introduction:
The renderer which I used for my project is the radiosity lightmap generator contained in Irredit, a world editor designed to create levels for the Irrlicht game engine. The software for irredit can be found at http://www.ambiera.com/irredit/, (under the “Downloads” section). Tutorials, an FAQ section, and a forum where users discuss features of Irredit are all found on this site as well.
While the Irrlicht game engine is open source, Irredit is not. The software is
freely distributed, but gaining access to the source code requires the purchase
of a license for 450 Euros. All of the versions of the software distributed on
the website run under the Windows operating system, though the creators plan to
extend the editor to other platforms in the future.
The Basics:
Though the world editor allows
the user to render scenes using several different types of renderers (described
below), the primary and most powerful renderer used in this lightmap generator
is a radiosity solver which proves realistic effects such as global
illumination and color bleeding for use in textures to be applied to static objects
in a 3D game environment. Though I did not have access to the source code, and
information online concerning the specific implementation used in the renderer
was relatively scarce, the software apparently uses a fairly standard
implementation of the radiosity algorithm, subdividing each of the objects in
the scene into multiple patches, determining the effects of each of the lights
in the scene on each pass, and performing additional passes to progressively
determine the overall effect of the lights radiating from each of the patches
in the scene on each individual patch. The resulting textures portray diffuse
shadows and the effect of light bouncing around the scene, reaching areas it
may not directly affect.
Given that this renderer is primarily intended as a lightmap generator for 3D
game environments, it is designed to work with 3D models which are represented
as (relatively simple) polygonal meshes with textures applied to them. The
renderer can import files from a large number of formats, including 3D Studio
(.3ds), Alias Wavefront Maya Objects (.obj), COLLADA (.xml and .dae), DirectX
(.x), and OGRE (.mesh), among several others.
I attempted to load several Maya files which used non-polygonal surfaces
such as splines into the editor, but experienced several errors which prevented
the object from being loaded. (This of
course makes sense, since splines are not typically used in the models used in
game environments.) The editor may also
import existing scenes created in the Irredit format (.irr files) which consist
of polygonal meshes, lights, skyboxes, terrain maps, and other objects made
available in the editor. The renderer
may perform software-based rendering or hardware-accelerated rendering when
possible (using Direct3D 9.0). There is
no shading language made available to the user in Irredit, but given that the
renderer is designed to create scenes for use with the open-source Irrlicht
engine, it is possible for very dedicated and experienced users to change the
manner in which the scenes they develop are rendered in the game engine by
altering the engine’s source code.
The Good Stuff:
There are many impressive aspects of this renderer. One nice feature of the
renderer is that, given that it is used as part of the Irredit world editor,
which has a simple and intuitive graphical user interface, it is easy to
progressively develop the scene while observing the intermediate results.
Rather than defining the scene in a data file and then running the renderer,
one may progressively build the scene, adding models and lights based on the
results of previous alterations. In addition, since the renderer generates
lightmaps which are used as textures on objects in a 3D game environment, after
running the renderer the user is able to view the rendered scene from any angle
simply by moving the camera around within the scene. (Unfortunately, this also
meant that trying to create a single image of my scenes to use on this site was
unnecessarily complicated; I had to take a screenshot while running the editor
and then crop out everything but the viewport.)
An example of the object translation tool
in the GUI used for scene creation in Irredit.
Dragging on the arrows allows the user to translate the objects in the
X, Y, and Z dimensions.
The renderer also allows the user to choose from multiple levels of detail when
rendering the scene. Once may simply choose to render the scene using only
white ambient light which allows the user to see all of the objects in the
scene, even those outside the range of the lights. The user may also choose to render the scene
with diffuse lighting without shadows, which results in a very quick and
efficient rendering of even complex scenes. There is also an option to render
the scene with diffuse lighting with shadows, which adds a layer of realism to
the textures applied to the objects within the scene (although it requires
significantly more time to render). Finally, the most impressive option (and
obviously the one which takes the most time to render) uses the radiosity
solver to apply global illumination to the scene. These multiple levels of
detail are a great feature which allows the user to pre-visualize the scene
being created to make sure that the scene to be rendered achieves the basic
desired effect before applying the costly radiosity rendering to achieve a more
realistic and impressive look. Judging
from my own experiences observing pictures of scenes on the Irredit site and
rendering my own scene, it appears that the color bleeding effect is best
demonstrated in scenes containing a few relatively simple objects (i.e.,
brightly colored objects consisting of a few large flat sides, such as cubes
and boxes); however, even without this effect, the radiosity solver provides
impressive realism in complex scenes by realistically depicting the manner in
which light is bounced around and reaches objects it could not directly reach.
Though it is not directly related to the world editor, one aspect of Irredit which I found interesting was that it allowed the user to add animated meshes (such as a character repeating a few basic movements, or a cube rotating in air) and particle systems to their scenes. The particle systems seem particularly useful; though they are unaffected by the lightmapper, they are useful for providing “motivation” for the light sources contained in the scenes, such as a flaming torch hanging on a wall, or sparks flying from a forge.
The Bad Stuff:
However, this render (which was started by its creator simply as a part-time
project) also lacks many features which would allow it to achieve more
impressive results and make it easier to use. Clearly, this render is intended
primarily for rendering fairly realistically lit textures for 3D game objects,
but not more photorealistic results. I attempted to run this renderer using
more complex models containing tens of thousands of polygons, but I ultimately
began receiving error messages and the application froze. Since the renderer is
primarily designed to create textures to be applied to static objects in 3D
game worlds, it also lacks the option to use more realistic effects such as
refractive or highly reflective objects.
The world editor only allows the user to use point lights, directional
lights, and ambient light in the scene; light sources such as area lights are
not included in the renderer as of now.
There also does not seem to be a manner to control the falloff of the directional
light in order to create a specific spotlight effect.
In addition, the renderer is subject to an obvious flaw in the use of light maps to add realism to a game scene: when a character or object moves between the supposed light source and a lightmapped object while playing the game, the texture will not change, revealing that it is simply “baked” onto the target and not a dynamically created lighting effect. Thus, while lightmapping is a cheap way to add realism to static scenes, it is also subject to problems which make it much less convincing than dynamically generated lighting. As the hardware used for 3D games becomes more powerful and capable of creating realistic lighting and images, clever techniques such as lightmapping seem to be losing their appeal among game developers.
[Note: Lightmapping was used
extensively in the original “Doom” to provide realistic lighting on the walls,
floors, and ceilings. More recent games,
however, tend to make more use of techniques such as stencil shadows and shadow
volumes (which were used in the sequel “Doom 3” released in 2004.)]
In addition, though the basic features of the renderer are easy to use, it
seems that exploiting some of the more powerful features requires significantly
more skill and knowledge. While researching features of the renderer, I noticed
several photos which demonstrated impressive features of the radiosity lightmap
generator, such as color bleeding (http://www.ambiera.com/irredit/screenshots.html
- look at the images under “Irredit 0.6”).
I attempted to create similar effects in one of the scenes I created
(see below); however, despite the seemingly simple nature of the scene, I was
not able to perfectly replicate the rather impressive color bleeding results achieved
in the photos, despite extensive effort and a great deal of manipulating the
various parameters of the scene (light radii, texture resolution, etc). I searched online for a copy of the world map
he used to render these images to compare the differences between his scene and
mine, but was unable to find them. Despite searching extensively for
information about how to make more extensive use of the radiosity light map
generator’s more impressive features, I was able to find little information to
help me.
This brings me to the online documentation for this renderer, which left much
to be desired. There are a few brief tutorials discussing the basic aspects of
the world editor and the lightmap generator, such as creating lights and moving
objects around the scene, but they do not go into great detail, and provided no
information concerning how to achieve the more complex effects mentioned above.
There is no help feature in the editor itself, other than a button which opens
these simple tutorials in a web browser. While the online documentation was
helpful in gaining an understanding of the basic tools in this world editor,
much of my experience of creating and rendering my own scenes was simply a
process of trial and error.
A nice feature which should have been included in this scene is progressive rendering using the global illumination renderer. The radiosity solver used here performs multiple iterations of the lighting calculations, as described above, and thus could present the results of each iteration to the user (as seen in the photo below) as the next iteration is being performed. This would allow the user to prematurely abort a long render if the intermediate results do not achieve the desired effect.
Finally, when observing photos of lightmapped Irredit scenes online and when attempting to render several scenes of my own, I noticed several artifacts such as unrealistically jagged, blocky shadows. Judging from my experiences creating these scenes, it seems that these artifacts are often created when the global illumination renderer is applied to relatively scenes in which objects are placed very close to a light source. This can be seen in the shadows of the pillars used in the demo scene rendered above. This seems to be an artifact of the rendering method used, which subdivides objects in the scene into small patches and determines the lighting effect on each of these patches (performing multiple iterations to account for indirect light in the case of the global illumination renderer). Many radiosity renderers seem to suffer from this same basic artifact (see the example images below from http://en.wikipedia.org/wiki/Radiosity). This also happens often when the texture on the object on which the shadow is being applied has a relatively small resolution compared to the occluding object. I attempted to resolve this problem by increasing the resolution of the lightmap to be applied to objects, but this only resulted in smaller, sharper jagged edges on the scene. Many of the scenes in the example images on the Irredit home page seem to suffer from the same effects. Without access to the source code, it was difficult to say exactly what caused these artifacts or how to resolve them, but they proved to be a frustrating aspect of the experience of creating and rendering a realistic scene.
Jagged shadows can be seen in the
demonstration of a radiosity renderer’s execution on Wikipedia.
Example Scene:
For my example scene, I rendered an example level which was contained with the Irredit software. To demonstrate the various rendering options available in Irredit, I rendered the scene 4 times using the various rendering options available:
White ambient light:
This scene was rendered in ~1 second
Diffuse lighting without shadows:
This scene was rendered in ~1 second
Diffuse lighting with shadows (Notice the jagged shadows):
This scene was rendered in ~2 seconds
Global illumination:
This scene was rendered in ~37 seconds
Note how the light seems slightly more “blown out” in the final rendering than in the previous one, and the dwarf’s body is slightly more illuminated due to the light bouncing around within the scenes. Also note how the scenes become progressively more realistic looking as more advanced lighting effects are added. (The sparks on the left side of the image are from one of the aforementioned particle systems, which is contained within the scene.)
As mentioned before, one advantage of this renderer is that the rendered scene may be viewed from multiple angles. Here’s another view of the same rendered scene (with global illumination):
My Scenes:
As I mentioned above, the color bleeding effect of this renderer is best demonstrated in relatively simple scenes containing a few basic, brightly colored objects. (In fact, when attempting to combine some of the more primitive and colorful scene objects with more complex ones to observe the color bleeding effect on more complex models, I discovered that the results are very jarring and unrealistic, as the many polygonal facets of the complex models having very different colors based on their precise angle relative to the bright objects being reflected onto them.) I wanted to demonstrate this effect in my scene, but also wanted to test the renderer on a more complex and lifelike scene which I would create. As a result, I created two scene setups: one, inspired by the “Cornell box” test ( which compares a photo of a real scene to 3D renderings of the scene to judge the renderer’s accuracy; see http://www.graphics.cornell.edu/online/box/ for more information), uses a few basic geometric primitives in a 3D “box” with colored walls and bright lights, clearly demonstrates the “color bleeding” effects of Irredit; the other uses more complex, well textured-models in an environment which more accurately reflects a real scene.
Using Google, I first found a few basic objects (spheres, cubes, and tetrahedrons), which then I loaded into Irredit. By duplicating the cube (using the “clone” command provided by the renderer) and adjusting the position of these objects, I was able to create a “box.” I created several color patches saved in .png files and applied these as textures to the walls to give them different colors. I then loaded the other primitives into the scene, positioned them in the box, and applied colored textures to them as well. I placed two bright lights on one end of the scene, and then began tweaking the radii of the lights and the positions of the lights and objects, using the simple rendering options described above as “pre-visualization” before applying the global illumination renderer and observing the results.
While constructing the initial scene setup was relatively simple, I was surprised that developing and rendering this scene turned out to be far trickier than the more complex scene I created. Unlike more simple effects such as shadows, it is difficult to predict the final color bleeding which will result based on the scene’s parameters (objects and light colors and positions, light intensities, etc.). Achieving a relatively realistic color bleeding effect thus turned out to be quite difficult, since it involved making tiny adjustments to the lights and objects and re-rendering the scene (which took a fair amount of time using the global illumination renderer), observing the results, and repeating the process until the desired effect is achieved. In addition, the resolution of the color patches I used as textures on these objects turned out to have a large effect on the shape of the shadows in the final lightmaps. Smaller textures resulted in shadows which did not precisely reflect the positions of the objects and lights within the scene. Larger textures, while providing more realistic shadows, required more time to load into the scene and resulted in much longer rendering times. Finding the correct balance in the texture resolutions ended up taking a great deal of trial and error.
The resulting scene is depicted below. I show images of the scene taken using each of the rendering options, and then present the final scene with global illumination from two different angles:
(NOTE: The lightbulbs in this scene are markers contained in the world editor for designating the position of a light source. The circular white lines surrounding them mark the radii of effect of each light. The version of the world editor I was using seemed to have no method to remove these objects if they are visible in the viewport, so I ultimately left them in the scene:)
White
ambient light:
This
scene was rendered in ~1 second
Diffuse
lighting without shadows:
This
scene was rendered in ~1 second
Diffuse
lighting with shadows:
This
scene was rendered in ~2 seconds
Global
illumination:
This scene was rendered in ~1 minute, 50 seconds
Clearly, though the shadows in this scene seem to accurately reflect the basic positions of the lights and shapes, the jagged effect described above can clearly be scene. The global illumination and color bleeding effects, however, add some realism to the scene, though the jagged positions of the shadows and color bleeding effects seem to detract from the overall effect of the scene.
The more complex scene I created is presented below. As mentioned above, though many model formats are accepted by Irredit, it seems that the world editor is more restrictive with the format of the textures applied to these objects. As a result, I loaded many models (all free models downloaded from Turboquid) into the renderer, only to find that they were uniformly colored, rather than fully textured as they appeared in the example images online. After much searching, however, I finally found a set of objects which loaded into Irredit with their textures fully applied. (I also ended up reusing the dwarf model used in the example scene above.) In order to accurately capture the effect of the global illumination in this scene, I searched for a complex 3D environment which could enclose these models, and then carefully positioned them within the environment and added several lights positioned to demonstrate the effects of the renderer in the scene. I placed a terrain map which is available in Irredit on the ground to cover the empty space behind the doorway seen below. (I also applied a skybox available within Irredit in the scene, but it is not visible from this angle.) Positioning the models within the scene was relatively easy; the hard part was positioning the multiple lights to achieve the desired shadows and reflectance throughout the scene. Because none of the objects are highly reflective or very colorful, I did not have to worry as much about the unpredictable color bleeding effect as in the previous scene. However, the large number of polygons contained in the scene meant that the rendering time was still fairly long, making it difficult to progressively adjust the effect of the global illumination on the scene. Though there is little of the color bleeding effect found in the more simple scene, the shadows resulting from the lights position can clearly be seen, and are not solid as they would be using simple direct illumination. Thus, this scene also demonstrates the power of the global illumination renderer.
I call this scene “Surprise Attack:”
White
ambient light:
This
scene was rendered in ~1 second
Diffuse
lighting without shadows:
This
scene was rendered in ~2 second
Diffuse
lighting with shadows:
This
scene was rendered in ~45 seconds
Global
illumination:
This scene was rendered in 22 minutes, 40 seconds.
Interestingly, the
Copies of the models and textures I used in creating these scenes can be found here. (Please read the included text file for instructions on how to load these objects into Irredit.)
Conclusion:
For a lightmap generator used for a world editor for 3D games, the renderer
used in Irredit is capable of achieving very impressive results, and gives the
user a fair amount of discretion in determining the look of the world maps
being created. However, it also clearly lacks some of the more impressive
features and capabilities of a more powerful renderer which could be used to
achieve more realistic and lifelike results. In addition, the basic features of
the renderer are relatively simple to use, but there is a large learning curve
when it comes to learning the many capabilities of the world editor and the
renderer, and there is little in the way of documentation to explain these
features to the user. Thus, achieving
the impressive results portrayed in some of the screenshots on Irredit’s
homepage seems to require a significant amount of time, effort, and practice.
As Irredit is a project which
is constantly being developed and updated, it is possible that some of these
issues will be addressed in future releases.
Ultimately, however, despite its flaws, it has many nice features which
make it recommendable to people wishing to gain basic experience with a
radiosity lightmapper and seeking to learn how to create realistic and
impressive lightmaps for use in a 3D scene.