15. Advanced rendering

ParaView’s primary focus area is quantitative analysis, wherein, conveying results objectively with clear and simple graphs and renderings is of utmost importance. A secondary focus area is the communication and presentation of results to a wider non-scientific audience. For this reason, there are a specific UI elements that give you fine-grained control over precisely how the data is displayed. One of them, Enable Ray Tracing and the related options help achieve photo-realistic renderings of the data.

15.1. The basics

Photo-realistic rendering of data is the ability of a rendering engine to create an image that accurately mimics a real-life photograph of the scene. In other words, the rendering is an accurate simulation of the physics of light and how light interacts with matter. Ray tracing is an algorithm for photo-realistic rendering, that follows the paths of billions of light rays through a scene as they interact with and bounce off objects in the environment.

Before discussing ray tracing and photo-realistic rendering, it would help the reader to understand the different rendering approaches in computer graphics.

Rasterization is the task of converting 3D shapes / geometry into an image on the screen - called a raster image. For each element in the scene, the primitive geometry is projected onto a 2D plane that represents the screen buffer. Different attributes like position, texture, normals, etc. are combined using pixel shaders to determine the final color. Coupled with depth testing to discard occluded polygons and specialized hardware in modern GPUs, rasterization is fast and real-time. However, it does not consider physical scene parameters like global illumination, material properties, shadows, etc. and hence cannot produce a photo-realistic image.

Ray casting, on the other hand, projects a ray from each pixel on the 2D screen through the 3D shapes / geometry until it intersects a primitive that is fully opaque. The final color for each pixel is the accumulation of the individual contributions of geometry elements that the ray intersected with. Physical attributes and material properties of each object are accounted for, in the calculation to come up with the final color. Different accumulation functions when casting rays through the scene can produce different images of the scene. The cost of ray casting is directly correlated with the number of pixels on the screen. Inherently, the information provided by casting a single ray per pixel is limited and does not account inter-object interactions in the physical scene. The produced image comes close but is not photo-realistic.

Ray tracing takes ray casting a step further by following, not only the original ray from the 2D screen, but also all the secondary rays that will be produced due to the physics of interaction of the light ray with an object. The primary ray and its derivatives are traced through the scene until they reach a light source or they satisfy a predefined depth condition. Ray tracing captures the visual fidelity of most light phenomena like reflections, refractions, shadows, indirect illumination, etc. and hence produces a near accurate photo-realistic rendering. Compared to ray casting, ray tracing is slow because after one ray bounces off an object, it can turn into 10 rays, and those can turn into 100, 1000, and so on. This exponential increase in the number of computations required to render a single frame, makes it time consuming.

Path tracing is a type of ray tracing where the rays only produce a single derivative ray per reflection. Instead of a single ray per pixel, multiple rays are projected from the 2D screen per pixel but these rays do not generate secondary rays in the scene. The rays are traced through the scene until they reach a light source or a predefined depth condition. The final pixel color is an average of all the color values accumulated by the rays projected from that pixel. If the number of rays emitted per pixel falls short, the final image can be spotty in appearance as many pixels fail to find any light sources from their rays. The final rendering can be improved by increasing the number of samples (rays) per pixel. Given enough samples per pixel, path tracing can produce a photo-realistic rendering of the scene.

15.2. Rendering backends

ParaView uses OpenGL as the default rendering engine for displaying 3D data on the screen. In addition, it supports NVIDIA OptiX™ and Intel® OSPRay libraries as alternative backends for photo-realistic rendering.

15.3. Rasterization to path tracing

Let us start by comparing the appearance of the Can dataset using three rendering algorithms in ParaView.

Load the can.ex2 file using the Open File dialog. Click Apply, change to the 8th timestep using the Time controls in the toolbar and rotate the camera so that we get an interesting view of the dataset. The image you see in the RenderView is created via rasterization.

../_images/CanRasterization.png

Fig. 15.1 Rasterization with ParaView

Next click Enable Ray Tracing checkbox at the bottom of the View section of the Properties panel to display the different ray tracing controls.

../_images/RayTraceViewControls.png

Fig. 15.2 Properties panel in ParaView showing the major components for ray tracing

Change the Back End dropdown to OSPRay raycaster. The image that you now see was produced via the Ray Casting algorithm. The appearance of the object should show very little change. Without secondary rays, ray tracing and basic rasterization both compute only local illumination effects, where the color shown is essentially color emitted by the object itself.

../_images/CanRayCast.png

Fig. 15.3 Ray casting in ParaView

Next, check Shadows. This will send secondary rays that travel from the hit points in the scene toward point lights in the synthetic world. Wherever these shadow rays hit an object before the light, the color at the pixel is diminished, giving a hard shadow effect.

../_images/CanWithShadows.png

Fig. 15.4 Shadows with ray casting

Next change the Back End to either OSPRay pathtracer or OptiX pathtracer if the later is available on your system. Either one extends the process with an arbitrary number of secondary and further rays that evaluate the contribution to color from potentially every object in the scene.

../_images/CanWithOSPRayPT.png

Fig. 15.5 Path tracing with Intel® OSPRay in ParaView

../_images/CanWithOptiXPT.png

Fig. 15.6 Path tracing with NVIDIA OptiX™ in ParaView

Unfortunately this image suffers from a speckling or noise artifact. The red speckles on the white can-shaped block are where secondary light rays bounced off of the can directly onto the block to acquire a red color. In the real world, where there are many more photons than there are rays in this calculation, the red contribution gets averaged into the contributions made by many other sources. One way to eliminate the speckles is to simply cast more rays. Do so by setting Samples Per Pixel higher until the speckles are not noticeable.

With complex lighting, hundreds of samples per pixel might be required to reduce the noise. In this situation rendering slows to a crawl and interaction becomes impractical. One strategy to deal with this is to use progressive rendering. If you start ParaView with the --enable-streaming command line argument, Progressive Passes works like Samples Per Pixel except that extra rays are cast only once the mouse is released, after which images are repeatedly rendered and blended together such that the appearance improves over time.

Another strategy is AI denoising. To use it, make sure that Samples Per Pixel is at least 4 and then turn click the Denoise flag. This sends each rendered image through Intel’s OpenImageDenoise library where pixels are intelligently blurred to preemptively remove speckles. Do this now and compare the results with standard path tracing.

../_images/CanWithDenoising.png

One important thing to be aware of is that with the path tracer, the overall brightness of the scene appears greater than that with either rasterization or ray casting. Turn off Ray Tracing now and note how both the can and the block look brighter with path tracing. This is because of the fact that secondary rays, including those that hit ParaView’s default blue gray background, add color to the objects drawn. To minimize this you can darken the objects via the Edit Color Map dialog, the background via the Background Color controls, or everything at once via the Light Scale entry in the Ray Traced Rendering section of the Properties Panel. Set the Light Scale to 0.5 now to make the path traced image roughly match the brightness of the rasterized one.

../_images/CanWithDarkness.png

15.4. Materials

Besides more realistic light transport modeling, another way to add realism to a scene is to apply different materials to objects. A material is a description of a surface that includes properties such as color, shininess, opacity, sheen, and texture. Materials offer surface rendering options beyond the basic solid coloring and pseudo-coloring options available for scientific visualization.

Materials can be imported into ParaView from a JSON file that contains one or more material descriptions. Each material may link to textures stored in image files. Texture images that define surface colors, normals, and roughness are supported, providing a way to define a wide variety of detailed surface features not representable by the underlying mesh alone.

ParaView comes with an example JSON material file that contains several materials, including glass, copper, aluminum, wood, and others. Several of these materials also reference texture image files.

15.4.1. Loading Materials

We will start with a fresh session for this exercise.

  • Reset the session by selecting the Edit > Reset Session menu item from the toolbar.

  • Open the file can.ex2, and click apply.

  • In the Properties panel, change the Back End under the Ray Traced Rendering section to OSPRay pathtracer.

Next, we will load a material file. To load a file, use the File > Load Path Tracer Materials... menu item. Use the file selection dialog that appears to navigate to the location where ParaView’s example material is found in ParaView’s installation directory. On Windows, this location is usually C:/Program Files/ParaView-X.Y.Z-Windows-*/materials. On macOS, the materials file is stored in ParaView’s application bundle in /Applications/ParaView-X.Y.Z.app/Contents/materials. On Linux, the materials file is located in share/paraview-X.Y/materials in the directory where ParaView is installed. Once you have navigated to the materials directory, select and load the file ospray_mats.json.

After loading the materials file, not much will change in the ParaView user interface or current visualization. The loaded materials will appear as new items in the Material combo box in the Properties panel’s Display section. Click on this combo box to see the newly loaded materials. You will see these options in the combo box: None (use the standard surface display), aluminum, checker alpha, copper, glass, scratched, thin glass, water, wood, and Value Indexed. The default, None, means that no material will be applied to the surface and ParaView’s default coloring options will be used instead.

15.4.2. Applying a material

In this exercise, we will apply one of these materials to an object in the pipeline.

  • Select the can.ex2 file in the Pipeline Browser.

  • In the Properties panel, find the Material property and change it to copper.

  • Change the Samples Per Pixel property in the Ray Traced Rendering section to 2 to reduce noise speckle in the image.

You should see an image similar to this one:

../_images/CanSolidCopper.png

Note the copper color of the can and flat surface. The surface is shiny, and one part of the can is reflected in the other.

Material can be applied per object however multiple materials may be assigned to objects by mapping a cell data array to a material. This makes use of a special material mode called Value Indexed from the Material combo box. When this mode is selected, instead of applying a single material to an entire object, the selected cell data array in the Color By combo box will be treated as an index into a materials table. As such, the cell data array is expected to have a small number of integral values or strings that represent a separate material.

In Value Indexed mode, a materials table is defined by interpreting the color map for the selected cell data array as categories. Subsequently, each cell data value is mapped to a material name through the Annotations table in the Color Map Editor. To define the mapping from cell data array value to material, we set the value in the Annotations table to the value of the cell data, and the annotation to the name of the material as it appears in the Materials combo box.

In the next exercise, we will create a mapping from cell data value to material and use it to color two different parts of the can.ex2 by different materials.

15.4.3. Multiple materials per object

  • In the Properties panel, change the Material to Value Indexed.

  • Make sure the dataset color array is set to vtkBlockColors.

  • Open the Color Map Editor. Make sure the Interpret Values as Categories checkbox is checked.

  • Clear out all but two entries in the Annotations table by clicking on a row and clicking the toolbar button with the minus sign.

  • In the first row, set the Value to 0 and the Annotation to scratched.

  • In the second row, set the Value to 1 and the Annotation to wood.

When finished, the Color Map Editor should look like

../_images/MaterialsColorMapEditor.png

This table means that any cell in the can.ex2 whose texttt{vtkBlockId} value is 0 will have the scratched material and any cell whose value is 1 will have the wood material. Material assignments made in the Annotations table will update immediately in the render view. With the table values you set above, the rendering will look like

../_images/CanWithMultipleMaterials.png

If an invalid material name is assigned, the data will have the standard ParaView property and will take on the color that appears in the leftmost column of the annotations table.

Note that the cell data array in this exercise has one unique value per block in the multiblock dataset. There is no requirement that this be the case, however, and a single block may be colored by as many different materials as it has unique cell data array values.