The location of the demo is still the same: source and binary. Also notice that dHdst_derivmap() can be made shorter by passing

*VirtDim / sqrt(abs(VirtDim.x * VirtDim.y))*as a constant

*.*Furthermore, this vector constant is ±1.0 when

*VirtDim.x ==*

*VirtDim.y*. Finally, the scale and offset which is applied to the texture coordinate can be moved to the vertex shader. However, this requires the use of multiple interpolators so this might not be the preferred way.

One relevant thing to notice here is that the numerator

*VirtDim*is a float2 and not part of the bump scale. It serves to convert the height derivatives to the normalized texture domain from which we apply the chain rule. The factor

*1 / sqrt(abs(VirtDim.x * VirtDim.y))*on the other hand

**is part of the bump scale**. The distinction is subtle when doing bump mapping but becomes relevant when we do parallax mapping.

If for instance you are using derivative maps made with xNormal or you are just using this way of auto calculating a bump scale then the expression for the bump scale is:

*bump_scale = g_fMeshSpecificAutoBumpScale / sqrt(abs(VirtDim.x * VirtDim.y))*

where g_fMeshSpecificAutoBumpScale is the square root of the average ratio of the surface to normalized texture area. There is code which shows how to calculate this in the demo. The final value bump_scale is the same as the value which is returned by SuggestInitialScaleBumpDerivative() in xNormal.