This short tutorial demonstrates a workflow for normalizing the Arnold Noise shader when combined with volume Displacement. In this example, we have a smoke VDB whose detail we wish to increase using volume displacement.
- Let's start off by creating an Arnold Volume.
- Open a smoke VDB file in the volume.
Various VDB volumes can be downloaded here.
- Assign a Standard Volume shader to the volume.
Volume VDB rendered in Arnold Volume
- Create an Arnold Noise shader and connect it to the displacement parameter of the standard volume shader.
That seems simple enough, however, there is a problem. The volume has been offset to the side and is showing displacement in only one direction.
Noise is only displacing in one direction
This happens because the Noise shader is working from 0 to 1. Smoke is volumetric and not a flat object so we need to remap our texture from 0-1 to -1 - 1.
- Create a Range shader and connect it to the volume displacement. Connect the Noise shader to the input of the Range shader.
- Change the Output Min to -1 in the Range shader. Now the Noise shader offsets in both directions which is more correct.
Before and after using the Range shader
- However, this is all a 2D effect. We need to create an offset in 3D space. We can do this using vector noise. To do this, go to the Noise shader and change the Mode parameter from Scalar to Vector and change the Range to (-1, -1, -1). Now the Noise shader offsets the displacement correctly in 3D space!
- An alternate method would be to connect the Noise to a VectorMap shader. Connect the VectorMap shader to the displacement parameter of the Standard Volume shader.
- In the VectorMap shader, enable Color To Signed. This parameter normalizes the vector noise from 0 - 1 to -1 - 1. Also, disable Tangent Space.
In general, you should avoid adding another shader, especially in the volume context.
Noise -> VectorMap -> Volume Displacement
Thanks to Slava Sych for his assistance with this tutorial.