2018 Face Displacement Overhaul

What has changed?

The previous approach computed a scale factor based on the camera. This value multiplied by the displacement scale would get added to the depth, when projecting the geometry onto the plane we end up putting on screen. NOTE: the scale would change with every camera change, but be constant for that projection.

The new approach no longer computes a scale based on the camera. Instead, the displacement scale is multiplied by the smallest possible value that should produce a difference in the z-buffer after projecting all the geometry onto the view plane. This value is add to the depth value. This is a constant offset relative to the projection. Additionally, face displacement also makes use of a hardware feature referred to as slope-scale biasing. This feature adds to the displacement based on the angle of a surface relative to the view vector - larger angle, greater additional displacement, smaller angle, less additional displacement. This allows face displacement to vary across the screen for a particular projection.

When will the changes be released?

For HOOPS Visualize HPS: 2018 SP2 (release 29 August 2018) and 2019 forward

For HOOPS Visualize 3DF: 23.20 (anticipated release early-mid October) and 24 forward

What is the most important thing partners should know?

There aren’t any API changes. The primary anticipated change on the application side is uses of displacement will probably need to use larger values. The default displacement remains 8 and continues to work well for edge bleedthrough on faces. Coplanar geometry will generally require a larger value for those parts of the scene. See the release notes below for details.

What documentation is available about this enhancement?

Refer to the 2018 SP2 HPS release notes (shown below) and updated comments for the relevant HPS functions.

Shader-Based Face Displacement Redesign. Our face displacement algorithm has been redesigned to handle face displacement in a more robust way, resulting in more accurate z-ordering of geometry situated very close together. This will largely eliminate “bleed through” and stitching of edges that are supposed to be obscured.

As a result of the redesign, the units of Face Displacement have changed: The new units are linear, camera independent, and represent a much smaller displacement. The new units are 1/224 in the normalized depth range [0,1]. When calibrating your scene with the new units, it’s likely that you will need much larger values than previous versions of Visualize. Any uses of face or vertex displacement may need to be re-tuned to render optimally. This affects the following functions:

If you previously set any face displacement values to correct for problematic rendering or artifacts in past versions of Visualize, we recommend trying to remove these adjustments, as it’s possible that they may no longer be necessary.

Lastly, the z-order of co-planar geometry may change. Z-order of co-planar geometry is non-deterministic, and this new algorithm may yield different visual results than in previous releases.

These images show sample renderings from before and after this change:

Are there other things to be aware of?

Coincident face Z-fighting remains an issue. This was a problem before this face displacement work and was not specifically addressed. Larger displacement settings may alleviate such issues.

Highlighting can also be affected by the face displacement change since it relies on displacement.

Bounding Box:

If the bounding box of the entire model is inordinately larger than the specific model being viewed, this can have an adverse effect on the rendering (such as, more pronounced z-fighting, edges bleeding through faces). The PartViewer can be used to show the bounding box (Tools → Segment Browser → Boundings):


If the bounding box is inordinately larger, try simplifying the scene by removing geometry or by extricating the smaller target model in question on to its own separate file.

Camera Near Limit:

Adjusting the camera near limit can help as well, as this results in better usage of the depth buffer.

Changing the near plane of the camera can sometimes fix displacement rendering artifacts. As stated in our HOOPS Visualize docs under the heading “Changing the Camera Near Plane”: “…by default, Visualize will automatically adjust the near clipping plane to be as close to the camera target as possible” but this may not yield the best rendering results. Try changing the camera near plane by small incremental amounts both in the positive and negative direction, for example, +/-0.01 or even by +/0.001.