RenderMan 12 Release Notes

PhotoRealistic RenderMan 12.0

Release Notes

Introduction

These release notes describe significant changes and enhancements to RenderMan® Pro Server for the 12.0 release over the 11.5 release.

Eyesplits Eliminated

The renderer no longer requires eyesplits options or attributes. Users will no longer experience warnings about eyesplits, long delays before rendering starts, or excessive splits that waste memory. The options and attributes are silently parsed, but will be deprecated in future releases.

3D Baking

The renderer now has support for 3D texture maps. Arbitrary 3D data can be written to a sparse volumetric file (a "pointcloud") with the new bake3d shadeop. These pointcloud files can be inspected using ptviewer, filtered using the new utility ptfilter, and converted into a 2D image file using ptrender. In order to facilitate efficient rendering of large sets of baked data, the renderer now supports a new MIP map representation called “brick maps” that are suitable for efficient filtering and caching. A brick map is created from a point cloud file using a new utility brickmake. Brick maps can be inspected with brickviewer and high-level info about the contents of a brick map can be found with brickinfo. Arbitrary 3D data in brick map format can then be read in with the new texture3d shadeop. More information can be found in the Application Note Baking 3D Textures: Point Clouds and Brick Maps.

Interior and Exterior Shaders

Interior and Exterior shaders are now supported for ray tracing. For example, smoke described by an Interior shader can be evaluated by refraction rays sent inside an object from its Surface shader. Calls to trace() now automatically select the appropriate volume shader to run, if one is attached to the object; the surface normal is compared to the ray direction to pick whether the ray is traveling through the object's interior or exterior domain. Shaders using gather can get the automatic behavior by fetching "volume:Ci" or they can explicitly specify "interior:Ci" or "exterior:Ci" if they have a better idea of whether they are shooting a refraction or reflection ray.

Post-Visibility Atmosphere and Interior Shading

The renderer now supports optional Atmosphere and Interior volume shading of “camera” samples, after visibility processing is complete. This is an alternative to the traditional per-primitive Atmosphere shading and the new ray traced volume support. This new mode allows Atmosphere and Interior shaders to correctly take motion blur and depth of field sampling into account, without requiring ray tracing. More details can be found in the shading strategy section of the user manual.

Reduction of Ray Tracing Bias

Biasing issues for ray tracing have been greatly reduced. In other words, the trace bias attribute can now be reduced by a factor of 10-100 times before self-intersection becomes an issue again.

Automatic Continuation Rays

Trace and gather rays now automatically continue through partially transparent objects (Oi < 1.0), accumulating color and opacity along the way, just like typical camera samples. Previously this effect required cooperation from the shaders on the hit surfaces. Shaders which implement refraction and diffusion effects should ensure that Oi=1.0 and then cast their own refraction rays, as before. More information can be found in the introductory ray tracing Application Note.

Shader Message Passing Extensions

gather() can now send arbitrary local variables with each ray, to be used as parameters in shaders on the hit surfaces. These overrides for existing parameters are far more general than the existing "label" mechanism, and the receiving shader need not use rayinfo() or be otherwise "ray-aware" to use them.  The RSL Features section of the manual has more details.

Similarly, surface and volume shaders calling illuminance() can now send parameter overrides to lightsource shaders directly. Illuminance() can now also “fetch” back auxilliary values computed inside lightsource shaders as well. These extensions, which share the gather() messaging syntax, complement the existing lightsource and surface message passing functions:   the new "forward" send requires no special knowledge in the lightsource, and variables other than predefined "output" parameters can be fetched.

Loop Subdivision Surfaces

PRMan now supports Loop subdivision meshes. The Loop subdivision scheme is defined for triangles, and results in meshes that are more memory and speed efficient, and have fewer artifacts than the Catmull-Clark scheme when dealing with meshes made primarily of triangles. Loop subdivision meshes are created by passing the RI_LOOP ("loop") as the scheme parameter to the RiSubdivisionMesh call, and support all standard tags defined in the specification, as well as the stitching and improved facevarying extensions.

Improved Catmull-Clark Subdivision Surfaces

Catmull-Clark subdivision surfaces now have much lower peak physical and stack memory requirements. This is particularly true for dense meshes that take up large amounts of screen real estate, as well as ray traced meshes. Also, various constraints on subdivision mesh topology have been removed, making it easier to convert arbitrary polygon meshes into subdivision surfaces. In particular, a mesh no longer needs to be a single connected surface — multiple disjoint pieces will still be rendered individually. Also, singular vertices (vertices shared by faces which belong to disconnected meshes) will be automatically split. However, all edges must still be manifold (incident to at most two faces).

Memory Efficient Polygon Meshes

Polyhedra (i.e. the PointsPolygons and PointsGeneralPolygons calls) are now much more efficient to render.

Improved Triangles

PRMan now has much better support for triangles (whether they come from polygons or the new Loop subdivision surfaces). In prior releases, PRMan rendered triangles at the same speed as a rectangle twice its size (or to put it another way, triangles rendered at half the speed of rectangles). This is now no longer the case. Also, pinhole artifacts that sometimes occurred between triangles are now no longer present.

Arbitrary Output Variables
  • The subpixel hider now supports AOVs.
  • Multiple AOVs can now be combined and written to a single file by using the new RiDisplayChannel call.
  • Support for entire arrays as AOV output has been added, allowing the following Display syntax:
    Display "+foo.tif" "tiff" "varying color[4] foo"
    	  
OpenEXR support

PRMan now supports rendering to OpenEXR images using the new "openexr" display driver. In addition, support has been added to txmake for creating texture files from OpenEXR source images.

Varying Length Arrays

Support for varying length arrays has been added to the shading language. Formal parameter lists to shaders and function arguments now support an array of indeterminate length, indicated by empty braces:

surface mattearr( float Ka=1, Kd=1; float testarr[] = {}; )

The array length and values will be initialized in RIB by the shader instance or from the geometry. To query the length of these arrays a new shadeop arraylength has been added. Also, arrays can now be assigned to each other, or compared for inequality.

Improved Midpoint Depthfilter

The midpoint depthfilter has been made more useful by the addition of a new visibility mode:

Attribute "visibility" "midpoint" [1]

Objects which have midpoint visibility but no camera visibility are considered visible when midpoint depthfilter is active, and take part in the two surface hider computation, but only as the second surface. Such objects can be considered “shadow receivers” but will not be “shadow casters”.

Dicing Camera

PRMan now supports the concept of an alternate camera for dicing and multiple strategies when performing dicing. These are chosen via two new parameters of Attribute "dice": "strategy" and "referencecamera".

Plug-in Ri Filters

A new class of RenderMan plug-in, Ri filters support filtering of read-archives, inline archives, and procedural primitives. Ri filters are compatible with librx, including the -catrib flag. More information can be found in the Application Note Plug-in Ri Filters.

Netrender Environment Configuration

Netrender requests are now routed through Alfserver's site-customizable AlfEnvConfig procedure in alfserver.ini. This handler script allows renderfarm servers to select different installed versions of PRMan, and make environment variable and setuid changes, on a per-request basis. The keyword specified with netrender -R keyword is now treated just like Alfred's built-in RemoteCmd -envkey keyword, which means that a consistent set of environment and setuid rules can be applied to all processes launched by Alfserver. Any existing (deprecated) Alfserver -rmap mappings are still applied, followed by AlfEnvConfig handling.

Miscellaneous Changes and Bug Fixes
  • The shader compiler is now smarter about the generation of uniform temporary variables when making function calls. This can result in better speed and performance for complicated shaders.
  • When given a multichannel image, sho will now display the first three channels, if possible. Also, it now accepts the new argument "-choffset X", which indicates the first channel to begin displaying.
  • txmake now supports the conversion of TIFF files with more than four channels.
  • The textureinfo shadeop now supports the "projectionmatrixinverse" and "viewingmatrixinverse" queries.
  • The illuminance shadeop now supports limited boolean operations on light category operations.
  • The gather() parameter 'samples' was incorrectly specified as uniform in the prior version of the 3.3-draft RenderMan spec. This parameter may be varying or uniform.
  • Netrender now supports a new "-F" mode which forces server-side reading of RIB files and other assets. This option can dramatically improve netrender times for huge RIB files, especially in many-way parallel renders. This option requires files to be visible on the server locally or via network paths. Note that the preexisting "-f" option, which causes texture and shader assets to be preferentially found on the server, still exists but does not address server-side RIB file access.
  • Netrender now also supports the prman "-woff" option for filtering out unwanted warnings and error messages.
  • Directory mapping now works correctly with netrender.
  • Alfserver shutdown and restart behaviors have been improved.
  • Incorrect tangents were sometimes computed at semisharp creases on subdivision surfaces, this has been corrected.
  • The behaviour of facevarying interpolation on subdivision surfaces has been improved at geometric boundaries and semisharp creases. In addition the behavior of facevarying corners has been made consistent with standard subdivision rules.
  • New zmin and zmax pixel filters for arbitrary output displays have been added.
  • Handling of strings passed in as parameters on geometry has been improved for 64 bit builds.
  • The shader compiler correctly handles the character sequence "\\" appearing within strings.
  • DtexOpenFile() (part of the Deep Texture API) now requires a mode parameter.
  • The memory requirements of micropolygon caching have been greatly reduced.
  • An issue with RiBasis and inline archives has been addressed.
  • Visible point list memory is now much better managed over the life span of a render.
  • The shading variables u, v, du, dv, dPdu, and dPdv computed during raytracing of subdivision surfaces are now scaled correctly to reflect parametric ranges. This should result in better filtering.
  • Many statistics related to grids, raytracing, and memory usage have been improved and made more accurate.
  • Issues related to raytraced displacement when using complicated displacement shaders have been resolved.
  • The shader compiler has improved type checking when misusing strings or matrices on operators or certain built in functions.
  • The shader compiler now issues better warnings about function parameter mismatches, as well as performance warnings about mismatched detail in extern statements.
  • A deadlock situation occuring in some multi-processor renderings has been resolved.
  • The textureinfo shadeop now correctly supports "type" and "resolution" callbacks for deep shadows. It also supports a new "pixelaspectratio" lookup to return the aspect ratio of the original source texture image.
  • Improvements have been made to the speed of raytraced blobby surfaces.
  • Issues seen with occlusion computed on objects which undergo multisegment motion blur have been addressed.
  • The predefined surface shader variables I (the incident ray direction) and Ng will now always be recomputed relative to the displaced P if displacement shading has occurred. This behaviour was introduced in prior releases, but was inconsistently applied.
  • Speed issues encountered when creating deep shadow maps during netrender or multi-processor renderings have been removed.
  • Option "trace" "maxdepth" [0] now disables all raytracing regardless of any other setting.
  • Attribute "visibility" "camera" is now a string and supports richer settings to control the handling of opacity. For backwards compatibility, "int camera" is still supported.
  • The transmission() shadeop now supports adaptive sampling, and is much better behaved when used in conjunction with motion blur.
  • A "texture" display driver has been added.
  • RxAttribute() and RxOption() lookups which deal with strings now have consistent memory allocation behavior as documented.
  • occlusion() and indirectdiffuse() now behave properly when nsamples is 0. Also, the behaviour of occlusion() is now to consistently return 0 if no rays are fired (i.e. due to maxdepth constraints).
  • All geometric primitives now support non raster oriented dicing.
  • The 4d version of pnoise() now works correctly.