Share

Displacement - Arnold User Guide

Displacement maps can be an excellent tool for adding surface detail that would take far too long using regular modeling methods. Displacement mapping differs from bump mapping in that it alters the geometry, and therefore will have a correct silhouette, and self-shadowing effects. Depending on the type of input, the displacement can occur in two ways: Float, RGB & RGBA inputs will displace along the normal while a vector input will displace along the vector.

The example above shows how a simple plane, with the addition of a displacement map, can produce an interesting looking simple scene.

You should ensure that your base mesh geometry has a sufficient number of polygons otherwise subtle differences can occur between the displaced low-resolution geometry and the high-resolution mesh from which it was generated.

Note:

Make sure that you use a 32-bit or 16-bit floating-point format to store your image, and not an integer format. An integer format will not work correctly. This is because integer formats do not support negative pixel values, which are used by floating-point displacement maps.

Changing the Subdivision Type to either Catclark or Linear subdivision rules and increasing the iterations will improve the displacement quality. In this example, the Subdivision Iterations have been increased to 8.

You must be careful when increasing the number of Subdivision Iterations (each iteration quadruples the geometry). This subdivision happens at render time, whenever a ray hits the bound box of the object. This is a better choice compared to increasing the subdivisions of the mesh within the DCC software (which will send the tessellated geometry to the renderer).

Arnold Displacement Settings

It is possible to set displacement settings on a per-face or per-object basis. However, any values that are entered in the Arnold attributes of the displacement node will override those settings. With multiple displacement shaders per object, and since an object can only have one value of Bounds Padding, Arnold takes the maximum value from all of them. Autobump poses the same problem as with padding, and so Arnold enables it if at least one of the displacement shaders has it enabled.

Height

Controls the amount of displacement. Displacement Height can have either positive or negative values. This attribute only applies to normal displacement. You can use this value to compensate for any inconsistencies between the exported displacement map and the low-resolution geometry.

Bounds Padding

Padding defines how much to extend the bounding box of the object so that it can include any additional displacement coming from the displacement shader. When the bounding box is hit first by a ray, the displacement will be computed, so an unnecessarily high value will decrease the rendering efficiency. On the other hand, a low value could result in a clipping of the displaced mesh.

The proper workflow for displacement in Arnold is to have the shader give the final displacement value and then to offset the bounding box with the bounds padding attribute.

Below is another example of a situation where bounds padding is required. A checker texture is connected to a displacement shader that is assigned to a sphere. In the image on the left, parts of the render return black. This is because the Bounds padding needs to be increased for the displaced mesh. Increasing the Bounds padding to 3 fixes the problem. This effect may increase or decrease depending on the scale of the object that is being displaced and the amount of displacement used.

Zero Value

This is a floating-point value that is applied as a shift to the displacement amount. It defines the value of the displacement map that is considered to be zero displacement. This value can vary depending on how the displacement map has been generated.

Autobump

Autobump puts the high frequencies of a displacement map into the bump attribute so that you do not need as many Subdivision Iteration values. Autobump is visible to camera rays only by default. The visibility parameters let you make Autobump visible to other rays (eg specular and transmission) however that can increase render times.

Note:

The autobump algorithm needs UV coordinates to compute surface tangents. Make sure your polymesh has a UV set applied.

Technical information:

When autobump is enabled, Arnold makes a copy of all of the vertices of a mesh before displacement (let's call that the "reference" mesh, or Pref). Prior to shading at some surface point on the displaced surface P, the equivalent Pref for that point is found on the non-displaced surface, and the displacement shader is evaluated there (at Pref) to estimate what would be the equivalent normal at P if we had subdivided the polymesh at an insanely high tessellation rate.

The main difference between Arnold's autobump and using the displacement shader for bump mapping is that autobump has access to Pref whereas bump2d does not and would be executing the displacement shader on already-displaced points which could "compound" the displacement amounts.

The only extra storage is for copying P prior to displacement. There is no analysis of the displacement map; Arnold displaces vertices purely based on where they "land" in the displacement map (or procedural) regardless of whether it happens to "hit" a high-frequency spike or not.

Vector Displacement

Traditional displacement maps are not used for any surface change that is not perpendicular to the base mesh’s polygons. Vector displacement maps can displace in directions other than the face normal, which is much more flexible. Vector displacement uses the color channels that specify a vector in a certain space to displace the vertices of the geometry in that direction and magnitude.

For vector displacement, you use the vector map shader.

 polymesh
{

 disp_map "displacementShader1"
 disp_padding 2
 disp_height 1
 disp_zero_value 0
 disp_autobump on

}

vector_map
{
 name displacementShader1
 input aiImage1
 color_to_signed off
 tangent_space off
}

image
{
 name aiImage1
 filename "disp.png"
 color_space "sRGB"
 missing_texture_color 0 0 0 1
} 

Input

The map, usually exported from Mudbox or ZBrush.

Tangent

The tangent map. Together with the shading normal, it defines the tangent coordinate system that the input vector applies to. If available from your sculpting tool, you should connect here the tangent map that the normal map relies on. If 0, the shader attempts the following actions to build the frame:

  1. Look for vector user data named "tangent" and "bitangent".
  2. Use the UV derivatives.
  3. Build its own local frame.

The shader works in tangent space only. If your tangent map was exported in either world or object space, you can instead use the more generic space_transform shader.

Normal

The normal and tangent parameters can be optionally linked to define a custom tangent coordinate system that the input is transformed from. If the normal is not linked, it will use the default surface normal.

Order

Lets you shuffle the input channels order.

Invert X

If enabled, inverts (1-channel) the x input channel.

Invert Y

If enabled, inverts (1-channel) the y input channel.

Invert Z

If enabled, inverts (1-channel) the z input channel.

Color to Signed

For 8-bit maps. If enabled, the input is remapped to the [-1, 1] range.

The default values of these parameters (Order, Invert, Color to Signed) let you correctly import a map generated in Mudbox in tangent coordinate space.

Tangent Space

Specifies if the input is in world space or tangent space.

Scale

Scales the result vector.

Was this information helpful?