Radiosity Normal mapping

I have downloaded one of those pdf’s about HL2 called

d3dtutorial10_half-life2_shading.pdf

on page 10, it displays a kind of coordinate system. Where did they get this from? Just pick on at random?

On the next page, they say “they compute light values for each vector”. How do they do that?

On the next page, it says “Sample three light maps”.
Each light map represents a direction of a light or …?

The whole thing isn’t clear.

Originally posted by V-man:

on page 10, it displays a kind of coordinate system. Where did they get this from? Just pick on at random?

In the next slide it says:
“In Radiosity Normal Mapping, we transform our basis into tangent space…”

I believe that coordinate system is tangent space.

[b]
On the next page, they say “they compute light values for each vector”. How do they do that?

On the next page, it says “Sample three light maps”.
Each light map represents a direction of a light or …?

The whole thing isn’t clear.[/b]
There was a discussion about this on the GDAlgorithms list a couple weeks ago.
http://news.gmane.org/gmane.games.devel.algorithms

Edit: tag fixup.

Originally posted by V-man:
on page 10, it displays a kind of coordinate system. Where did they get this from? Just pick on at random?
From what I could get (mainly from the pdf and the gd-algo discussion), this basis was created by experimentation. It is not complete random as it is a proper orthonormal basis, expressed in tangent space, and it exhibits (did not do the math, but it seem to) some even direction distribution around the normal axis (0,0,1) that allow some uniform sampling of the hemisphere.

[b]On the next page, they say “they compute light values for each vector”. How do they do that?

On the next page, it says “Sample three light maps”.
Each light map represents a direction of a light or …?[/b]
The lightmap creation is pretty simple, each sample of each lightmap is simply created from the world-space position corresponding to the current sample, and the ‘normal’ used for the lighting computation (instead of the actual surface normal) is the axis of basis corresponding to the lightmap, transformed from the object tangent space to world space.

HTH,

Nicolas

It was a little confusing cause old dot3 lighting and radiosity seem conflicting.

I think that they have decided on some method to get those 3 directional radiosity values and they stuff them into 3 light maps.

Someone here could make a demo of this one since it’s a nice concept.

This is nice stuff. It raises my perception of their engine a great deal.

I think the basis diagram on figure 10 is simply showing the sampling vectors for the radiosity light maps. Looks like they are fixed w.r.t. tangent space in the positions shown. It seems like they could vary if you can send the data from the vertex shader (judging from the equations presented), however their sampling basis seems consistently represented as three vectors in that arrangement throughout their presentation.

It’s a pretty simple concept really. Instead of a simple light map they store the light map result as three colored light intensities for each basis vector, the effect of this is to ‘remember’ something about where the radiosity illumination contribution came from. This directionality from the light map is used to shade the fragments based on the dot products of the light map(s) and the bump map normal.

This is an interesting approach, I’ve been thinking about stuff like this recently although my ideas on a solution were very different from this with a dominant illumination vector lighting claculation blended against a texel ambient occlusion (of the surface bump-geometry) based on ‘sharpness’.

The specular radiosity term is baked entirely differently by using multiple cube maps throughout the space and using the best fit. Seems like a lot of texture paging but I suppose you can make them small and vary the density and they are under artist control.

Very very cool, exactly the kind of thing you need to do to make ambient or radiosity terms work with bump mapping.