RPS 20.12 Release Notes

RPS 20.12 Release Notes


RenderMan 20's Overlapping Volumes

Welcome to RPS 20.12!

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

Changes in 20.12_1684284

New Features in 20.12_1684284

  • Watertight dicing is now available in RenderMan 20.12 using RIS rendering. The watertight tessellation primarily aims to eliminate a major source of pinhole artifacts in objects by eliminating T-junctions that arise due to the use of regular rectangular dicing on adjacent faces.
Attribute "dice" "watertight"

Miscellaneous Changes in 20.12_1684284

  • User lobes now supported by the RixRenderState::GetOption interface.
  • Improved multiresolution tessellation cache("GUT cache") performance for reflection and transmission rays.
  • The new Stats page is a dark theme for users working in typically darkened environments and better matches DCC software style.
  • By default subsurface rays count as diffuse with respect to maxdiffusedepth. But the subsurface rays can be made to not count by setting the PxrPathTracer parameter "countSssAsDiffuse" to 0. This parameter is only available in 20.12+ and not 21.X
  • The default UV parameterization of a subdivision mesh is now consistent even when the subdivision mesh is pretessellated.
  • We now avoid writing to AOVs from patterns during opacity queries
  • PTex cache is now fully multi-threaded and more performant (both time and memory) in all rendering modes

Bug fixes in 20.12_1684284

  • Fixed an issue in memory display reporting
  • Memory corruption issues with patterns that trace rays have been addressed.
  • Fixed a bug where luminance clamping was applied too early for photon merging in PxrVCM and PxrUPBP.
  • Fix for compositing transmission for glass bxdfs with absorption at the glass interfaces (not within the glass itself).
  • In PxrPathTracer, subsurface scattering is no longer counted as a diffuse bounce (w.r.t. maxdiffusedepth). As a result, scenes containing a mix off diffuse reflections and subsurface scattering might be a bit brighter in some places.
  • Time stats page did not correctly break down time by component. The Time page has been rewritten as well as the Raytracing page to give a more accurate breakdown.
  • Significantly reduced occurrence of pinhole artifacts.
  • Bug fix for volume traversal where numerical precision issues would very occasionally cause portions of a volume to be skipped.
  • Watertight dicing did not always correctly operate on extraordinary faces, now fixed.
  • The orientation of Nn on RiSpheres in scenes with Orientation "rh" and object transforms with negative determinant was inverted. Now it can be selectively fixed by turning on Option "quadric" "orientspheretotransform" or the corresponding rendermn.ini setting (same as for Ngn).

Changes in 20.11_1645142

Miscellaneous Changes in 20.11_1645142

  • By default, RIS mode rendering no longer combines hits across different instances that share the same Bxdf into a single shading context. This is the more correct behavior if shading variation is desired between instances, but may lead to a loss of efficiency otherwise. Attribute "shadegroups" "attributecombining" may be set to "permissive" to re-enable the old behavior if the instances are guaranteed to be identical in shading.
  • ObjectBegin no longer resets the currently defined Bxdf to "null".
  • Added support for shadowexcludesubset, reflectexcludesubset, and transmitexcludesubset attributes.
  • PxrLMSubsurface no longer includes specular color in the albedo AOV if there is a non-black subsurface albedo.

Bug fixes in 20.11_1645142

  • Fixed a bug where the reported display driver memory stat is too high when checkpointing is used.
  • Fixed a bug where a geo light with high curvature could be incorrectly culled.
  • The "curvature" built-in for RIS had a discontinuity at surface saddle points. This has been fixed: "curvature" is now smooth where it should be.
  • Fix invalid pixel aspect ratio written by deepexr driver.
  • Setting Attribute "visibility" "specular" [0] "diffuse" [0] no longer has the (intentional) side effect of also forcing indirect visibility to be off
  • Fixed a bug in which an overly high pixel variance or relative pixel variance could change from reduced sampling to oversampling.
  • A regression in performance for scenes with high numbers of instanced dense polygonal meshes in 20.10 has been fixed.
  • Fixed a crash when using the asrgba option of the deepexr driver.
  • On Windows denoise would occasionally refuse to function claiming the CRC was wrong.
  • Fixed a bug in the deepexr that could produce negative alphas when rendering volumes and outputting half floats.
  • Fixed a bug where using fixed sampling and light linking together could sometimes result in wrong light intensities.
  • Fix potential render stall for blocking SSS rays.
  • Fixed a bug where a light's shadowSubset and attribute shadowsubset wouldn't be combined properly. We are now properly using the intersection of the subsets. Similarly for shadow exclude subsets.

Changes in 20.10_1623687


    RenderMan's version change to 20.10 necessitated a change to the versioning API. RendererInfo::versionNumber was deprecated (renamed to RendererInfo::_UNUSED) as it would have reported an incorrect version. Any code which referenced versionNumber should use versionCode going forward.

New Features in 20.10_1623687

  • Exposed an attribute that allows the user to assign a relative pixel variance to an object or collection of objects. Artists can use this to improve sampling where it's needed instead of relying on global controls. Please note that large differences may cause artifacts around objects and small changes are recommended.
Attribute "shade" "relativepixelvariance" [float]
  • Added a new Display Driver for Deep Output for OpenEXRs. This supports arbitrary sets of channels, Zback for volumes, and both tiled and scanline formats.
"int asrgba" [0|1]
 Override first four channel names with RGBA. Default 0.
"string compression" ["none"|"rle"|"zips"]
 Type of compression to use.  Default "zips".
"string type" ["half"|"float"]
 Whether to store data as half or float. Z and ZBack always float. Default "float".
"string storage" ["tile"|"scanline"]
 Whether to write a random-order tiled EXR or an increasing-order scanline EXR. The former should require less memory to
 write, the later is directly usable in Nuke. Default "tile".
"int[2] tilesize"
 Size of the tiles if using tiled storage. Default [16 16].

Miscellaneous Changes in 20.10_1623687

  • Removed RendererInfo::versionNumber member as RendererInfo::versionCode is a much more reliable representation
  • Optimized NURBs raytracing performance.
  • Improved performance of light filters.

Bug fixes in 20.10_1623687

  • Fixed a crash using Display Channels with long names.
  • Fix rendering problems with instanced polygon meshes that contain more than 10240 vertices.
  • A problem with slow to start instanced dense subdivision and polygon meshes has been fixed.
  • Fixed a bug in deep output where alpha could be incorrectly handled in some cases.
  • Fixed a possible crash when using large textures (4k and higher) mapped to lights.
  • An issue where rays failed to completely exit a series of coincident RiVolumes (leading to alpha channel issues, amongst other problems) has been addressed.

Changes in 20.9_1602511

New Features in 20.9_1602511

  • There is now a way to de-prioritize low luminance samples in the adaptive sampler. Before it was possible the adaptive sampler was spending too much time sampling dark areas of an image where it was less important. The user can now add a small boost to the pixels for sampling consideration using a hider control. Using higher values may speed up render times. We suggest beginning with small amounts, e.g. 0.05. The default maintains the old behavior at 0.0:

    Hider "raytrace" "float darkfalloff" [0.0]

Default Render Result


Falloff Off - Samples per Pixel


Falloff On -- Samples per Pixel, note the reduction.

  • New AOV "float rawID" that passes through integer id values to the display driver unchanged. For example, using: Attribute "identifier" "int id" [4294699949] on an object will result in the display driver receiving a value that is -nan if the bits are interpreted as a float, but the original 4294699949 is interpreted as an unsigned int.

Miscellaneous Changes in 20.9_1602511

  • Made improvements to light localization mode 3 that should reduce noise in renders.

Bug fixes in 20.9_1602511

  • Fixed an issue with instances, lights, and geometry. Geometry included in the same object instance as a light was being turned inside-out.
  • Fixed potential crash in RIS when more than 32 volumes are all overlapping.
  • Fixed an issue with auto-crop and AOVs without alpha.
  • Fixed an improper default value in PxrCamera for the sweep parameter.
  • Fixed polygonal model displacement tearing.
  • Fixed an issue with IES profiles causing a crash.

Changes in 20.8_1587495

New Features in 20.8_1587495

  • PxrPathTracer now supports three new attributes. These new attributes allow for a group subset to be used when tracing shadow, reflection, and refraction rays, respectively.:

    Attribute "trace" "string shadowsubset" ["<group-membership>"]
    Attribute "trace" "string reflectsubset" ["<group-membership>"]
    Attribute "trace" "string transmitsubset" ["<group-membership>"]
  • Implemented new per-path-depth timer for PxrPathTracer integrator. The new feature reports the time spent at each ray depth for the user to tune the performance impact of maxPathDepth. The time is reported in wallclock time.

  • Logging is enabled from the command line (-loglevel/-logfile) The logger can print to stdout/stderr (default) or be redirected to file.:

    -logfile s        : override render log file
    -loglevel i       : override render log level, 0..4
  • A timer is added to account for the time spent preparing/intersecting/batching primary rays. The two stats are combined together in the stats java scripts to plot a nice histogram in the "integration" tab of the artist friendly stats.

  • It is now possible to maintain a checkpointed "final" image using either an .ini setting or a RIB option, with the later overriding the former. If neither is present it defaults to off. When set, this prevents stripping out the extra channels and the checkpoint tag when writing the file image for the render. The final image will essentially be just another checkpoint, rather than a slimmed down image:

    /prman/checkpoint/asfinal [bool]
    Option "checkpoint" "int asfinal" [0|1]

Miscellaneous Changes in 20.8_1587495

  • Python binding now supports python 3.5

Bug fixes in 20.8_1587495

  • Fixed a bug where the commandline -res option would crop instead of scaling if 'Camera "world"' was used in the RIB. This affected RFM generated RIB.
  • Fix a precision problem in bump mapping which could lead to faceted normals on very large surfaces.
  • A bug that caused some lighting services time stats to be considered unaccounted when viewing the XML stats has been fixed.
  • The sigmaAlphaOnly.filter.json configuration file was broken. Fixed JSON structure to match denoiser's expectations.
  • Setting maxDensity of PxrVolume to negative values gets clamped to zero avoiding a crash.
  • Float RGBA 64x64-sized buckets were split vertically in four because the dspy server buffer size. This only affected display not the rendered bucket size.
  • Issues with Attribute "shade" "camerahitmode/diffusehitmode/etc" "primitive" and RiVolume have been fixed.
  • Fixed a bug causing partially missing surfaces when using instanced trimmed NURBS patches.
  • Light maps were not accounted in either memory and time stats.
  • Jaggy surface edges near trim curves on trimmed NURBS patches have been fixed.
  • Fixed a potential crash when using -recover 1 with many and/or large output images.
  • Fixed a bug where a parameter value of "" (empty string) would be replaced with the default value for an OSL shader.
  • Fixed possible issue with license management on Windows machines.
  • Fixed multi-threading issue that could lead to only a subset of the plug-ins with the same __instanceid responding to re-rendering edits.

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,
      RtRayGeometry const* /* rays */,
      RixRNG* /* rng */,
      RixIntegratorContext& iCtx,   /* <-- MUST ADD THIS LINE */
      RtColorRGB* 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 ShadingRate 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 RixTexture where a failed AquireTexure followed by a ReleaseTexture 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 RixShadingContext::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
  • Lights, 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 (PxrColorBlend.h) prevented users from compiling the PxrBlend pattern plugin. This has been addressed.
  • Querying k_launchShadingCtxId 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 Color 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 Lights 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.
  • Cameras 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.

PxrCamera Plugin

PxrCamera 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.

Shading 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

  • Camera 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 backColor to diffuseColor.
  • 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.

System Message: WARNING/2 (../rps/release_notes/rnotes-20.12.txt, line 923); backlink

Duplicate explicit target name: "renderman 20".