See this paper: ftp://download.nvidia.com/developer/Papers/Mipmapping_Normal_Maps.pdf
They describe the very simple implementation of an algorithm for antialiasing normal maps.
I don't understand exactly how to look up an appropriate value in the lookup table they describe.
A value is accessed with (N_a . N_a, N_a . H).
My specular light for example, is computed with:
result.Specular += baseIntensity * SpecularColor *
pow(max(0, dot(H,N)), SpecularExponent);
The H is the same as the H in the paper.
SpecularExponent is the s in the paper.
The N is the vector that results from looking up a normal in the normal map (which is already normalized) and then transforming that normal into world space.
What is N_a then?
It seems that the lookup table is constructed by taking all of the normals (N_a) in a normal map, and then taking all (or many) of the values that H can take, and forming a table from these according to the formula they provide.
However, this doesn't make sense to me, how is the normal that is transformed into world space taken into account in the lookup table then?
That is, the normal in the normal map is rotated to be on the mesh that the normal map is being applied to. So this new rotated normal is what we use to calculate the specular exponent -- how does this fit into the use of the lookup texture?
My best guess right now is that N_a is actually the normal from the normal map that is already transformed into world space. Otherwise, I guess it is just the normal from the normal map, and they ignore the transformation into world space.
