Normal Maps
See:
- https://gamedev.stackexchange.com/questions/63832/normals-vs-normal-maps
- https://www.youtube.com/watch?v=PnazRFnPPcg
- http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping/
- https://sotrh.github.io/learn-wgpu/intermediate/tutorial11-normals/#the-tangent-and-the-bitangent
- https://learnopengl.com/Advanced-Lighting/Normal-Mapping
Normal Vectors
The "normal" in geometry is a vector that is perpendicular to a given object. They are primarily used in light calculations, for example to calculate the diffuse reflection across a surface, which involves taking the dot product between the light direction and a surface normal.
Normals are also specified per vertex, even if they are calculated only for each face.
Normal Maps
Normal mapping refers to a technique whereby a texture map, which is normally used for storing image data where for each texel is an RGB triplet of floats, is used to store normal vectors (also a triplet of floats).
Normal maps help fake the lighting of bumps and dents across a surface.
Normal maps, when opened in a UI tool, look blueish, because the Z-value is always calculated to be positive. Since the Z value takes the "B" component, it will usually look more blue when viewed as an image.
Tangent Space
Normal maps have always positive Zs because they are calculated and notated in tangent space
, which is a coordinate system relative to the surface on which the normal was calculated.
This is done because normal maps are flat and they are used to wrap over 3D objects that may not be flat. Since normals are defined in tangent space
, we must construct a rotation matrix to re-orient each normal to the actual location on the object being wrapped.
To derive this rotation matrix, the vertex normals come in handy. We first find the tangent
, and bitangent
, which taken together with the vertex normal
, form a basis for the tangent space
coordinate system. The inverse of such a matrix is the tangent space to world space
transformation matrix, which when applied to the normals in a normal map yield you correctly oriented normal vectors.
Since this tangent space to world space
matrix is an orthogonal matrix
(since the three vectors are basis vectors), the inverse of such a matrix is just the transpose, which makes it easy to calculate.