Gamasutra is part of the Informa Tech Division of Informa PLC

This site is operated by a business or businesses owned by Informa PLC and all copyright resides with them. Informa PLC's registered office is 5 Howick Place, London SW1P 1WG. Registered in England and Wales. Number 8860726.


Gamasutra: The Art & Business of Making Gamesspacer
View All     RSS
June 14, 2021
arrowPress Releases







If you enjoy reading this site, you might also want to check out these UBM Tech sites:


In-depth: Photon mapping and baking light maps

In-depth: Photon mapping and baking light maps

July 3, 2012 | By Simon Yeung

July 3, 2012 | By Simon Yeung
Comments
    2 comments
More: Console/PC, Programming, Art



[In this reprinted #altdevblogaday in-depth piece, game programer Simon Yeung shares an overview on how to bake light maps of indirect lighting data by sampling from the photon map.]

Continuing from my previous post, this article will describe how light maps are calculated from the photon map. My light map stores incoming radiance of indirect lighting on a surface which are projected into Spherical Harmonics (SH) basis. Four SH coefficients is used for each color channels. So three textures are used for RGB channels (total 12 coefficients).

Baking the light map

To bake the light map, the scene must have a set of unique, non-overlapping texture coordinates (UV) that correspond to a unique world space position so that the incoming radiance at a world position can be represented. This set of UV can be generated inside a modeling package or using UVAtlas. In my simple case, this UV is mapped manually.

To generate the light map, given a mesh with unique UV and the light map resolution, we need to rasterize the mesh (using scan-line or half-space rasterization) into the texture space with interpolated world space position across the triangles. So we can associate a world space position to a light map texel.

Then for each texel, we can sample the photon map at the corresponding world space position by performing a final gather step just like in the previous post for offline rendering. So the incoming radiance at that world space position, hence the texel in the light map, can be calculated. Then the data is projected into SH coefficients, stored in three 16-bits floating point textures.

Below is a light map that extracts the dominant light color from SH coefficients:


The baked light map showing the dominant light color from SH coefficients

Using the light map

After baking the light map, during run-time, the direct lighting is rendering the usual way, a point light is used to approximate the area light in the ray traced version, and the difference is more noticeable at the shadow edges.

direct lighting only, real time version
direct lighting only, ray traced version

Then we sample the SH coefficients from the light map to calculate the indirect lighting:

indirect lighting only, real time version
indirect lighting only, ray traced version

Combining the direct and indirect lighting, the final result becomes:

direct + indirect lighting, real time version
direct + indirect lighting, ray traced version

As we store the light map in SH, we can apply a normal map to the mesh to change the reflected radiance.

Rendered with normal map
Indirect lighting with normal map

We can also apply some tessellation, adding some ambient occlusion (AO) to make the result more interesting:

Rendered with light map, normal map, tessellation and AO
Rendered with light map, normal map, tessellation and AO

Conclusion

This post gives an overview on how to bake light maps of indirect lighting data by sampling from the photon map. I use SH to store the incoming radiance, but other data can be stored such as storing the reflected diffuse radiance of the surface, which can reduce texture storage and doesn't require floating point texture.

Besides, the SH coefficients can be store per vertex in the static mesh instead of light map. Lastly, by sampling the photon map with final gather rays, light probe for dynamic objects can also be baked using similar methods.

References

[This piece was reprinted from #AltDevBlogADay, a shared blog initiative started by @mike_acton devoted to giving game developers of all disciplines a place to motivate each other to write regularly about their personal game development passions.]


Related Jobs

Sucker Punch Productions
Sucker Punch Productions — Bellevue, Washington, United States
[06.14.21]

Audio Programmer
Sucker Punch Productions
Sucker Punch Productions — Bellevue, Washington, United States
[06.14.21]

Multiplayer/Network Programmer
Sucker Punch Productions
Sucker Punch Productions — Bellevue, Washington, United States
[06.14.21]

Senior Gameplay Programmers
Sucker Punch Productions
Sucker Punch Productions — Bellevue, Washington, United States
[06.14.21]

Senior Graphics Programmer









Loading Comments

loader image