DOT3 Versus Tangent-Space Bump-Mapping

One concept which has been used often in the design of Fragment Shaders and/or Materials, is “DOT3 Bump-Mapping”. The way in which this scheme works is rather straightforward. A Bump-Map, which is being provided as one (source) texture image out of several, does not define coloration, but rather relief, as a kind of Height-Map. And it must first be converted into a Normal-Map, which is a specially-formatted type of image, in which the Red, Green and Blue component channels for each texel are able to represent floating-point values from (-1.0 … +1.0) , even though each color channel is still only an assumed 8-bit pixel-value belonging to the image. There are several ways to do this, out of which one has been accepted as standard, but then the Red, Green and Blue channels represent a Normal-Vector and its X, Y, and Z components.

The problem arises in the design of simple shaders, that this technique offers two Normal-Vectors, because an original Normal-Vector was already provided, and interpolated from the Vertex-Normals. There are basically two ways to blend these Normal-Vectors into one: An easy way and a difficult way.

Using DOT3, the assumption is made that the Normal-Map is valid when its surface is facing the camera directly, but that the actual computation of its Normal-Vectors was never extremely accurate. What DOT3 does is to add the vectors, with one main caveat. We want the combined Normal-Vector to be accurate at the edges of a model, as seen from the camera-position, even though something has been added to the Vertex-Normal.

The way DOT3 solves this problem, is by setting the (Z) component of the Normal-Map to zero, before performing the addition, and to normalize the resulting sum, after the addition, so that we are left with a unit vector anyway.

On that assumption, the (X) and (Y) components of the Normal-Map can just as easily be computed as a differentiation of the Bump-Map, in two directions. If we want our Normal-Map to be more accurate than that, then we should also apply a more-accurate method of blending it with the Vertex-Normal, than DOT3.

And so there exists Tangent-Space Mapping. According to Tangent-Mapping, the Vertex-Normal is also associated with at least one tangent-vector, as defined in model space, and a bitangent-vector must either be computed by the Vertex Shader, or provided as part of the model definition, as part of the Vertex Array.

What the Fragment Shader must next do, after assuming that the Vertex- Normal, Tangent and Bitangent vectors correspond also to the Z, X and Y components of the Normal-Map, and after normalizing them, since anything interpolated from unit vectors cannot be assumed to have remained a unit vector, is to treat them as though they formed the columns of another matrix, IF Mapped Normal-Vectors multiplied by this texture, are simply to be rotated in 3D, into View Space.

I suppose I should add, that these 3 vectors were part of the model definition, and needed to find their way into View Space, before building this matrix. If the rendering engine supplies one, this is where the Normal Matrix would come in – once per Vertex Shader invocation.

Ideally, the Fragment Shader would perform a complete Orthonormalization of the resulting matrix, but to do so also requires a lot of GPU work in the FS, and would therefore assume a very powerful graphics card. But an Orthonormalization will also ensure, that a Transposed Matrix does correspond to an Inverse Matrix. And the sense must be preserved, of whether we are converting from View Space to Tangent-Space, or from Tangent-Space into View Space.

Continue reading DOT3 Versus Tangent-Space Bump-Mapping

There are situations in which Photogrammetry won’t do the job.

In place of painting a human actor with a laser-grid, there now exists an alternative, which is called “Photogrammetry”. This is a procedure, by which multiple 2D photos from different angles, of the same subject, are combined by a computer program into an optimal 3D model.

The older photogrammetry required humans in the loop, while the newer approaches do not.

With the 3D grid-lines, a trick they use is to have their cameras take two sets of photos: First with the grid off, and then with the grid on. The second is used to make the 3D model, while the first is used to create the texture-images.

One main problem with photogrammetry is instead, that the subject must have exactly the same geometry in 3D, shared between 4, 5, 6 photos etc., depending on how high we want the level of quality to be.

Peter Cushing, for example, would need to have been standing in a circle of cameras once, that all fired at once, in order to have been recreated in “Star Wars – Rogue One”.

Instead, the stock footage consists of many 2D views, each from one perspective, each with the subject in a different pose, each with the subject bearing a different facial expression, each with his hair done slightly differently…

That type of footage tends to be the least useful for photogrammetry.

So what they probably did, was try to create a 3D model of him ‘to the best of their human ability’. And the way human vision works, that data only needs to be wrong by one iota, for the viewer ‘not to see the same person’.

Similarly, I still don’t think that a 3D Texture, as opposed to a 2D Texture, can just be photographed. 3D, Tangent-Mapped Textures need to have normal-maps generated, which derive from depth-maps, and these depth-maps tend to be the works of human Texture Artists, who Paint – yes, Paint them.

They can sometimes also be ‘off’. The Texture Artist may exaggerate certain scars or pimples that the real Actor had, and cause the 3D model not to look real – again.

Dirk

(Next)