RPS 20.7 Release Notes

RPS 20.7 Release Notes


"RenderMan 20's Overlapping Volumes"

Welcome to RPS 20.7!

Welcome to RenderMan 20.7 This version builds on the initial release of Renderman 20. The notes below include numerous bug fixes and performance enhancements.

Changes in 20.7_1571626

New Features in 20.7_1571626


    Changes to RenderMan 20.7 include an API change that requires code changes and recompilation of any custom volume plugins.

    RixVolumeIntegrator has a default GetTransmission implementation (simply recompiling is not sufficient unless errors about virtual method overrides are enabled). Without the recommended change, the default implementation (which does nothing and may leave NaNs in the image) will be compiled in and will be called instead of your code.

    1. Any Bxdf that implements an interior volume integrator (including shaders that implement subsurface, glass, or volumetric effects) must at the very minimum be recompiled. Failing to do so may result in crashes with no warnings.

    2. In addition, any shader that implements a RixVolumeIntegrator with a GetTransmission method must update the source code and add a parameter to the function signature below:

    virtual void GetTransmission(
      int numRays,
      RtRayジオメトリ const* /* rays */,
      RixRNG* /* rng */,
      RixIntegratorContext& iCtx,   /* <-- MUST ADD THIS LINE */
      RtカラーRGB* trans,
      // optional input;
      char const* /* subset */ = NULL)
  • Heterogeneous volumes (using a PxrVolume BXDF bound to an RiVolume) can be multiple times faster to render, depending on the density of the volume. In addition, sparse and overlapping volumes are less noisy to render.

    PxrVolume now defaults to 4 samples and adds the ability to use a primvar for density directly without having to wire a PxrPrimVar input. The maxDensity parameter can also be set higher without greatly impacting render times, as the renderer will also automatically compute density bounds.

    As part of the optimizations for heterogeneous volumes, RiVolumes in RIS that use ImplicitField DSOs will no longer perform filtered evaluations, as doing so will result in a biased (and incorrect) render. You can find more information in the documentation for PxrVolume.

    Please note that シェーディングRate on RiVolumes should be increased to improve render times and decrease memory usage on scenes that may be affected. In some cases you can use high values, i.e. 25 or more. When rendering with RIS this will have little visual impact if carefully used. Experimentation may be required if memory usage has changed.

  • Added new diagnostic built-in AOVs: "float cpuTime" and "float sampleCount". These AOVs provide time spent and samples per pixel respectively.

  • Added new special filter option, "sum", for Display and DisplayChannel "string filter" parameter.

  • Min, max, zmin, and zmax filters are now implemented for deep image output. Id channels default to zmin and are consequently now filtered in a reasonable (non-blended) way.

Miscellaneous Changes in 20.7_1571626

  • OpenVDB has been updated to version 3.1.0 and should be backwards compatible with previous version 2.1.0. This allows RenderMan to support OpenVDB files exported from the latest versions of Houdini.

Bug fixes in 20.7_1571626

  • Important:

    Fixed incorrect compositing of LM layers. This will often change the appearance of existing assets. To keep the legacy (incorrect) behavior in your scene, you can emit the following option: Option "user" "int lmEnableIncorrectLayering" 1

    The below example shows the legacy (incorrect) behavior on the left. Notice the change in how the gradient is rendered across the sphere.

  • Fixed the value of the k_Nn builtin when shading RiPoints with no primvar normal.
  • Fixed calculation of dPdtime for object instances.
  • Fixed use of -recover 1 when using the RiDisplayChannel "source" parameter.
  • The curvature on coarse polygon meshes with vertex normals was too high. This could lead to overly blurry specular reflections from such geometry.
  • Fix a regression with equiangular sampling in scenes with only an environment light
  • A bug in the curvature calculation for displaced surfaces in RIS has been fixed.
  • Fixed bug causing a small chance for randomly missing faces on raytraced Loop subdivision meshes.
  • Fixed a bug in "string filter" "average" mode for Display and DisplayChannel.
  • Fixed a crashing bug in homogeneous volumes with indirect lighting.

Changes in 20.6_1562369

New Features in 20.6_1562369

  • PxrPathTracer can now track the diffusedepth and speculardepth separately from each other based on which lobe of the BSDF is sampled. Previously rays that have both diffuse and specular contributions increment both the diffuse and specular depths. The new behavior is more intuitive and produce expected results when adjusting the trace:maxdiffusedepth and trace:maxspeculardepth attributes. This comes at the cost of, in some cases, effectively doubling the number of indirect ray bounces which can cause look differences and/or increase render times. We still default to the old behavior in order to avoid image differences and no action is needed by the user to preserve their previous results. Use Option "trace" "string depthmode" ["separate"] to enable the new behavior, or Option "trace" "string depthmode" ["combined"] for the old behavior. Alternatively, the new or old behavior can be enabled/disabled via a rendermn.ini setting: /prman/trace/depthmode separate|combined

Left, the old behavior (Combined). Right, optional new behavior (Separate). Notice that the right image is brighter where the ceiling is indirectly lit.

Miscellaneous Changes in 20.6_1562369

  • The Denoise feature now prints a version number in the command-line help.

Bug fixes in 20.6_1562369

  • Fixed an issue introduced in 20.5 that would cause a crash in light sampling when equiangular volume sampling is enabled.
  • Fixed a bug where near clipping planes intersecting volumes created camera rays that did not undergo scatter within the volume.
  • Surface cracks due to missing ray hits near trim curves on NURBS surfaces has been fixed.
  • Fixed statistics AOV results when using -recover 1
  • Fixed a crash when rendering an empty scene in RIS mode with adaptive sampling and non-zero PixelVariance.
  • Fixed a sampling correlation that limited convergence of even and odd half-buffers.

Changes in 20.5_1555015

New Features in 20.5_1555015

  • PxrVolume can now take multiple samples over single scatter volume rendering by setting the new samples parameter. Taking multiple samples in the volume is a faster variance reduction technique than raising the number of pixel samples. Typical speedups can be up to 4X compared to before. [Note multi-scatter volumes do not benefit from this setting.]

Original method with 64 pixel samples on the left. Increasing volume samples to 64 on the right with 64 pixel samples.

Miscellaneous Changes in 20.5_1555015

  • When setting a builtin variable on a mutable shading context being used for volume sampling, other builtins on that context are no longer automatically recomputed. For example, changing the value of P will not automatically adjust VLen; if a volume shader would like the VLen builtin to reflect the modified P, it needs to explicitly set a modified VLen on the context as well.

Bug fixes in 20.5_1555015

  • Fixed potential crashes when using a per-face texture (PTex), or attempting to use a missing or corrupt texture, during initialization or a CreateInstanceData() call of a plugin in a singlethreaded RIS or REYES render.
  • Fixed missing albedo channel for LMLayer Bxdf.
  • Fixed an issue where User LPE lobes were broken or ignored.
  • Fixed a crash that occurs when making distance lights visible to the camera.
  • Resolved issues with overlapping volumes when the camera is inside one of the volumes.
  • Fixed a bug that could cause incorrect access to primvars in OSL on RiVolume primitives.
  • Fixed a bug in Rixテクスチャ where a failed AquireTexure followed by a Releaseテクスチャ or using OSL gettextureinfo on a texture than cannot be opened would cause a crash.
  • Fixed a bug where a crash was possible in scenes using only geometry/mesh lights.

Changes in 20.4_1545505

Miscellaneous Changes in 20.4_1545505

  • Specification of deformation motion blur on RiVolume by dPdtime and time primvars alone is no longer supported in RIS; these primvars no longer trigger any special behavior.
  • SeExpr curve() and ccurve() functions now allow dynamic evaluation of expressions passed as arguments to these functions.

Bug fixes in 20.4_1545505

  • The k_dPdtime built-in is now correctly computed by RixシェーディングContext::GetBuiltinVar on RiVolumes in the case of transform or no motion blur. Deformation motion blur is not supported.
  • Fixed an issue with parsing of wrap modes for EXR textures. This solves problems where a seam may be visible in latlong environments.
  • In rare cases involving a Bxdf with both an opacity shader and an interior integrator, the renderer may have correctly skipped the interior shader but neglected to run the opacity shader. Generally this would only be a problem when dealing with non-closed surfaces to which a volume has been bound (such a situation is not recommended and should be avoided in any event).
  • Bug fix to more carefully eliminate subsurface rays not inside an object and diffuse rays (at sss ray hit points) not outside the object.
  • Transforms to UVW space on deforming RiVolumes no longer returns an unuseable result.
  • Matte objects no longer show up in the built-in AOVs such as dPdtime and Nn.
  • GetPrimVar now returns correct P and dPdtime values for deforming RiPoints.
  • Fixed a bug where the luminance clamp wasn't applied until one bounce after the specified clamp depth on emissive objects in PxrPathTracer.
  • Rotational fix for environment lights in RIS. Environment lights in reflections previously appeared with a marginal incorrect rotation. This has now been fixed and environment lights now have a consistent rotation with REYES, and also with the environment light as visible to the camera.
  • Checkpoint recovery (-recover 1) now works for renders that include null displays or auxiliary OpenEXR displays.
  • SIGHUP on Linux to request a stats and checkpoint update no longer causes early termination when a checkpoint exit-at time is set.
  • Fixed an issue where stats output were not displayed correctly in Google Chrome.

Changes in 20.3_1534387

New Features in 20.3_1534387

  • New feature that optionally disables merging of shading geometry in RIS if object IDs differ. Use Option "shading" "int mergedifferingobjectids" [0|1] to toggle this new option. By default mergedifferingobjectids = 1
  • ライト, gobos, barndoors and blockers now support multi segment motion blur.

Miscellaneous Changes in 20.3_1534387

  • Added a rendermn.ini setting: /prman/quadric/orientspheretotransform and an option: quadric orientspheretotransform These - defaulting to 0 (off) - ensure that RiSpheres in a coordinate frame with a negative determinant and an 'rh' orientation render with front sides visible to the camera. They default to 'off' to preserve the older, incorrect behaviour for backwards-compatibility.

Bug fixes in 20.3_1534387

  • Dirmapping will now be applied to both file and xml statistics filenames.
  • The __Pref, __WPref, __Nref and __WNref AOVs now output the expected values.
  • PxrLMGlass now works correctly with a pattern graph input into the absorption parameter.
  • Fixed a crash when an AreaLightSource shader was assigned to a subset of faces on a hierarchical subdivision surface. Face assignment of AreaLightSources is not supported.
  • A missing header file (PxrカラーBlend.h) prevented users from compiling the PxrBlend pattern plugin. This has been addressed.
  • Querying k_launchシェーディングCtxId in volume transmission shading contexts now returns the correct ID.
  • Fixed a bug in PxrProjector that would cause incorrect occlusion when motion-blurred. Also allowed PxrProjector to take into account user-defined trace bias when auto-bias is off.
  • Fixed a bug where error messages could indicate the wrong volume in the case of overlapping volumes
  • PxrLMSubsurface no longer ignores its parameters continuationRays and followTopology.
  • Addressed a bug that could cause multi-scattered overlapping volumes to access the wrong attributes.
  • Fixed a bug causing potential primvar corruption on the last face of a deforming triangle mesh with __faceindex data.

Changes in 20.2_1521997

Miscellaneous Changes in 20.2_1521997

  • We now prevent imager shaders from overwriting statistics AOVs.
  • lpe:beauty has been added to the list of AOV presets to simplify outputting beauty per light group AOVs.
  • Improved filter size computation in PxrProjector.
  • Attribute "dice" "binary" is no longer supported.
  • Changed default of object ID for instances to -1 which is in-line with the default for non-instanced objects. Also, the default (-1) for object instances now means to defer to the object ID associated with the master.

Bug fixes in 20.2_1521997

  • Fixed a bug causing potential for incorrect ray misses on semitransparent RiPoints geometry.
  • Fixed a crash when using the PxrVCM and volumes.
  • Fix a bug introduced in 20.0: if a Bxdf had both a volume integrator and an opacity shader both bound to it, the opacity was sometimes run one too many times.
  • Fixed a bug where zero-normal hits could be returned for curves with negative widths.
  • Fixed a bug where PxrPathTracer ignored material responses inside a volume.
  • Fixed crashes when calling GetPrimVar during BeginInterior on interior volumes (not RiVolumes).
  • Fix motion blur of instanced polygons with deformation and displacement.
  • Fixed a bug in volume integrators where negative densities coming from an upstream pattern network caused errors in the volume integration, resulting in speckled artifacts.
  • Addressed a problem in volume renders where multiple volumes with regions of zero density could cause the path tracer to terminate early.
  • Fixed a crash in Reyes when a light is not found in the input category list.
  • Fixed a crash in Reyes where face-varying color Os primvars caused an error during shadow tracing.
  • Fixed a bug that prevented PxrMarschnerHair from using Opacity カラー on shadows.
  • Fixed a bug introduced in 20.1 where ray misses in Z output for edges of objects against transparent backgrounds would not denoise properly.
  • Fixed a bug causing the potential for corrupted data in deep output that didn't include alpha as the last channel.
  • A primary display of "rgb" using the deepshadow display driver no longer results in a crash.

New Features in 20.1

Simplified Standard AOVs

Production integrators can now output geometric AOVs (__Pworld, __Nworld, etc.) Previously this required the use of PxrGeometricAOVs pattern. The older workflow is deprecated in favor of simple global control.

Changes in 20.1_1509300

Miscellaneous Changes in 20.1_1509300

  • HasLimitSurface now accounts for whether AOVs are going to be allocated for subdivision API.
  • Performance improved for transmission rays and coincident volume envelopes.

Bug fixes in 20.1_1509300

  • Fixed an issue where Environment ライト using an OpenEXR latlong texture did not match the orientation when using Enable Procedural. Scenes with existing environment lights using Enable Procedural will be rotated 180° to be consistent when Enable Procedural is disabled.
  • Changed the noise patterns generated for frames to resolves issues when viewing in stereo.
  • Fixed an issue with possible crashes with bad bounding boxes in RIS. It now prints a warning.
  • Fixed a crash with pretessellated objects.
  • Fixed an issue where some per-instance variation was ignored.
  • Resolved an issue where non-overlapping volumes create artifacts.
  • Fixed a problem in REYES where a sphere area light may render incorrectly to the camera.
  • Fixed a possible issue with overlapping volumes that rendered incorrectly.
  • Volumes now get the correct gprim binding.
  • Fixed an issue where scenes containing OpenVDB use too much memory.
  • Fixed an issue with the 256 char path length limit in ptxmake/ptrender

Welcome to RPS 20!

Welcome to RenderMan 20. This release introduces many new improvements to the previous release. There are many volume improvements, new holdout workflows, a production quality hair Bxdf, a new physicaly based camera projection plugin, a new visualizer integrator, and much more. In addition there are changes to APIs and new APIs for the developers. Please dive into the release notes below for more detailed information.

New Features


PRMan now includes a render denoising utility. It has the ability to emit the special set of AOVs that this tool requires to produce denoised images.

Volume Improvements

  • RIS now supports the rendering of overlapping volumes. There are no limitations on the physical properties of these volumes - volumes of arbitrary density, albedo, phase function, etc. may be overlapped with physically accurate results.
  • Support for equiangular importance sampling has been added to volumes. This can significantly improve convergence for scenes with lights inside volumes with low and/or slowly varying density.
  • Volumes which use complicated field functions (such as OpenVDB) are now up to twice as fast to render.
  • Issues pertaining to camera-visible volumes (including the blocking of environment lights and requirements that such volumes also required indirect visibility) have been fixed.
  • RiVolumes may now be coincident with each other. A subsequent patch release will further improve the robustness of RiVolumes coincident with other geometry as well.
  • カメラs can now render from within multiple RiVolumes.


A new holdout LPE prefix is available to collect shadows, reflections, and other channels from the CG objects on a holdout object. This allows compositing CG shadows, reflections and other channels onto a background image or an image plane interactively at render time.


A new hair Bxdf PxrMarschnerHair is available. This Bxdf was developed for production at Pixar Animation Studios.

User Defined Signal LPE

Additional LPE tokens (U1 to U8) are now available for Bxdfs to output user defined signal LPEs such as albedo. In addition, LPEs now support intersection with the '&' symbol.

New Improved AreaLight Source Shaders

New RIS-only AreaLight Source shaders: PxrStdAreaLight, PxrStdEnvDayLight, and PxrStdEnvMapLight.

New Light Filter API

There is a new C++ API which allows developers to create more complex, custom light filter shaders.

Improved Light localization

Improves noise with multiple light sources. The default for RIS, mode 0, has been modified to get improved results in situations that combine environment/distant and local lights. A new mode, mode 4 (RIS-only), has been added that dynamically adjusts the relative importance of lights as the scene is rendered, accounting for Bxdf response to illumination and occlusion. In addition, mode 3 has been optimised so that it is faster in the case of very many light sources. See lights documentation for details.

New Subsurface scattering features in RIS

The subsurface scattering Bxdfs can now request sss continuation rays and whether the scattering amount should take surface topology into account: "continuationRays" (int) and "followTopology" (float) parameters. The scattering distance in simple/PxrSubsurface Bxdf can now (optionally) be specified in an alternative way: "meanFreePath" (color) instead of "diffuseMeanFreePath" (color).

Visualizer Integrator

PxrVisualizer is a new integrator that can be used to navigate large scenes and inspect geometry during Interactive re-rendering. It allows different styles of viewing, including shaded, flat, normals, st, wireframe.

Pxrカメラ Plugin

Pxrカメラ is a camera plugin that approximates a number of real world physical effects. It supports all of the traditional prman perspective camera settings, including shaped motion blur and bokeh.

Important Differences

API Updates

  • The RixDisplayServices has been reworked in order to better allow for effects with pixel alpha. The Splat(), SplatMulti(), and Write() calls no longer take a defaulted transmittance. Instead, integrators (and possibly patterns or bxdfs that write to the display) should explicitly call the new WriteOpacity() or SplatOpacity() methods in order to change the camera-visible opacity along a ray path.
  • HullCorners and HullCornersMotion have been added to ImplicitField. These allow an implicit plugin to specify bounds in the form of a convex hull instead of an axis-aligned bounding box.
  • There is now a version associated with each compiled plug-in. All user plugins will need to be recompiled or the renderer will show a version mismatch error.


  • librix is now part of the RenderMan Pro Server package. It is no longer a separate download. In addition, librixRMANTREE.a has been renamed to libprmanloader.{a,lib} It is recommended to use librix as it contains all the functionality of libprmanloader as well as the RI tokens and more.

シェーディング Plugin Versioning

  • Starting with RPS 20, we will be distributing two versions of shading plugins: the current version and the previous version, which is built with the current version of RPS API. This is to support shading plugin backward compatibility and upgrade. The path for the last version is ${RMANTREE}/lib/RIS/r19.
  • We have added version checking for all plugins. This means that all prior user plugins will need to be recompiled in order to load.


  • PxrHair is moved to ${RMANTREE}/lib/RIS/r19/bxdf. It will not be supported in the future releases. It is being replaced by PxrMarschnerHair, which is production proven, physically correct, and it is the same production hair Bxdf being used at Pixar Animation Studios. If you need to re-render with PxrHair in your existing scenes, you can include this new path in your rendermn.ini's standardrixpluginpath. In addition, PxrHair Goldman diffuse was computing incorrect result which yielded about 5 times brighter than it should be. This is now fixed.
  • PxrLM and PxrDisney now support uniform Presence parameter which can be set to a value such as 0. It is important to note that setting a value between 0 and 1 will produce unwanted noise in the render.
  • An artist guide to Visibility, Presence, and Opacity explains when and how to set Presence.
  • PxrBxdfBlend is moved to ${RMANTREE}/lib/RIS/r19/bxdf. It will be deprecated in the future release.
  • An inputAOV parameter has been added to PxrSkin.


  • PxrLayeredBlend is an expansion of PxrBlend that takes up to 8 layers as input.
  • The PxrTee pattern passes either an inputRGB to resultRGB, or inputF to resultF unchanged. It writes the values to a matching AOV when shading a camera-visible primary ray.

Sides 1

  • カメラ rays respect visibility specified with "Sides 1". The interpretation of Sides (and ReverseOrientation etc.) is now the same in RIS as with the Reyes hider.


  • Checkpointing can now write valid deep images. Note that like TIFF checkpoints, this is write-only support for now.
  • A new Option "checkpoint" "string command" has been added. The option can also be specified through the prefs with /prman/checkpoint/command. If system calls are enabled, then the specified command will be executed after the checkpoint has been written.

Additional Changes

Miscellaneous Changes

  • Added zmin and zmax filtering support in RIS. These filters are support on the Display line or the DisplayChannel.
  • Projection plugins can now tint all color channels, not just the beauty pass.
  • Tightened up bounding boxes on instances with depth of field enabled.
  • PxrGamma's gamma parameter now defaults to 1.0 which provides the expected behavior.
  • Added warnings that are emitted when a render with -recover is not able to recover successfully.
  • Improved LPE parsing errors to check for unmatched closing ')', ']', and '>'.
  • The "/prman/deepcomp/flagvolumes false" .ini setting is now available for RIS as well.
  • Improved speed on certain cases of multi-threaded volume rendering.
  • Attribute "dice" "pretessellate" has been extended. If set to 2, the renderer will tessellate if possible rather than at discretion, meaning the memory heuristic will be ignored.
  • The PxrDirectLighting Integrator now supports primary visibility from emissive lights and geometry.

Bug Fixes

  • Fixed the blank alpha channel output by the PxrValidateBxdf Integrator.
  • Fixed translucency from backlighting on PxrLMPlastic by setting backカラー to diffuseカラー.
  • A bug that caused the renderer to crash when using single channel textures has been addressed.
  • A bug that caused the shadow collector LPE to be incorrectly black in areas where the the material response is zero has been fixed.
  • A bug causing matte objects to receive indirect illumination has been fixed.
  • A bug that would incorrectly cull environment light samples against a portal.
  • A bug that caused the renderer to crash when light-linking excluded a light with a positive fixed-sample count.
  • Fixed a crash from using PxrVolume, textured PxrEnvMapLight, and PxrAreaLight with the VCM integrator.
  • Fixed a crash in GetRixInterface from getting an RixTransform context with no render context.
  • Fixed constant and uniform primvar lookups on plugin-driven RiVolumes.
  • Fixed a bug with scaled instance size not reflected in bounding box size.
  • Fixed a bug where a backfacing object with sides = 1 was visible inside a volume.
  • Fixed stats for ShadedGrid counts.
  • Fixed space of input points to implicit plugins' HullCornersMotion.
  • Fixed bug causing potential crash when using geometric area light transmission portals.
  • Fixed a bug preventing updates to RiCoordinateSystems from working in live rendering.
  • Fixed precision errors causing raytracing errors in polymeshes with long, skinny faces.
  • Fixed a bug where objects behind volumes were not getting deep samples.
  • Fixed a crash from using the OpenEXR display driver's autocrop option and crop windows.
  • Fixed a crash on symbol table release when closing a procedural RIB stream.
  • Fixed a directional depended artifact caused when rendering rect area lights when the camera direction is parallel to the light direction.
  • Removed artifacts caused by using PxrLMGlass with thin shadows and an environment light.