Construct rendering
The frame pipeline after each engine, tone mapping and post-effect parameters in the Construct viewport
Status: Complete Last Updated: 2026-10-19
The pages in this section describe how the Construct viewport colors a surface, and the post-processing stage: what happens to a frame after the surface is shaded and before it reaches the screen or an export file.
- Mesh and tet volume items - The two tones, the edges, the fields and colormaps, and two items in one place.
- Field kernels - The derived values of a solve, such as the von Mises stress and the factor of safety, and how to add one.
- Tone mapping - The fifteen built-in tone mappers, with a rendered sample of each.
- Post-effect parameters - Why every post effect presents its parameters the same way, and how those values are stored.
For the shading modes themselves, see Rendering Modes.
How a frame is made
A frame is made in two halves:
- The engine decides the color of each pixel. The raster engine shades the surfaces in one pass, which is what the PBR and Environment-lit PBR engines show. The path tracer adds samples over time, which is what the Path Traced engine shows. Each engine hands on the same set of images: the light of each pixel, and the depth, the item, the normal and the color of the surface that the pixel sees. Each frame also carries the version of the view it was made for, its sample count and its noise level.
- The frame pipeline runs after the engine, the same for every engine and in every host: the viewport, the export and an OPAL capture.
The frame pipeline has these stages, in this order:
| Stage | What it does | Which frames |
|---|---|---|
| 1. Staleness gate | Compares the frame's view version with the current view. A traced frame shows the last complete sample, and after a camera move that sample still belongs to the old view until the first sample of the new view completes. The frame keeps the old version, so neither the viewport nor OPAL takes it as the current image | Path-traced |
| 2. Denoiser | Removes the grain of the samples. It reads the light, the albedo, the normal and the depth of the frame. The viewport runs the Viewport denoiser on each frame it shows, and an export runs the Final denoiser once, at the end of each frame. See Path-traced quality | Path-traced |
| 3. Navigation frame | While the view moves, the tracer traces at a fraction of the resolution, and the frame shows its pixels as blocks (nearest-neighbor filtering) rather than blur. A full-size frame keeps the linear filter | Path-traced, while the view moves |
| 4. Composite | Draws the traced image into the frame with the depth of each pixel, so meshes, proxies and the bounds of items sit in front of it or behind it as they do in the other modes | Path-traced |
| 5. Exposure and tone mapping | Maps the linear light to the display. See Tone mapping | All |
| 6. Post effects | Bloom, dither, FXAA and the other effects of the post chain. See Post-effect parameters | All |
| 7. Overlays | The selection and hover highlights | All |
| 8. Target | The copy to the screen, the export file or the OPAL image | All |
A raster frame is always made for the view of its own tick, and it has no noise. So it goes straight from the engine to stage 5.
So a post effect, a tone mapper or a highlight works the same in every mode, and an export applies the same chain as the viewport. With the same denoiser, an export and the viewport at the same sample count give the same image.
In the code, RenderPipeline::renderScenePass() is the raster engine's half,
and RenderPipeline::runFramePipeline() runs the post chain and the overlays
on its result. The viewport host and the exporter run stages 1 to 3 on the
tracer's frame, and the scene pass then composites it (stage 4). The
libconstruct path tracer reference
names the classes.