RPS 16.0 Release Notes

RPS 16.0 Release Notes

Welcome to RenderMan Pro Server 16!

This release represents another significant milestone for global illumination and re-rendering with PRMan. We've greatly increased the efficiency of global illumination, both in terms of raw performance and thread scalability as well as in memory consumption. We've also introduced new RSL support to make writing physically plausible shaders easier and more efficient than ever, described in detail in a new application note.

A new raytrace hider has been added that allows you to bypass the REYES front-end and directly trace primary rays. It has application in both interactive and final-quality rendering. The raytrace hider is well suited for a subset of rendering applications where scene complexity doesn't exceed system memory. As a re-renderer, it is attractive for lookdev and previs applications due to its low startup cost and support for a broader range of scene edits. As a final-frame renderer, it supports esoteric sampling effects due to its arbitrary camera projection and full temporal shading. For final-quality relighting applications, the REYES re-renderer (a.k.a. "Lumiere") remains attractive due to its scalability and support for partial recomputation. Both re-renderers now support shader-instance edits, while the raytrace re-renderer alone supports camera edits.

Ray-traced shadows have been greatly improved through a combination of low-level improvements and the addition of new RSL function, areashadow. The new function better expresses the underlying shadowing requirements to the renderer, which often results in larger ray bundles and therefore significant speed gains. The areashadow() function supports tracing directly into the scene and the tracing of deep shadow files. Traceable deep shadows offer an advantage over direct scene tracing by reducing the memory overhead associated with a scene by leveraging rasterization and texture-caching. Rasterization carries with it some disadvantages, though, so you'll need to carefully evaluate the tradeoff between direct and deep-shadow modes. Because of the potential speedups and expressivity associated with areashadow(), we recommend that current uses of the transmission() function be evaluated for conversion.

New controls to reduce costs associated with ray-traced displacements and to automatically simplify ray-traced geometry introduce new acceleration and memory-reduction opportunities. A new shading mode also allows shaders to selectively replace ray-hit shading with texture3d lookups.

To round out the set of ray tracing improvements, we are introducing a new Application Note, The Importance of Importance. The single most significant control over the cost of ray tracing in PRMan is the number of rays your shaders choose to cast. In this appnote we describe some of the well-known tricks to prune the potentially large ray trees that recursive ray tracing algorithms can produce too easily. We hope that presenting this information in an easily digested, RSL-centric form will encourage you to employ these tricks in your production shaders.

While these new features and optimizations make ray tracing ever more attractive, the REYES (a.k.a. stochastic) hider can still be significantly more efficient in memory consumption, displacement shading, and motion blur speed. Certain non-physical lens and shading effects are only possible with the REYES hider, while other physical effects may only be possible with the raytrace hider. Our hybrid REYES/rays architecture lets you select the sweet spot for your shot or show.

Of course, no RPS release would be complete without a large collection of general improvements and we're pleased to offer a bumper crop in version 16.

In the realm of point-based techniques, we've added support for the baking of spherical harmonic visibility. This can be coupled with a new txmake environment map encoding to produce fast low-frequency environment lighting. A new getpoints() RSL function provides direct access to data stored in point cloud files. We've also implemented the long-requested "worldspace" dicing mode in this release to simplify baking pipelines.

A number of extensions to our deep texture file format and subsystems have been made in this release. We've extended the file format and output driver to support deep compositing, allowing you to deliver rgba data directly into deep texture files. We've generalized the dtex file format to support multiple subimages in a single deep texture file; each subimage can be comprised of any number of channels and have its own image resolution and coordinate systems. We've written example deep-compositing applications built atop our new RixDeepTexture API. This new C++ API will be available in the form of a freely redistributable shared library, librix.so/dll. We hope that this combination of enhancements and APIs will help to promote a standard multi-view deep compositing workflow like that pioneered by the folks at Weta Digital. We've also added a new deep method, areashadow, that produces the deep texture data suitable for use by the new areashadow RSL function. Also, traditional deepopacity files will be significantly smaller due to an improved compression technique.

A new texture-synthesis plugin type has been added that allows plugins to deliver texture data directly to PRMan's texture cache, where it is automatically antialiased for delivery to shaders via the texture() RSL function. A texture plugin is provided with this release that allows you to treat SVG files (a standard vector image format) like standard pixel-based textures. The SVG plugin allows you to deliver arbitrarily high texture resolution without paying the usual penalties of disk-space and I/O. We've also completely overhauled our texture-conversion subsystem, txmake, and can now convert ultra-high resolution textures on multi-core CPUs very efficiently.

We've generalized support for multi-segment motion blur by removing the venerable 6-sample limit and by adding support for multi-segment camera blurs. We've introduced a new shading strategy in which a single shading result can be reused across all motion segments.

Volume support continues to improve in RPS 16. We've extended the RiVolume primitive to support ImplicitField plugins and significantly sped up the ray tracing speed.

In the shading subsystem, we've implemented a just-in-time (JIT) optimizer for .slo files. At load-time, we specialize shader function invocation according to context and retarget code to special SSE-optimized variants in some conditions. On typical scenes we've seen 20% speedups due to this optimization. We've also added a new pattern generation RSL function, knoise, a variation of the Gabor Noise presented Siggraph 2009. Finally, RPS 16 introduces the beginnings of a new stdrsl library of shader functions that we intend to grow over time. Distinct from our previous hodgepodge of RSL source examples and toy shaders, the stdrsl shader library is intended to be a true resource for your production shaders. Our first release includes support for SphericalHarmonics.h and AreaSamplers.h.

Details of the release are enumerated below.


Ray Tracing and Re-rendering

  • Raytrace Hider

    A new raytrace hider has been implemented, allowing users to bypass the REYES front-end and trace primary rays directly, for both re-rendering and final frame renders.

    The PRMan distribution includes a new RiFilter, RifRayTraceHider.so/dll, which can be used to render scenes via the raytrace hider, e.g., like so:

    prman -rif RifRayTraceHider.so in.rib
    prman -rif RifRayTraceHider.so -rifargs -mode adaptive -minsamples 5 -variance 0.01 -rifend in.rib
    
  • Multiresolution Radiosity Cache

    There is a new radiosity cache that provides substantial speedups for indirect illumination computed by indirectdiffuse() and gather(), as well as shader-evaluated transmission in occlusion() and transmission(). Storing diffuse color values and/or opacities in this new cache can provide speedups as much as 40x. The cache is on by default, but can be turned off by setting Option "limits" "int radiositycachememory" (or in the rendermn.ini by setting /prman/raytrace/radiositycachememory) to 0. The default cache size is 100MB.

    Additionally, this new feature provides significant speedups for multi-bounce global illumination. Please consult the Global Illumination application note for additional information.

    A new performance warning has been added to signal radiosity cache thrashing. The threshold value that triggers the warning can be controlled via a rendermn.ini setting:

    /prman/statistics/radioevictwarnratio
    
  • New Integrators for Physically Plausible Lighting

    There are two new integrator functions in RSL - directlighting() and indirectspecular() - and a new application note, Physically Plausible Shading in RSL to motivate them.

  • New RSL Pipeline Methods

    The lighting method has now been further atomized into diffuselighting and specularlighting methods. Using these optional methods will maximize the benefits of the new Multiresolution Radiosity Cache.

  • New Sample-Generating Functions

    There are four new sample-generating functions in RSL - generateSampleAS(), evaluateSamplesAS(), generateSamplesEnv(), evaluateSamplesEnv() - that make writing physically plausible shaders that interoperate with the new integrators easy as PI.

  • New Physically Plausible Shaders

    There are several new reference shaders built atop the new integrators, pipeline methods, and sample generation functions.These can be found in $RMANTREE/lib/rsl/shaders/stdrsl.

  • New areashadow() RSL function

    • PRMan now supports both ray-traced shadows as well as traceable deep shadow maps, via the areashadow() function.
    • Traceable deep shadowmaps can be produced with a new deep method, areashadow. The opacity threshold attribute can be used to control the number of layers present in the file. Traceable deep shadows provide fast, high quality soft shadowing with numerous benefits over traditional deep shadows and ray-traced shadows.
    • There is a new Area Shadowing application note, for more information.
  • New Re-rendering Features

    There are a number of improvements to PRMan's re-rendering technology:

    • Ray Tracing Renderer: we've introduced a ray-traced re-rendering mode. The choice between the re-renderers is governed by new parameters of RiEditWorldBegin(): "string rerenderer" "raytrace|reyes". Each re-renderer has its strengths, and careful consideration is due when choosing.
    • Shader instance edits: both re-renderers now support shader edits.
    • Camera edits: the ray tracing re-renderer now supports camera edits.
    • Edit API modifications: we've simplified the interface for editing shader instances, RenderMan Attributes and shader bindings and RenderMan Options.
    • Limitations lifted: support for RiBlobby implicit surfaces has been added, Imager and Visible Point shaders are executed during re-rendering, and support for editing co-shaders has been expanded.
    • New examples: Python-based examples are provided in our distribution in the directory: $RMANTREE/lib/examples/rerender.
  • New Ray Accelerator

    Once again, ray tracing has been sped up, and memory consumption when ray tracing has been reduced. transmission() rays, in particular, should be faster, especially when shaders are executed to determine the opacity at shadow ray hit points.

  • New Ray Type Control

    There is a new parameter for gather(), indirectdiffuse(), occlusion(), and trace(): "string type". Valid values are "specular", "diffuse", and "transmission". This new parameter allows explicitly setting the ray type. If the type isn't specified, there is a default type for each function. The default types are:

Function Default Type
gather() "specular"
indirectdiffuse() "diffuse"
occlusion() "diffuse"
trace() "specular"
  • New Shading Modes

    A new shading hitmode has been added that allows the specification of a 3D texture file (point cloud or brick map) as a source for color and opacity at ray-hit points. This can greatly accelerate multibounce diffuse and transmission shading by eliminating the per-hit shading overhead.

    Attribute "shade" "string diffusehitmode" "cache"
    Attribute "shade" "string diffusehitcache" "file:/path/to/texture3d"
    Attribute "shade" "string transmissionhitmode" "cache"
    Attribute "shade" "string transmissionhitcache" "file:/path/to/texture3d"
    

    The occlusion, indirectdiffuse, transmission, and areashadow RSL functions accept the "hitmode" and "filename" parameters, and these always take precedence over the Ri attribute.

    Additionally, users can specify the diffusehit channels via:

    Attribute "shade" "string diffusehitcolorchannel" [""]
    Attribute "shade" "string diffusehitopacitychannel" [""]
    
  • More Efficient Traced Displacements

    There is a new attribute value:

    Attribute "trace" "int displacements" [2]
    

    As before, 0 means don't displace anything for ray tracing and 1 means displace everything (that's displaced) when ray tracing. The new value, 2, tells the renderer to only displace the finest resolution.

  • Geometry Decimation Controls

    There is a new option that offers control over the tessellation of ray-traced surfaces that can be used to provide significant speedups:

    Option "trace" "float decimationrate"
    

    Useful values are 1, 2, 4, 16. 1 signifies no decimation; the other values increase the simplification over the highest-fidelity (Reyes) tessellation.

    This gives speed-ups in these places:

    1. The intersection tests themselves are faster since fewer quads/tris need to be hit tested.
    2. The number of lookups in the fine tessellation cache is reduced.
    3. Overall tessellation cache traffic is reduced.
    4. For "decimationrate" 2 and 4, the max size of each entry in the fine tessellation cache is smaller, so the same cache memory can hold more cache entries. Under certain circumstances, the fine tessellation cache can be avoided entirely.
    5. For "decimationrate" 16 and higher, there is no need for the fine and medium tessellation caches, so that memory is used instead to increase the capacity of the coarse tessellation cache.

    The speedup can be up to 25% in scenes where raw ray tracing speed dominates (e.g. ambient occlusion).

  • New Importance Sampling Application Note

    A new application note, The Importance of Importance, has been added, outlining shader techniques for optimizing ray tracing.

  • Tessellation optimizations have resulted in faster ray tracing of displaced surfaces.

  • The number of hemisphere rays shot by the ray-traced occlusion() and indirectdiffuse() functions from a given single point is no longer clamped to 10,000. That said, 10,000 is a very big number, so PRMan will now warn you if you exceed that very big number.

  • Ray tracing of LOD geometry has been improved. Prior to this change, PRMan used the screen-size-based Reyes LOD for ray tracing. Now PRMan uses ray differentials to choose a coarser LOD for ray tracing when appropriate.


New Point-Based Rendering Features

  • Spherical Harmonic Visiblity: ptfilter can now compute a spherical harmonic (SH) representation of the directional visibility or incident radiance at each point.

    ptfilter -filter occlusion -shbands N ...
    

    or:

    ptfilter -filter [volume]colorbleeding -shbands N ...
    

    The default for -shbands is 0 which means that no computation is done. The resulting point cloud contains an array of floats called "_dirvisshcoeffs". There are N^2 elements in the array. There is a new Application Note, Image-Based Relighting, that delves deeper into the usage of this new feature.

  • New ptfilter filter: simplify

    The new ptfilter filter, simplify, takes four parameters: maxdist, mindot, maxdiff, and rasterspace. It reads one or more point cloud files, and iteratively merges points that are closer than maxdist and have normals that point more than mindot in the same direction. The default value for maxdist is 1e15. With this huge default value for maxdist, all points with similar normals will be merged, so it is imperative that a value that is more appropriate for the scene is specified. The default value for mindot is 0.5. The parameter maxdiff tells ptfilter not to merge points if their data differ by more than the specified amount; the default is 1e15. Note that maxdiff does not apply to data channels with names containing "area" or "Area". The last parameter is rasterorient 0|1, which tells ptfilter to measure maxdist in pixel units rather than world space coordinates (the default, 0, is off).

  • getpoints()

    PRMan 16 introduces a new function, getpoints(), that reads point data from a point cloud, frame cache, or grid cache, and returns the number of points found.

  • ptfilter -photonmap is now multithreaded.

  • ptfilter's -maxsolidangle and the subsurface() function's maxsolidangle default value has been changed from 1.0 to 0.1, matching the default value in occlusion() and indirectdiffuse(). This means that the computations will be slower (but also more accurate) by default.

  • Multithreaded load balancing has been improved for ptfilter when used for subsurface scattering, occlusion, colorbleeding, and volume colorbleeding.

  • Point-based color bleeding and occlusion calculations have been sped up by 10-20%.


Motion Blur Enhancements

  • There are no longer restrictions on the number of segments for world multi-segment motion blur.

  • Camera multi-segment motion blur (i.e: multi-segment motion blur specified before WorldBegin) is now supported.

  • For multi-segment motion blur, users can now choose to shade once per motion segment or once per frame, via a new attribute:

    Attribute "shade" "string frequency" ["frame"|"motionsegment"]
    
  • Ray tracing of multi-segment motion blur is much more accurate.

  • Motion-blurred objects that are moving extremely quickly through the camera are now faster and more memory efficient to render.

  • Motion blocks specifying transform blur that do not include shutter boundaries now work correctly.

  • The specification of dPdtime-based motion blur for RiVolume has changed.


New Deep Compositing Features

  • Deep AOVs: we've extended our deep texture file format to support the deep compositing applications. The more general format now supports multiple subimages, each of which can contain AOV data. A stereo, deep compositing application RIB files would output deep color and alpha data with RIB like this:

    DisplayChannel "rightCi" ...
    DisplayChannel "righta" ...
    Display "scene.dtex" "deepshad" "rgba"
    Display "+scene.dtex" "deepshad" "rightCi,righta"
    

    Deep texture files created in this fashion can also be used as holdout mattes for 2D compositing via a new RiOption, Hider "hidden" "string mattefile", and can now be used to perform depth masking via the depthmask hider. Note that the depthmask hider only treats deep texture files at pixel resolution and will therefore not have subpixel accuracy, meaning a higher depthbias value may be required to avoid artifacts.

  • C++ Deep Texture API: we've deprecated the C-binding of the dtex API in favor of a new C++ binding to the same functionality. The new library delivers a cleaner set of controls and queries and provides access to new subimage and multichannel support.

    • The RixDeepTextureMerge.cpp example demonstrates how to combine two or more deep texture files into a new file.
    • The new DeepPixel::Composite method flattens a deep pixel into the final rgba form.
    • The new DeepPixel::Merge method combines pixels to perform a correct depth composite.
  • There is a new Deep Compositing Application Note that provides a closer look at these features.


New Procedural Texture Plugin

We now support texture synthesis plugins to deliver arbitrary texel data to our texture cache subsystem. Plugins respond to renderer requests to fill texel buffers that are delivered in an automatically antialiased form to consumers of plugin via the texture RSL function. Arguments to the plugin are encoded in the filename argument using standard web URI syntax to support a combination of standard and plugin-specific parameters.

  • New RtxPlugin API: describes the new Rtx API and provides example plugins.
  • SVG Texture Support: RPS 16 ships with a full-features SVG renderer plugin based on the web-standard rsvg open-source libraries. This plugin accepts the name of an .svg file and can deliver ultra-high resolution renderings with minimal I/O and diskspace requirements.

New stdrsl Library

We now provide RSL code intended for inclusion by your production shaders. The stdrsl shader library is a collection of supported RSL code that leverages the expressiveness of RSL structs and centralizes the computation of various standard computations. The RSL source can be found below $RMANTREE/lib/rsl/include/stdrsl. The shader compiler is aware of this special location and so clients should refer to stdrsl components as follows:

#include <stdrsl/SphericalHarmonics.h>

New librix

A new library has been developed that exposes a subset of our standard APIs to a broader range of users. The intention is to facilitate the use of our standard file formats by pipeline tools other than our own. A version of librix will be loosely coupled with an RPS release in the usual sense: features present in a new release of RPS will only be available via the associated librix. Tools linked against older versions of librix should be forward-compatible with future RenderMan versions but with limited access to new features. We've also packaged librix as a separately downloadable library and plan to license certain of these libraries under very liberal terms.

C++ Binding for RIB Generator

A dependency-free library to write RenderMan-standard RIB files based on a simple C++ extension to the venerable C-binding.

DeepTexture API

A new C++ binding to read, write, and modify deep texture files. Deep compositing applications should be able to build solutions atop this library.

Subdiv API

An implementation of Pixar's subdivision surface technology. This API allows you to subdivide geometric meshes in a way that is 100 percent compatible with PRMan's implemention. It can be used to integrate Ptex workflows into paint packages, and for other special effects.

Additional Enhancements and Changes

Rendering

  • World-Space Dicing: there is a new dicing strategy that tries to deliver micropolygons whose size is independent of camera projection and measured in worldspace units. This has applications in bake passes where camera-based strategies may cause insufficient shading frequency for far-away objects. This strategy does not guarantee that all micropolygons will meet the criterion; although micropolygons will never be larger, in cases of overmodeling, micropolygons may be smaller than the world distance requested.

    Attribute "dice" "string strategy" "worlddistance"
    
  • New SubdivisionMesh Mask: we now support "bilinear" as a mask argument to SubdivisionMesh. The bilinear scheme simply renders high level 4-sided faces to bilinear patches, and subdivides all n-sided faces to n blps. Like other SubdivisionMeshes it supports all hierarchical edits, is guaranteed to be watertight, can be used with the Rix Subdivision API, and can be used in conjunction with PTex.

  • Rif Improvements

    We now support specification of Rif chains within RIB files. A new structure comment, rifcontrol, allows you to append and delete portions of the current Rif chain. In addition, new C-entrypoints have been exposed to allow plugins to modify the current Rif chain.

  • The point cloud file format has been bumped to 2. This new file format makes texture3d() lookups in large organized point cloud files faster (as much as 5-10 times faster).

  • RiSides, RiDetailRange, RiOrientation, and RiReverseOrientation are now supported inside ObjectBegin/End.

  • RiSubdivisionMesh now validates its primvar inputs and, much like RiCurves, will not accept the primitive if the primvar counts are wrong.

  • ImplicitField DSOs are now supported by RiVolume.

  • RiPoints can now set falloff as a varying or constant float falloffpower primvar, instead of using the "float pointfalloffpower" hider option. Pursuant to this, the "float pointfalloffpower" hider option is now deprecated.

  • New methods have been added to the subdivision surface API which allow for queries to be returned efficiently in the appropriate transform space. Also, in this release, the header file "RixSubdEval.h" is now a required include file (in addition to "RixInterfaces.h").

  • There are two new attributes for RiCurves:

    • Attribute "dice" "int preservecv" [1] can be used to guarantee that a curve's CVs are fully represented in the grid. The default value is 0, or "off".
    • Attribute "dice" "int roundcurve" [1] ensures that curves without user-provided normals better mimic tubes.
  • There is a new option to RiCamera, extremeoffset, which disables certain multi-camera rendering optimizations that may lead to bucket artifacts when the separation between cameras is large.

RenderMan Shading Language

  • Kernel Noise: there is a new RSL function, knoise(), that calculates noise similar to Gabor Noise (Siggraph 2009), with many of the same properties. knoise() is filtered and gives the user control over the frequency window, number of octaves, and amount and direction of anisotropy.

  • sincos(): there is a new RSL function, sincos(), that calculates the standard trigonometric functions sine and cosine.

  • shaderinfo(): there is a new RSL function, shaderinfo(), that queries the current shader pipeline stage.

  • textureinfo() Improvements:

    • textureinfo("type", ...) will now return "brickmap" or "pointcloud" if that is the type of the (3D) texture file.

    • textureinfo() can now get information from point clouds.

    • textureinfo("shcoeffs", ...) will retrieve optional spherical harmonic coefficients from an environment map.

    • There are three new supported queries:

      "fileformat" - returns a string with the values: "pixar", "openexr", "tiff", or "deepshadow".

      "islatlong" - returns an int with 1 if the texture is a latlong texture.

      "iscubeface" - returns an int with 1 if the texture is a cubeface texture.

  • The occlusion() and indirectdiffuse() functions can now output a float array of spherical harmonic coefficients of the directional visibility as an output variable. The number of coefficients is the square of the number of bands, embodied in the new parameter "shbands". The "clamp" parameter must be on (1). If "maxvariation" is higher than 0, the coefficients can be interpolated between shading points. Note that this is (currently) for point-based occlusion and indirectdiffuse calculations only.

  • There are two new parameters to the subsurface() function: "scatter" and "absorption". They are an alternative to "albedo" and "diffusemeanfreepath".

  • Struct methods can now be invoked on non-writable structs, provided they don't write to the struct. For example:

    struct bar {
            float foo;
            public void getfoo() { return foo; }
    };
    

    used to fail when calling getfoo() if the struct it was invoked on was not writable. We now correctly infer the constness of each method.

  • There are three additional new parameters for gather():

    • "weights" is an array of color weights, one for each ray in the array of rays that can be passed in via the "distribution" parameter. Assigning different importance weights to each ray can be useful for importance sampling. Note that "weight" is synonymous in this case.
    • "rayconeangle" (an array of floats) can be used to explicitly set the ray spread. Note that "rayconeangles" is synonymous.
    • "float importancethreshold" can be used to override the "trace" "importancethreshold" attribute.
  • Class-based shaders can now write to dPdTime. The third argument to displacement may (optionally) be dPdTime.

  • The random numbers for hemisphere sampling are now "more" random. This change will likely result in image differences compared with pre-16 renders involving ray-traced indirectdiffuse() or occlusion().

  • There is a new attribute() query - "geometry:frontfacing" - which enables improved querying of backfacing normal behavior on double-shaded geometry.

Statistics

  • Statistics Improvements: PRMan now provides more statistics. Additionally, there is a new application note, Extensible Stats Diagnostics, which provides helpful tools and tips for parsing PRMan's stats.

  • Users can now specify the maximum number of reported displacement bounds problems, via an option or an ini setting:

    /prman/statistics/maxdispwarnings 100
    

    or:

    Option "statistics" "int maxdispwarnings" [0]
    

    A value of zero turns off the check and reports all displacement problems.

  • Timers for statistics are now more accurate on Win64 and Linux kernels that support nanosecond timers.

  • There is a new "Ray traced procedural memory" stat. This number reflects the memory tracked by the renderer as it attempts to obey the proceduralmemory limit specified by the user.

  • Statistics for ray tracing memory have been improved.

  • Memory tracking for statistics is improved.

  • Light cache hits and misses are now included with the shading statistics.

Utilities

  • txmake Improvements
    • txmake can be instructed to compute the spherical harmonic representation of the environment map. The new option, -shbands, causes the SH encoding to be included into the resulting texture file. These values can be queried by shaders using the RSL function textureinfo.
    • txmake has been rewritten from the ground up to support more optimal mipmap generation. We can now convert extremely high resolution textures in reasonable memory footprints.
  • sho: There is a new version of sho, based on IceMan. sho is now able to send 32-bit float images to dspy (using the -native option), and it can open deep shadow files. Channel selection is improved and is based on channel number.
  • dsview Improvements: The deep shadow viewing utility, dsview, now supports pan and zoom. Use + and = to zoom in, - to zoom out, drag with middle mouse button to pan, and 1 to resets zoom and pan. The a/z keys step through subimages and files.
  • ptviewer now supports coloring by any element of float or color array channels. float[3] channels can also be displayed as an rgb color.
  • ptfilter -organize 0 can now be used to unorganize point clouds. It reads one or more input files (which may be organized) and writes out an unorganized point cloud.
  • There are two new command line options for netrender:
    • -d dispType specifies a display type (e.g. it, x11, etc.).
    • -crop xmin xmax ymin ymax defines a crop window, overriding the CropWindow specified via RIB.
  • The txinfo utility now prints the spherical harmonic coefficients if they are present in an environment map texture.

Miscellaneous Speedups

  • SIMD Optimizations: PRMan now analyzes shaders and rewrites them on the fly, retargeting code to use SSE on the CPU and specializing shadeops after analyzing the shader, resulting in shading execution speedups of up to 20%.
  • transmission() has been refactored, showing performance gains of up to 20%.
  • Computation of color bleeding and occlusion has been sped up, whether using ptfilter, indirectdiffuse(), or occlusion().
  • Multithreaded point-based calculations have been optimized.
  • There is a new, faster lookup routine for latlong environment maps used in the miss case for occlusion calls, resulting in a 50% speedup for occlusion with environment map-heavy renders.
  • ptexture() is faster, particularly in terms of threading performance.
  • Performance has improved for filtering with filter regions.

Other

  • There is a new PNG display driver. It accepts 8-bit A, RGB, and RGBA displays.
  • Point clouds and brick maps can now contain array data types.
  • We now make sure that a ray hit point lies inside the micropolygon, and clamp the computed u,vs to lie inside the 0,1 range.
  • There is a new rendermn.ini setting to control the default connection protocol chosen by netrender client when attempting to connect to a server. This new ini setting defaults to "tractor" protocol; any string other than "tractor" will revert to the old nrmserver/alfserver connection set-up protocol. The environment variable NRM_TRACTOR continues to work, and overrides the ini setting, if present in the client user's environment. The command-line switch -T, introduced in 15, will override the both, if present.
  • The default value for /prman/constantmemorylimit setting in rendermn.ini, introduced in RPS 15, is now 1, meaning that the memory limit is constant regardless of the number of threads being used, resulting in less memory used by the cache for the same RIB settings.
  • PRMan now utilizes OpenEXR 1.7, which includes support for "multi-view" images in .exr files.
  • The default size for the ray tracing tessellation cache (a.k.a. GUT cache) has been increased from 60MB to 200MB.
  • The Ptex libraries have been updated, providing bug fixes and performance improvements.
  • Support for half floats has been added to deep textures. Use "string type" ["half"] on the display line in RIB, and pass DTEX_TYPE_HALF to dtexAddImage() to generate them.

Bug Fixes

  • The RxOption, RxAttribute, RxTextureInfo, and RxRendererInfo now consistently return a resultcount of 1 for scalar queries. NOTE: This might result in changes in plugin behavior.
  • The value of s/t on RiBlobbies is now computed, correctly, as P.x/P.y in object space, which matches the default parameterization of polygons and volumes.
  • Fixed a bug in the computation of gather() ray differentials at shading points where the gather main direction is close to (0,0,-1) and the coneangle is > 0. This bug could cause artifacts when using an environment call in a gather loop.
  • ptexture() now accepts "catmull-rom" and "b-spline" as texture settings, as well as "catmullrom" and "bspline".
  • EditBegin now behaves properly within IfBegin/End blocks.
  • MakeBrickmap throws a warning, rather than an error, if the input file is not found
  • Fixed a bug with OpenEXR environment maps where longitude was off by 180 degrees when determining importances.
  • Fixed a bug that caused incorrect results for point-based occlusion, color bleeding, or volume color bleeding, when passing a uniform P or N.
  • "pointfalloff" is now applied to color or transparency AOV channels.
  • Fixed a bug in volume renders that could inadvertently set the color to black.
  • Fixed a bug that could cause incorrect shading interpolation on long curves with many knots.
  • Fixed a bug caused by dPdtime not being transformed to object space before being applied to an object space bounding box.
  • Fixed a bug that could lead to incorrect point clouds being generated when using refinement() on doubleshaded surfaces.
  • Struct constructors can now use inherited member initializers.
  • Fixed a bug that prevented struct definitions from being properly reset when using the Slo API.
  • Fixed a long-standing bug that could lead to artifacts when using asymmetric PixelSamples in conjunction with Depth of Field.
  • Fixed a bug that could lead to variable (resizeable) length arrays being initialized improperly.
  • The lens aperture parameter in the stochastic hider now produces properly-oriented results.
  • A ray tracing issue that could prevent geometry from being unloaded properly has been fixed.
  • An issue with displacement bounds that could lead to slower volume rendering has been addressed.
  • Fixed an RiVolume transmission() bug that could cause artifacts.
  • Addressed a (Windows-only) bug that prevented > 4GB output for point clouds.
  • A bug in gather() that could cause artifacts when ray tracing against partially transparent objects has been fixed.
  • Fixed a bug that could lead to artifacts when using large blurs with filter regions.
  • Fixed a bug with computing filter regions on uniform values that could occasionally cause corrupted values.
  • Addressed a bug in filter regions that could lead to NaNs when calculated for degenerate geometry with orientation invariant dicing.
  • Addressed a ray tracing precision issue that could lead to incorrectly missed hits and subsequently to missing mesh faces.
  • Addressed a longstanding issue that prevented RiParaboloid from motion blurring properly.
  • Addressed timer errors on 64-bit Windows.
  • Fixed a Windows-only bug that prevented the use of absolute file pathnames in the style C:\file\pathname.
  • Several bugs in object instancing have been addressed.
  • Various memory leaks have been plugged.
  • The ray tracing versions of the indirectdiffuse() and occlusion() shadeops now work correctly with volumes.
  • The use of Option "shutter" "int clampmotion" [0] and Shutter 0 0 no longer results in dropped geometry.
  • Alpha channels derived from arbitrary opacity AOVs now correctly respect RiMatte.
  • The handling of string arguments passed via -dspyargs to ptrender has been fixed.
  • The VolumeField variable of the volume primitive is now automatically cached when baking for re-rendering.
  • Fixed a bug that prevented RxTextureInfo from returning the correct code when using the "exists" query.
  • The shader compiler now properly accounts for result detail and pre-promotion argument list detail when resolving overloaded function instances.
  • RxOption and RxAttribute now properly check user options/attributes for arrays and set resultcount accordingly.
  • The T43050 warning message can now be found and displayed.
  • A Windows-only bug that could cause slpp to crash when compiling a shader has been addressed.
  • Fixed a bug that could result in incorrect alpha for Matte 1 objects when using the subpixel hider.
  • A bug in bake3d() that could cause NaNs and/or crash when using point-based indirectdiffuse() (et cetera) on geometry with detailed displacement and motion blur has been fixed.
  • Fixed a bug that caused incorrect deep shadow map output when opacity is modified by visible point shading.
  • Fixed a memory leak that could result from passing a nonexistent file to indirectdiffuse().

Changes in 16.1

New Features

  • Re-rendering now supports co-shader instance editing.
  • Re-rendering now supports invalidating and reloading shaders.
  • There is a new "weight" parameter for indirectdiffuse(). "weight", a varying color, is multiplied on the (automatically computed) importance of diffuse hemisphere and sphere rays.
  • areashadow() supports two new parameters: "mapbias" and "mapbias2". "mapbias" is used as an equivalent to the ray-traced areashadow() parameter "bias" when not tracing rays. "mapbias2" can be used to help control the case where a ray could skip through geometry (due to aliasing between the ray and the map) seen obliquely from the shadow map camera by widening the z-range, which makes this less likely to happen, at the expense of potentially making partial shadows darker.

Performance Enhancements

  • The performance of areashadow() has been improved.
  • Threaded performance has been improved in cases where the renderer is emitting many exception messages.

Miscellaneous Changes and Bug Fixes

  • The Deep Texture Rix interface is now available through libprman as well as librix.
  • Motion blur when using the radiosity cache has been improved.
  • Several issues with camera motion blur, particularly relating to multi-segment motion blur, have been resolved.
  • Addressed issues with ray tracing Loop subdivision surfaces when using the radiosity cache.
  • Improved accuracy when ray tracing polygons.
  • Fixed a bug that could inadvertently conflate coshaders that were identical in all respects except handles. Similar shaders might incorrectly appear to be null.
  • Warning/error messages given by indirectdiffuse() and occlusion() related to spherical harmonics computation have been improved.
  • Ray tracing (particularly transmission()) stats have been improved.
  • Improved the accuracy of the shaded results stored in the medium-resolution radiosity cache.
  • Fixed a bug in gather(): asking for "surface:Ci" would prevent any additional primitive variables from being returned in the same query.
  • Addressed an issue that prevented clean installs of Renderman.app from properly functioning (OS X only).
  • Addressed several issues related to transforms involving "framecamera" space.
  • Derivatives of vertex entities on ray-traced NURBS are now calculated correctly.
  • Fixed a bug in (u,v) computation at ray hits on NURBS surfaces with coarse and medium tessellation rates.
  • A bug in areashadow() that prevented mixing ray-traced shadows and area shadow maps has been fixed.
  • Addressed an issue with specifying a deep shadow cache size larger than 4 GB.
  • Fixed a bug that caused ray-traced spheres to interpolate varying/vertex primvars incorrectly.
  • Addressed an issue with the motion bounding boxes for non-moving, displaced geometry.
  • Fixed a bug in the distribution of rays for sphere (not hemisphere) sampling: the distribution was not uniform - more rays were shot in directions near the poles (plus and minus z directions) than near the equator.
  • Fixed a bug in area shadow maps that could occur with very dense fur and/or hundreds of layers of opaque surfaces.
  • Fixed a ray tracing LOD selection bug.
  • GeometricApproximation motionfactor and focusfactor now correctly respect the dicing camera if enabled.
  • Fixed a bug in dicing of moving implicits with a dicing camera enabled.
  • Fixed a bug preventing gather from utilizing an array of weights that was larger than the maximum number of samples; excess weight values are now simply ignored.
  • Fixed a bug that could potentially cause gather() to use incorrect coneangle values.
  • Fixed a bug that could cause the renderer to ignore any user-applied "bias" setting when a ray origin was moved due to decimationrate.
  • A Ptex filtering bug wherein a mipmap level on non-quad faces could be skipped, incorrectly, has been addressed.
  • Addressed superfluous (duplicate) point cloud warnings.
  • The MakeBrickMap omitgeometry default value was 1 (on); now it is 0 (off) similar to brickmake's default and in accordance with the documentation.
  • The refinement method will now be run from shader objects bound in either the Surface or Displacement slot. If refinement methods are defined for both objects, the Displacement's refinement method is run first, followed by the Surface's refinement method.
  • Fixed a radiosity cache shading bug that could lead to incorrectly shaded curves.
  • Attribute "trace" "int samplemotion" [1] now works properly with indirectdiffuse().
  • Addressed an issue with degenerate BLPs that could lead to NaNs.
  • Several issues with time sampling during ray tracing have been addressed.
  • Addressed an issue that could cause shader compiler errors when overloading return detail.
  • areashadow() weights now work as expected.
  • A bug that could cause prman to crash when using the Slo API in a rendering context has been fixed.
  • Addressed an issue that could result in a crash or errors when using a filterregion variable declared as a class member (and therefore uniform, by default) with ptexture() (which requires varying variables).
  • An arbitrary limit on the number of parameters on a Display line has been removed.
  • Addressed bugs occurring with primitive variables when rendering an RiVolume which used an implicit field DSO.
  • Fixed a bug that caused normals on ray-traced implicits to be reversed under certain circumstances.
  • Addressed an issue that could cause slowdowns when using shader objects that specify a displacement method in conjunction with a displacement bound of zero.
  • AOVs from vpvolumes now function properly with multi-camera setups.
  • Addressed incorrect results returned in the plausibleConductor shader.
  • Fixed a Windows-only bug in generateSamplesEnv() that could lead to a crash when using plausibleEnvLight.
  • Fixed a bug that prevented the multires display driver from working on Windows for launched prman processes.
  • All display parameters are now sent to every image opened in a LOD hierarchy when using a multires-capable display driver during re-rendering.

Changes in 16.2

New Features

  • There is a new ray-traced implementation of subsurface() that uses the Radiosity Cache to provide faster results. subsurface() takes a new optional parameter, "mode" (which defaults to "pointbased"), that can be set to "raytraced".

  • The indirectspecular() function now supports the importancethreshold parameter.

  • The gather(), indirectspecular(), trace(), and ray-traced environment() functions now terminate low-importance rays (with importance below importancethreshold) using Russian roulette, resulting in fewer rays fired, decreased runtime, and no visual difference in rendered images.

  • The splitting and dicing of off-screen geometric primitives has been improved. There are two new dicing oracles and a new attribute to control the splitting and dicing of gprims outside the viewing frustum:

    Attribute "dice" "string offscreenstrategy" "clamped"
    Attribute "dice" "string offscreenstrategy" "sphericalprojection"
    Attribute "dice" "string offscreenstrategy" "viewfrustumdistance"
    

    The default is viewfrustumdistance.

  • There are three new shading functions - readprimvar(), readaov(), and writeaov() - which can be used to interact with AOVs and primitive variables without requiring the primvars or AOVs to be in the parameter list for a shader.

  • The directLighting() method has a new default variance reduction heuristic, based on multiple importance sampling methods described by Eric Veach. Users can choose between the original heuristic and the new via a new "heuristic" parameter that accepts either "veachpower2" or "pdfpower2" as a value. For more information, please consult the Physically Plausible Shading in RSL application note.

  • Deep texture files used for holdout mattes can now be alpha only, by specifying the mode "a" in the Display line.

Miscellaneous Changes

  • The refinement() method no longer leads to suboptimal split situations and generally has much improved behavior.
  • The performance of ray-traced RiVolumes when using the radiosity cache has been improved, particularly for volumes that are mostly empty space.
  • Memory usage when baking point clouds has been significantly reduced (by as much as 100X per point cloud).
  • The interaction of deep holdout mattes with volumes has been improved.
  • We now support a Linux-only memory limit option.
  • There is a new statistic for radiosity cache memory.
  • The frequency of calls to the ImplicitField BoxMotion method made by the RiBlobby primitive has been reduced.
  • The memory consumption by the subdiv API's RixSubdivisionFace::EvaluateOnLimit() call has been reduced for extraordinary faces.
  • OpenEXR compression has been changed from zip to zips; this improves -recover capabilities and improves compatibility.
  • The raytrace hider now respects setting jitter 0 when in fixed sampling mode.

Bug Fixes

  • Fixed a rerendering bug that could result in a crash if you issue an instance edit for a shader without providing an __instanceid.
  • Re-rendering now runs construct() on shaders on every edit, matching the semantics of off-line rendering.
  • An issue with wrongly backface-culled RiCurves and Option "limits" "gridmemory" has been fixed.
  • A bug that could cause bucket-aligned artifacts on stereo blobby volumes has been addressed.
  • The shader compiler no longer complains when matching non-output to output polymorphic function signatures.
  • RtxPlugins now warp correctly when used as texture maps inside evaluate/generateSamplesEnv().
  • Fixed a crash that could occur when using evaluate/generateSamplesEnv().
  • Fixed a motion blur error that could occur if a motion block ended slightly ahead of the shutter.
  • Fixed an issue with evaluate/generateSamplesEnv() that could occur when textures with more than three channels were used.
  • We no longer emit thousands of T10004 errors if the texture is not mipmapped.
  • Eliminated a crash that could occur when requesting one channel from an svg texture.
  • Reduced ray tracing memory usage on some scenes where procedural unloading is enabled.
  • Fixed a bug in the spherical harmonics Euler angle decomposition: genRot2zyzRot() in stdrsl/SphericalHarmonics.h.
  • The correct index of refraction from point clouds or brick maps is now used in photon scattering.
  • Fixed a bug in multibounce volume colorbleeding: for volume points, the conversion from irradiance to radiosity must multiply by Cs * extinction. Users should note that this may change rendered images significantly.
  • Camera multisegment motion blur and object multisegment motion blur with a moving camera now behave as expected.
  • Fixed a bug that could cause subtle differences between AOVs and main color (Ci) on volumes when Attribute "volume" "string depthinterpolation" is set to "smooth".
  • Diffuse rays fired from a surface now correctly interact with volumes.
  • transmission() rays fired through volumes now correctly execute the proper volume shader in all circumstances.
  • Fixed a bug that could cause transmission() to inadvertently reuse the same areashadow map.
  • Fixed a shading bug in transmission() that could result in incorrect opacity when the radiosity cache is disabled.
  • Fixed several issues with indirectdiffuse() and occlusion() when automatically continuing rays through transparent objects (including volumes).
  • Fixed a bug that could cause NaNs when ray tracing NURBS patches with deformation motion blur without enabling samplemotion.
  • Fixed a bug in the ptviewer utility that could lead to a crash.
  • Fixed a bug in the sample manager library (SampleMgr.h) that would cause it to return the incorrect sample count.
  • The shader compiler will now issue a warning when encountering initializers with variable length arrays.
  • Fixed a bug in decimationrate functionality for rays at depth > 1 and in the raytrace hider. The bug would show incorrect or missing ray hits with decimationrate values different than 1, which could sometimes result in slower render times, NaNs, or a crash.
  • generateSamples and evaluateSamples now properly return a uniform float error code.
  • Addressed a grid-combining race condition that could cause the renderer to crash.
  • A bug in areashadow() that could cause shadows to apparently disappear when using orthogonal shadow maps has been fixed.
  • Polymorphic return type detail is now correctly matched for RSLPlugins.
  • The rendermn.ini option - /prman/statistics/emitoncrash - is now spelled correctly. Note that the previously misspelled option is still valid, for backwards compatibility.
  • Fixed a bug that could lead to a crash when setting Option "trace" "float decimationrate" to 3.
  • Fixed a minor bug in the Python statistics scripts.
  • Fixed an issue with memory statistics accuracy.
  • A bug that could cause errors when using "it" as the framebuffer when rendering with the raytrace hider has been fixed.
  • A Windows-only bug that prevented the txinfo utility from working properly has been fixed.
  • Fixed a compression bug that would corrupt shadow maps on very rare occasions.

Changes in 16.3

Miscellaneous Changes

  • The ordering of ray tracing and area shadows have been inverted. Ray tracing is now performed first and area shadows are not computed when rays report back opaque values.
  • The distribution includes new plausible shading examples (in $RMANTREE/lib/examples), including a representation of the directlighting integrator written in RSL.
  • RiCurves supports a new trimrange parameter, a uniform float[2] that specifies a starting and ending v clip value.
  • There is a new optional parameter - Option "dice" "maxhairlength" - that enables finer dicing for hair. When enabled, hairs are split into roughly bucket-sized chunks, which improves the accuracy of their bounds and therefore ray tracing performance and memory-lifetime management. The default - -1 - inherits the optional bucketsize parameter value - min(bucketsizex, bucketSizeY).

Bug Fixes

  • Addressed a bug that could lead to excessive noise when using the plausibleEnvLight, particularly at higher intensities.
  • Fixed a bug that could prevent ray-traced shadows from rendering properly in scenes using LOD or, under certain circumstances, cause scenes rendered with the raytrace hider to (incorrectly) render completely black.
  • Motion blurred geometry declared within ObjectBegin/ObjectEnd is functional again.
  • Fixed a bug that could prevent Rtx Plugins from being properly loaded.
  • Fixed a bug that could case the re-renderer to crash when performing edits on surface shaders with co-shaders.
  • Fixed a bug that could cause crashes in plugins that use the Subdivision Surfaces API on ray-traced meshes.
  • Fixed a bug that could result in a crash when ray-traced subsurface scattering exceeded the size of the radiosity cache.
  • Fixed a bug in ray-traced subsurface scattering that allowed illumination to leak through a blocker.
  • Fixed a bug that prevented crop windows from working during interactive re-rendering.
  • Fixed a bug that could cause unwarranted increases in shader setup and binding time.
  • Fixed a precision bug that could lead to missing ray hits.
  • A ray tracing bias bug in ray-traced subsurface scattering has been fixed. In addition to fixing issues wherein the ray tracing bias was incorrect, this fix also prevents crashes that could occur under certain circumstances.
  • Fixed a ray self-intersection bug when Option "trace" "decimationrate" was set to non-power-of-two values. Before this fix, very large trace bias values were necessary for "decimationrate" 3, 5--7, and 9--15.
  • Fixed incorrect ray hit (u,v) values on some parts of displaced and undisplaced triangles and triangle meshes. These showed up as incorrect colors at the end of diffuse rays when the radiosity cache is used.
  • Fixed a bug in that could result in a crash when calling transmission() within a co-shader when a split procedural resulted in no traceable objects in a scene.
  • Several issues that could arise when reloading shaders during re-rendering have been addressed.
  • The d_socket display driver has been updated to make network nameserver lookups more reliable.

Changes in 16.4

New Features

  • Improved Grid Combining - There are two new features that foster a higher degree of grid combining for shading.

    • There is a new attribute:

      Attribute "shadegroups" "attributecombining" ["strict|permissive"]
      

      which allows the user to relax the rules governing whether or not two grids can be combined and shaded together when a shader uses the attribute() shadeop. The default is "strict". See the Attribute Values section of the Tuning Scenes for Combined Shading application note for more information.

    • There is a new hint to the renderer that a shader does not care about shader space. Adding the parameter:

      uniform float __ignoresShaderSpace = 1
      

      to a shader tells the compiler the shader does not use shader space. Grids from gprims that have identical shader sets but different shader spaces will be allowed to combine into a single group for greater shading efficiency. See the Different Shader Spaces section of the Tuning Scenes for Combined Shading application note for more information.

  • randomstrat() - There is a new randomstrat() function, which can be used to fill in a slice of a samples array with stratified random numbers.

Miscellaneous Changes

  • Deep AOVs can now be generated using arbitrary pixel filters, instead of just a 1x1 box filter. Note that there can be significant time overhead in the generation of these deep AOVs, especially when Option "limits" "deepshadowerror" is set to a low number.
  • Holdout mattes may now use deep texture files generated using arbitrary pixel filters, and the matte behavior is now more correct at the silhouette edges of objects. Note that when a deep holdout matte is specified, there are now some new limitations: resolving time may increase substantially when using large pixel filters, and subpixel imager shaders can no longer be used simultaneously.
  • There is a new "excludesubset" parameter, which can be used by any ray tracing shading function to specify a subset of objects to exclude from ray tracing calculations.
  • There have been several improvements to the ray-traced version of the subsurface() shadeop:
    • subsurface() now accepts a "maxdist" parameter, if provided.
    • subsurface() can now take a "label" parameter, a la gather() et al.
  • areashadow() now accepts a "maxdist" parameter.
  • There is a new photon mapping shadingmodel: Attribute "photon" "string shadingmodel" ["refractive:ior=..."], which allows users to set the index of refraction to any number greater than or equal to 1.
  • The sho utility supports a new option - -urlscheme - which causes sho to automatically strip the URL protocol scheme prefix before opening the named file.
  • The shader compiler now allows array element assignments via a fetchvar operation (->) from one shader to another.
  • Removed the limitation on the maximum number (128) of photon maps allowed in a render.
  • Ray derivatives in the raytrace hider have been improved.
  • The allocation of radiosity cache and tessellation cache data has been improved. Previously all of the memory for these caches was allocated on first use, causing potentially large memory footprints in the face of light actual cache usage. Memory for these caches is now allocated lazily, decreasing memory footprint for renders that use the caches sparingly.

Bug Fixes

  • A crash caused when rendering RiBlobby in conjunction with highly detailed implicit field DSOs has been fixed.
  • A bug that could cause incorrect images when rendering volumes whose object-to-world transform has a negative determinant has been fixed.
  • Vertex values computed by a implicit field DSO used in conjunction with RiVolume are no longer wrongly multiplied by the field function value.
  • dPdtime values computed by a implicit field DSO used in conjunction with RiVolume now behave correctly when used in conjunction with a moving transform blur.
  • Motion blocks that include the time value of zero now behave correctly.
  • An issue with incorrect bounding of objects with multisegment motion blur, frame shading frequency, and displacement has been fixed.
  • Fixed a bug in areashadow() that could lead to incorrect normal and bias directions.
  • Addressed an issue in the implicit cone plugin that could lead to NaNs.
  • Fixed a bug that could lead to incorrect subsurface scattering results when using "followtopology".
  • The re-renderer now properly uses instanceIds when they are provided during a rebinding edit of a light, addressing a bug in which light instance edits could fail when re-rendering.
  • Passing an incorrect path to bake3d() via the filename parameter no longer causes the renderer to crash. Needless to say, it still won't find the file.
  • Addressed memory leaks that could occur when reading organized point clouds.
  • Fixed a bug that could lead to a crash when using ray-traced subsurface() with the maximum ray depth set to 1.
  • Fixed a bug that could lead to NaNs when using shadow().
  • A bug that could lead to the renderer crashing when an empty array of maps is passed to areashadow() has been fixed.
  • A bug in the provided stdrsl surface shaders that resulted in incorrect displacements has been fixed.
  • Fixed a bug that could lead to extremely slow environment map lookups when using ray-traced occlusion() or indirectdiffuse() with "coneangle" 0.
  • Addressed a bug in -recover mode that could result in artifacts when using multiple displays and multiple cameras.
  • textureinfo() now returns the correct number of array elements when obtaining color spherical harmonic coefficients.
  • Fixed a bug in ptfilter that overwrote the envdir z component with invalid values when using color bleeding, computing spherical harmonics while using a positions file.
  • Fixed a bug that could lead to a crash after trace group memberships were removed.
  • Fixed resizing of varying-length array result variables by texture3d().
  • Fixed texture3d() to no longer silently ignore type mismatches between file data and result variables.
  • Fixed a (rare) bug wherein the ray differentials of rays from a grid with most/many points having their run flags "off" could be 0, erroneously.
  • The ray type is now properly taken into account when examining the hitmode attributes on objects.
  • Fixed a bug wherein multi-threaded, multi-host renders via netrender could erroneously deem themselves "finished" before all buckets had been delivered.
  • Fixed a bug in the Python binding that prevented hierarchical subdivision surfaces from working properly.
  • Fixed a bug wherein a co-shaders begin method might leave some points uninitialized within a varying conditional.
  • Addressed an issue wherein remapped imager shaders would not display correctly.
  • Fixed a bug that could result in incorrect primvar values (e.g. s and t) on motion-blurred general polygons and polyhedra if a motion sample time value did not match a shutter boundary time.

Changes in 16.5

New Features

  • PRMan now supports scale-adaptive deep file compression. This can be enabled with a new Option:

    Option "limits" "float deepshadowdeptherror" [1.0]
    

    This is a multiplier on the diagonal length of a projected texel facing the map camera. Setting it to zero (the default) disables the new filtering and adjusting it up or down relative to 1.0 makes it more or less agressive, respectively.

  • The ray-traced areashadow() function now supports the "hitsides" parameter.

  • ptfilter subsurface scattering now supports the command- line argument "fromfile" with -scattering and -absorption.

Miscellaneous Changes

  • areashadow() and gather() can now accept pdf and premultpdf as parameters to control the angular spread of the ray, which is used to select tesselation levels for ray tracing. If pdf is passed it will be multiplied, internally, by the number of non-zero pdf values per grid point. premultpdf, however, is assumed to not require that multiplication.
  • gather() supports a new optional parameter - importancecull - which can be used to control what happens to rays that fall below the importance threshold. Current options are cutoff and roulette. With cutoff, the pre-16.2 behavior is used, where any low-importance rays are not fired. With roulette, the Russian roulette introduced in 16.2 is used to determine whether or not a low-importance ray will fire. The default value is roulette.
  • Ray-traced subsurface() now supports an optional weight parameter, which can be used to manipulate the importance of subsurface rays.
  • The stdrsl library ($RMANTREE/lib/rsl/shaders/) now includes a plausibleVolume shader.
  • The consumption of memory by procedurals that introduce small numbers of user attributes or RIB symbols into the scene has been significantly reduced. Additionally, stats reporting for procedural memory has been improved.
  • The proceduralmemory limit can now be set in the rendermn.ini file.
  • calculatenormal() now returns the normal N if one is provided in the RiPoints/brickmap file, and -I otherwise. In previous releases it always returned -I for RiPoints and "brickmap" RiGeometry.
  • Passing an empty string to the areashadow() subset parameter - subset "" - is now interpreted as meaning "all subsets".
  • The interpretation of dPdtime on deformation-blurred RiVolumes has been reverted to the PRMan 15.0 behavior. The dPdtime values are now always interpreted as the vector between the current motion sample position and the next motion sample position, regardless of the actual time values of those motion samples. In other words, it is no longer relative to the current shutter time, restoring the behavior that changing the shutter time without changing the RiVolume's enclosing motion block will change the length of the motion blur. Several other issues with this functionality have also been addressed.
  • shaderinfo() can now take a new keyword - "lightingintent" - to request information on which of the lighting methods the shading system wishes to invoke.
  • PRMan now supports attribute queries of dice:referencecamera.
  • The maximum continuations allowed for a ray has been reduced from 500 to 200.
  • The OpenGL hider is no longer supported.

Bug Fixes

  • An error in the computation of ray cone angles has been fixed. This change may result in variations in tessellation rates, tessellation cache levels, and, consequently, ray tracing speed, as well as improved texture filter sizes at ray hit points, when compared with previous versions.
  • Fixed a transmission() bug that could cause incorrect opacity data, leading to NaN artifacts when tracing through mixed media (surfaces and volumes).
  • A bug that prevented the "type" parameter to gather() from behaving properly has been fixed.
  • Fixed a bug that prevented RiVolume from respecting dicing cameras.
  • Fixed a bug with ray-traced volumes that could lead to undersampling if the ray differential is zero.
  • Fixed a bug that prevented Imager shaders from working with multiple AOVs on multiple cameras.
  • Fixed a bug in ray-traced subsurface scattering with multisegment motion blur that could cause incorrectly computed self-intersections, resulting in artifacts.
  • A bug in ray-traced subsurface scattering that could result in black artifacts in reflections or when using the raytrace hider has been fixed.
  • Fixed a bug that could result incorrect motion blur results when using the raytrace hider.
  • Orthographic projections in the raytrace hider now work correctly.
  • Further improvements to the raytrace hider derivatives have been made.
  • Several issues with OpenEXR textures have been addressed:
    • OpenEXR texture reads are now thread-safe.
    • Channel map lookups are no longer off by 1.
    • Users are now able ton intermix "channelName" and index number lookups.
  • Addressed a bug wherein filtered texture() or environment() lookups into rip-map OpenEXR files would sometimes return invalid results, causing artifacts in the final image.
  • A bug when using the "autocrop" feature of the OpenEXR display driver that could cause a corrupted image when supplying the crop window with upper-left coordinates other than (0,0) has been fixed.
  • Fixed a threading bug and a channel name lookup bug when using texture() with OpenEXR textures.
  • Addressed a Windows-only bug in the creation of OpenEXR texture files that contain spherical harmonics in the header.
  • A bug that could cause potentially incorrect weighting and slowdowns for auxiliary displays with deep output has been fixed.
  • Fixed a bug that could cause RxTransform to return incorrect object-to-world matrices for moving cameras with a non-zero shutter offset.
  • Addressed a bug that could cause a crash when using frame frequency shading in conjunction with motion blocks that don't match shutter.
  • Several issues with interpolated motion samples (involving RiVolume and frame frequency motion blur) have been addressed.
  • A bug in hemisphere sampling (via indirectdiffuse() or occlusion()) when using "samplebase" that could cause incorrect results has been fixed.
  • Fixed a bug that could cause a crash when point-based volume indirectdiffuse() is passed either a dirvisshcoeffs array or an incradshcoeffs array, but not both.
  • Fixed a bug in texture3d() variable type checking that could potentially lead to a crash.
  • A bug that could corrupt a struct if non-array "shader" type struct members were the only ones accessed in pipeline stages up to and including opacity() has been fixed.
  • Ray hits on geometry with hitmode "primitive" are no longer shaded if they are hit by a batch of rays that also hits other geometry with hitmode "shader".
  • Fixed a bug that could cause incorrect vertex normals and widths on Bezier cubic curves.
  • A bug that could lead to an infinite loop when running the "refinement" method has been fixed.
  • shaderinfo now properly returns a valid shading pipeline stage when called from begin(), prelighting(), or postlighting().
  • A bug that could result in initialization/shadeop errors when inspecting a shader with the Slo API.
  • Fixed a bug that could cause invalid shadeops and/or arguments to shadeops to corrupt memory.
  • Fixed a bug that prevented struct1 != struct2 from working with nested structs when the children structures are equal and the parent structures are a mixture of equal and not equal.
  • Fixed a bug that could occur when editing a co-shader network tightly bound to a surface shader.
  • Addressed an issue with co-shaders being passed as handles that could lead to inconsistent co-shader state between shading stages when multiple RiShader definitions are used with the same handle.
  • Fixed incorrect reads of matrix user attributes when using the attribute() call in RSL.
  • The behavior of normals on curves when using "roundcurve" dicing has been improved. Previously, the normals were always oriented perpendicular to the spine of the curve. Now, when a curve has a changing width, the normals are oriented according to the surface defined by that changing width.
  • Addressed a bug in the Python binding wherein a second argument passed to the RiArchiveRecord() call would be incorrectly interpreted, resulting in potential problems.
  • Fixed a bounding box bug when using Level of Detail (LOD) with ray tracing that could result in the wrong LOD being chosen.
  • Fixed a bug that could cause some programs using the dtex or RixDeeptexture APIs to generate invalid area shadow maps.
  • Fixed a bug that could cause a crash or incorrect results from randomstrat() when shading a grid larger than 4096 points.
  • Fixed a bug that could lead to artifacts in ray-traced area shadows on brick map geometry.
  • A bug that could lead to a crash or artifacts when passing arrays to certain parameters of areashadow() has been fixed.
  • Fixed a bug in areashadow() that could cause potential corruption of ray time values if shaders were run at areashadow ray hits.
  • Empty area shadow maps no longer cause an erroneous error message.
  • Fixed a bug that could cause memory corruption or a crash when using an RtxPlugin in a multithreaded render.
  • Fixed a bug causing multithreaded renders that encountered a fatal error to potentially crash on shutdown.
  • A ptfilter bug that could result in a crash when using -threads 0 has been fixed. Specifying 0 threads now issues a warning and causes ptfilter to use 1 thread (the default).
  • A bug involving ImplicitField DSOs that returned a constant but non-zero interval in Range has been fixed.
  • Fixed a bug that could lead to a crash when speficying brick cache sizes larger than 2GB.
  • Addressed a bug that could lead to crashes on machines with certain NVIDIA drivers when running ptxmake multithreaded.
  • Fixed a bug that could lead to erroneous reports of renders being more than complete (i.e. the percent-complete would report as more than 100%, which is just silly).
  • Fixed a bug in txinfo that could lead to a crash.
  • Fixed a bug in the matte photon shading model that could result in photons being scattered on the wrong side of a surface.
  • A bug that could lead to re-initialization of a struct at the point of an extern declaration has been fixed.

Changes in 16.6

  • Fixed a grid combining bug wherein the comparison of shader tags in structs had the inverted logic and would reject grids for combining erroneously.

Known Issues

  • Using the raytrace hider with netrender currently only works with "bucket" screenorder and non-progressive rendering.
  • Calling getshader(), getshaders(), getlight(), or getlights() during construct may result in unexpected behavior or sub-optimal performance.
  • The evaluateSamplesEnv and generateSamplesEnv can only read latlong environment maps.

Deprecated

  • The "vpvolumes" shading strategy has been deprecated, as visible point shaders now have first-class entrypoints, RiVPSurface, RiVPInterior, and RiVPAtmosphere, that do not require setting any other attribute state.
  • The "specularthreshold" option has been deprecated. When appearing in legacy RIB files, the option is ignored.

Addenda

  • There is a new version of the Pixar License Server, License Server 8.0. This new license server is not required, but does provide Network Address Translation support for sites that may need it.
  • The Alfserver executable is no longer included with the RPS distribution, pursuant to the implementation of Tractor. Users are encouraged to migrate to the new distribution service, but may also avail themselves of Alfserver via the separate Alfred bundle, or may continue to use the version of Alfserver distributed with RPS 15.1.