RenderMan 12.5 Release Notes

PhotoRealistic RenderMan 12.5

Release Notes

Introduction

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


Accelerated Ray Tracing

Ray tracing calculations have been dramatically accelerated, up to a factor of three. These speed-ups will be most apparent when computing effects that are ray-tracing intensive, like ambient occlusion and ray traced shadows. Ray tracing memory requirements have also been noticeably reduced. There are no changes to the shading language, so these gains do not require rewriting or even recompiling your shaders.   

Hierarchical Subdivision Surfaces

PRMan 12.5 extends subdivision surfaces to support hierarchical editing, which allows for exact control over components of the subdivision mesh at finer levels of subdivision. More information can be found in the Hierarchical Subdivision Surfaces Application Note.

Point Cloud API

An API to read and write point cloud files has been added. More information can be found in the Baking 3D テクスチャs Application Note.

Visibility and シェーディング Attribute Simplification

The visibility attributes have been simplified and new attributes have been added to control the behavior of surface shading at ray tracing hit points.

Attribute "visibility" "int specular" [0|1]
Attribute "visibility" "int diffuse" [0|1]
Attribute "visibility" "int transmission" [0|1]
Attribute "visibility" "int camera" [0|1]

These attributes now simply control the visibility of the object to a certain ray type. "Specular" rays are those rays that have an angle less than the value specified by the "specularthreshold" option, and are shot by functions like trace() and gather(). "Diffuse" rays are those that are shot by functions like gather(), occlusion() and indirectdiffuse() and have an angle greater than the "specularthreshold". "Transmission" rays are those shot by the transmission() call. "カメラ" visibility governs the visibility of the objects in the scene to REYES (independent of ray tracing).

Attribute "shade" "string specularhitmode" ["primitive"|"shader"]
Attribute "shade" "string diffusehitmode" ["primitive"|"shader"]
Attribute "shade" "string transmissionhitmode" ["primitive"|"shader"]
Attribute "shade" "string camerahitmode" ["primitive"|"shader"]

These new attributes control whether or not a shader is run at the hit point of a ray of the given type. The "primitive" hit mode for specular, diffuse, and transmission rays means that the shader is not run at the given hit point. Instead, the カラー and Opacity attributes defined on the object are returned. The "shader" hit mode executes the surface shader of the hit object to determine the color and opacity to assign to the hit point. "camerahitmode" is unique, in that it is used to give a hint to the REYES shading system as to whether or not the shader must be run to determine the opacity of a given object. If it is set to "primitive" the shading system will obtain the opacity from the Opacity attribute, which can improve the efficiency of determining whether the object is occluded by other objects in the scene or not. "shader" mode causes the shading system to run the shader to determine the opacity of the object.

NOTE: These "visibility" and "shade" attributes must have inline type declarations, since the old "visibility" attributes are still supported for backwards compatibility and the inline declaration is what distinguishes the new attributes from the old.

Saved Attribute States

The RiResource call, in conjunction with the new RiResourceBegin and RiResourceEnd calls, now allows for the graphics attribute state to be saved and restored at any time in the RIB stream. Saved attribute states can also be used with the new hierarchical subdivision surface functionality. PRMan currently implements the "shading", "transform", and "all" subsets.

Miscellaneous Changes and Bug Fixes
ジオメトリ
  • Facevarying values are computed correctly for many-sided polyhedra faces.
  • Incorrect bucket clipping behavior seen on very large RiPoints has been fixed.
  • Level of detail is now calculated with respect to the frame camera (instead of the world camera) if the frame camera is specified as the reference camera for computing dicing rates.
  • Primitive variables of type hpoint once again are interpolated correctly for subdivision surfaces.
  • ObjectInstanced curves no longer crash.
  • The handling of knot vectors with illegal multiplicity of knots has been improved.
  • For most geometric primitive types, the level of detail calculation is no longer affected by the speed of geometry. In previous releases, fast moving primitives would (wrongly) cause the detail used to be higher.
  • The dicing of loop subdivs has been improved, which in turn improves the quality of derivative calculations.
  • Problems with ObjectInstanced polyhedra (particularly in support of facevarying data) have been addressed.
  • An issue where 1D hair had their normals sometimes reversed when a negative scale appeared in the camera transform has been addressed.
Ray Tracing
  • Ray tracing of geometry that undergoes large motion blur has been accelerated greatly.
  • Bias issues on ray-traced, nonplanar polyhedra faces have been reduced.
  • A slowdown introduced in scenes with large undisplaced polygons has been removed.
  • rayinfo() now sets the "origin" and "direction" values for the two extra ray hit shading points.
  • gather() "ray:xxxxx" queries for the properties of a particular sample, such as "ray:direction", did not always report values when the ray was culled for some reason, such as depth or importance thresholds. The gather "miss" block will execute in these cases, and now these queries are filled in with correct values that would have been used if the culling had not occurred.
  • The string "samplepattern" is now recognized by gather() as a special category string (gather's first argument). This string causes gather() to generate correctly stratified and distributed rays within the sample cone described by the subsequent arguments, but gather itself will not actually shoot any rays. Instead, the gather() "else" block is executed once per sample, after filling in any requests for "ray:direction", which can be useful for shaders that want to do other types of direction-based lookups but don't want to generate their own sample distributions.
  • Random number generation used to create ray sampling patterns has been slightly modified to improve bucket-parallel rendering. This may produce slightly different images for the same inputs compared to previous releases, due to the differences in sampling patterns.
  • A new Attribute "trace" "int atmospheres" [0|1] has been added, which is similar in spirit to "trace" "displacements". A strict interpretation of the RenderMan specification demands that any Atmosphere shader attached to a surface should be ignored by rays that hit the surface. Instead, if the shooting surface has an Interior or Exterior shader bound, then that volume shader is used to modify the Ci, Oi found at the ray hit. This new attribute allows the hit surface Atmosphere to be used as a fallback if neither Interior nor Exterior are defined on the shooting surface (mode 1). Thus a wall which appears foggy to the camera will also appear foggy in a mirror without having to attach the fog to the mirror as an Exterior. The old behavior, mode 0, is the default.
  • calculatenormal() now works correctly during ray tracing when called on points other than P.
  • Level of detail was sometimes incorrectly calculated for occlusion() rays. This has now been fixed.
テクスチャ Maps
  • The renderer now has much better speed and memory behavior when dealing with renders that access tens of thousands of texture maps.
  • The generation of deep shadow maps now respects dirmapping.
  • DtexGetPixelZRange was missing from the deep texture API. It has been added.
  • BGR targa files are supported better in txmake and sho.
  • The texture subsystem now properly allows for TIFF textures larger than 64k x 32k pixels.
  • The generation of deep shadow maps is no longer affected by setting the depthfilter to midpoint.
  • The shadow map driver will now correctly write out TIFF textures less than 16 by 16 pixels in size.
  • An issue with the four vector version of the environment() shadeop when used inside a conditional has been addressed.
Point Clouds and Brick Maps
  • Compression of brick maps has been improved — new brick maps will typically be 20-40% smaller, and reductions of up to three times have been seen. Also, the brick map format number has changed from 2 to 4.
  • Brickmaking using multiple input point cloud files now works correctly; previously, only a fraction of the points were inserted.
  • The renderer now avoids baking duplicate data when parallel rendering (-p:2 or netrender).
  • A trailing comma in bake3d()'s displaychannels parameter no longer counts as a channel.
  • bake3d() no longer tries to interpolate at ray hit points (even if "interpolate" has been set).
  • bake3d() no longer crashes if the number of points in a shading grid is much larger than the default 289.
  • bake3d() now correctly deals with C:/ absolute style paths.
  • texture3d() can read point cloud files directly (however, we still recommend using brick map files for complex scenes).
  • texture3d() no longer will ignore large blurs when "adaptivefilter" is on.
  • ptfilter now allows varying albedo and diffuse mean free path length in the subsurface scattering diffusion approximation. The albedos and diffuse mean free path lengths must be baked into the input point cloud file along with the surface illumination.
  • Subsurface scattering diffusion simulation with ptfilter now requires that micropolygon areas are baked along with the illumination. See Application Note 37 "Translucency and subsurface scattering".
  • The radius value baked out with each point in a point cloud now corresponds to the longest micropolygon diagonal length at the shading point.
  • ptviewer has a new optional command-line argument: -cropbbox.
  • Icf files can be rendered in parallel again.
  • ptrender now supports a new command-line argument -dspyargs, allowing arbitrary parameters to be passed to the display driver.
  • ptrender camera projection mode (-project camera) now works as expected - points are projected to the image plane of the camera from which the point clouds were rendered. -splat zsplat has also been fixed and is a recommended mode for camera projections.
  • There is no longer a limit on the number of brickmaps that can be accessed during the lifetime of a render.
  • A new setting /prman/brickmap/maxfiles controls the number of opened file descriptors reserved for use by the brickmap subsystem. Any accesses over this maximum will cause file descriptor recycling to occur.
  • The memory requirements for brickmake have been reduced, allowing for the conversion of larger pointcloud files.
  • texture3d now correctly warns about incorrect variable access from a brickmap.
  • The performance of brickmap reading has been improved dramatically.
  • The coordsystem parameter of bake3d and texture3d can now take the value of "shader".
  • Issues related to the use of Rxテクスチャ3d from a DSO, or when used in conjunction with point clouds, have been addressed.
  • bake3d and texture3d now support the use of the value "_disable" for the "coordsystem" parameter, which disables the transformation from current to world space when writing points to the file. This is useful e.g. when baking (u, v, 0) data to a point cloud in order to avoid the culling of points that may transform to nearly identical positions.
  • Issues preventing the usage of multiframe bakes to multiple files during -p:2 mode renders have been addressed.
  • If the texture3d() lookup normal is (0,0,0), the normals in the brick map are now ignored. This avoids having to go to deep brick map levels to resolve incoherent normals. See the 3D baking app note, section 5.5.
  • The ptfilter ssdiffusion parameter -unitlength now works correctly.
Displays
  • The OpenEXR display driver now supports checkpointing (enabled by prman -recover), and the PXR24 compressor (selected with "compression" "pxr24"). Also, it now writes out correct data windows when crop windows are being used.
  • AOV images no longer show pinprick holes when written from geometry with zero opacity.
  • AOVs can now ignore the Matte directive. Adding "matte" [0] to a Display or DisplayChannel line allows that AOV to entirely ignore Matte, thus forcing the AOV to show up for that object in the final image. (By default, "matte" [1] is in effect — the AOV responds to Matte.)
  • The Targa display driver now correctly handles AOVs without swapping the blue and red channels.
  • The MayaIFF display driver now supports AOVs correctly. Additionally, its support of 16-bit output (and PRMan's support for reading 16-bit MayaIFF files) has been improved.
シェーディング Language
  • The transform() shadeop now allows transforms from built in spaces to ScopedCoordinateSystems.
  • ライトource shader parameters overridden by explicit illuminance "send" directives now correctly inherit the sent variable's detail (uniform vs. varying), rather than failing with warning S70011 due to detail mismatch between the sent variable and the nominal detail of the shader parameter. The explicit forward-message-passing mechanism for the RSL illuminance() function was introduced in release 12.0: illuminance(..., "send:light:lightparam", var). This override of the nominal parameter detail is similar to the way attached primitive variables can override the value and detail of a shader parameter.
  • The area() shadeop now accepts an optional parameter which indicates the metholodogy used to compute the area. area(P, "shading") is equivalent to area(P) when smooth derivatives are enabled (the default). area(P, "dicing") computes the exact geometric area without using smooth derivatives.
  • New attribute and option queries have been added.
  • A new "lightcache" parameter is supported by the illuminance construct, which allows more fine grained light shader cache control (rather than requiring the use of "P=P" prior to calling multiple illuminance statements).
  • gather, illuminate, illuminance, solar no longer have an arbitrary limit on the number of possible arguments.
RIB String "Variables"

Strings in RIB files may now contain "variables" which are expanded when the RIB is parsed by the renderer. These are references to Attributes and Options which are in scope at the time that the string is parsed. For example:
 
    Attribute "user" "string mytexsuffix" ["daytime"]
    ...
    Surface "mood_wall" "string texname" ["mood${user:mytexsuffix}.tex"]
 

The dollar-sign ($) in this example is the indication to the RIB parser that it should look for an expandable name. The following variable styles are allowed:
 

$name
${name}
all attributes, then options, are searched for "name" ("$Frame" is the current frame)
$namespace:name
${namespace:name}
attributes, then options, of the particular type are searched for "name" (e.g. "user:var")
$qualifier:namespace:name
${qualifier:namespace:name}
the Attribute or Option qualifier specifies exactly which name to query (e.g. "Attribute:user:var")

Since the dollar-sign was not previously "reserved" for this use, it is possible that existing RIB files may have have strings containing it which should not be subjected to this kind of expansion. Therefore, this is an optional behavior which must be enabled by specifying the distinguished "name expansion" character in either rendermn.ini or as an Option at the top of a particular RIB file:
    rendermn.ini:     /prman/ribvarsubstchar $
    inline in RIB:     Option "ribparse" "string varsubst" ["$"]

Other
  • An issue that caused catrib to report bad error messages (e.g., P01001 NO MESSAGE: can't open message file) has been fixed.
  • Issues related to combined shading and the vpvolumes shading strategy have been addressed.
  • The vpvolumes shading strategy now correctly takes surface orientation into account when using the normals to determine whether Interior shaders can be applied.
  • The RiClippingPlane, RiContext, and RiGetContest symbols are now properly available to DSOs.
  • RiClippingPlane now functions correctly when using orthographic projections.
  • The zmin and zmax pixel filters now work correctly when the Display they are attached to has "matte" [0] as well. Note that in this scenario, a primary display of "z" will also show "matte" [0] behaviour as well, which is a limitation.
  • Linux builds are now able to better report peak memory usage up to 4 gigabytes. Note that beyond 4 gigabytes, memory statistics may be inaccurate — this is a glibc limitation, not a PRMan limitation.
  • Timing statistics are now accurately computed per frame on Windows.

 

PRMan 12.5.1 Changes
  • A memory corruption bug that caused unpredictable results when using occlusion() or indirectdiffuse() on 1D curve primitives was addressed.
  • The gather() parameter "maxdist" may now be either uniform or varying.
  • The gather() parameter "othreshold" is now only used to determine when automatic ray continuations should terminate. Its "reciprocal" is no longer used to decide whether a ray has accumulated enough opacity to be considered a hit or a miss; instead, a new gather parameter, "ohitthreshold" now controls this.
  • A bug in the shading language illuminance("send:light") message passing mechanism that would sometimes cause light parameters in unintended lights to be altered was fixed.
  • Several uniform vs. varying tests have been improved in the shading language illuminance() function related to "light:varname" and "send:light:varname".
  • The special "raytrace" texture name parameter to the shading language functions shadow() and environment() is no longer matched for slight spelling variations.
  • Added RiSystem to request execution of arbitrary commands from within the context of the RIB stream. This can be disabled via rendermn.ini:/prman/RiSystem_ok 0
  • A new Option "shutter" "int clampmotion" has been added which modifies the way motion blur is interpolated relative to shutter boundaries.
  • The performance of ray-traced curves has been improved.
  • A new creasemethod tag has been added to hierarchical subdivision surfaces, allowing for Chaikin's curve subdivision algorithm to be used on multiedge creases with different edge weights.
  • Problems with ray-traced hierarchical subdivision surfaces losing attribute edits on faces have been addressed.
  • ptmerge now uses the correct matrix when combining point clouds, allowing the result to be correctly visible in ptviewer or sho.
  • ptviewer correctly displays baked vector or normal data.
  • PRMan's statistics output now displays the amount of time spent in I/O for brick maps.
  • TIFF textures are no longer opened using mmap(). On some platforms, in situations where very large TIFF textures are being used, this can greatly increase the amount of memory available to the renderer.
  • The renderer now has more graceful behavior when confronted with more than 4 coincident surfaces. To avoid a very expensive compositing operation, the renderer now uses a better approximation which works well if the surfaces all have approximately the same opacity.
  • Shadow maps (both the standard and deep types) can now be rendered correctly with CropWindows (the result is treated correctly by the renderer when read back in with shadow()).
  • The renderer no longer crashes when ray tracing a scene containing only a single RiProcedural.
  • txmake now by default preserves the bit depth of the input image when writing out Pixar format textures. (It already did this for TIFF format textures.)
  • Issues related to deep shadow renders with midpoint depthfilters have been addressed. The deep shadow still ignores the midpoint depth filter, but the primary pass should now have correct data.
  • Ray tracing is now better behaved when used with multisegment motion blur. Previously, rays were launched with times outside the current motion blur segment time, which often resulted in spurious hits or misses.
  • dsview now updates the pixel window on click.
  • A new Hider option "int maxvpdepth" has been added, allowing for control over the maximum number of visible points considered for compositing or deep shadow map creation.
  • A new error metric for the occlusion() and indirectdiffuse() functions, "maxvariation", has been added. The error metric determines where the hemisphere must be sampled (which is time-consuming) and where nearby results can be interpolated (which is very fast). This new error metric is better and more intuitive than the old "maxerror" error metric, and should be used instead. See the documentation of occlusion() and indirectdiffuse() in "built-in functions" for more info.
  • A new parameter for occlusion() and indirectdiffuse(), "samplebase", has been added. It specifies the jittering of the hemisphere ray origins (as for gather). The default value is 0 (no jittering). A value of 1 corresponds to jittering over the size of a micropolygon.
  • The indirectdiffuse() and occlusion() functions used to always shoot rays of type 'diffuse'. We now assign their ray types the same way it's done for gather(): the ray type is 'diffuse' if the coneangle is larger than the specularthreshold option, and 'specular' otherwise.
  • The indirectdiffuse() and occlusion() "hitmode" "primitive" used to get the color/opacity from the hit object's カラー/Opacity attributes. Now interpolated values of the vertex variables Cs/Os are used instead (if present), and the attributes are only used if those vertex variables are not present.
  • The extern keyword can now be applied to variable length arrays in the shading language.
  • The limits:othreshold and limits:zthreshold options now return the correct type, color, when queried from the shading language.
  • The size of a macro definition has been bumped to 128K in slpp.
  • Issues with the radii computed by bake3d() when shading 1D hair and points have been addressed.
  • The renderer now supports the use of multiple attribute state subsets when performing a resource restore.
 
PRMan 12.5.2 Changes
  • Hierarchical attribute edits on top level, extraordinary faces of Catmull-Clark subdivision meshes have been fixed. Note that Loop subdivision meshes still have issues with these edits on top level, extraordinary faces; a work-around is to ensure all such faces have been triangulated.
  • Brick map improvements.
    1. A new brick map format that better deals with incoherent normals, data from both sides of a thin surface, and baking on doubleshaded geometry has been implemented, and the brick map format number has changed from 4 to 5. More details can be found in section 5.4 of the Baking 3D テクスチャs application note.
    2. Better filtering during lookups: the brick map filter is no longer constrained to being a cube; the filter size can now differ in the x, y, and z directions. (This corresponds to the rectangular filters used for 2D texture lookups.)
    3. The bricks stored in the brick cache are now more compact; for a given cache size the brick capacity will be higher.
    4. The texture3d() "lerp" parameter has been fixed.
    5. The brick map I/O and cache statistics have been improved.
  • A new optional parameter "hitsides" has been added to the gather(), trace(), transmission(), occlusion() and indirectdiffuse() functions. "hitsides" can be "front", "back", or "both". When "hitsides" is "both" (the default for backwards compatibility), rays can hit both the front and back side of one-sided surfaces. When "hitsides" is "front", there is only a hit if the dot product I.N is negative. When "hitsides" is "back", the dot product I.N must be positive.
  • A new optional parameter, "environmentcolor", for indirectdiffuse() has been added. (The parameter already exists for occlusion().) This parameter makes it possible to mix and manipulate color bleeding and environment illumination independently of each other, either in shaders or in post-production.
  • The OpenEXR display driver no longers writes channel names containing three-digit number sequences. This may affect the ordering of color channels (depending on the API used, they may be sorted alphabetically, which will be in BGR order).
  • A bug introduced in 12.5.1 that caused /prman/hider/mpcachedir settings in rendermn.ini to be ignored has been fixed.
  • The dtexEvalPixel function (part of the deep texture API) no longer returns NaN results on coincident depth samples.
  • Support for Targa and BMP source images has been improved.
  • The ray tracing system's support for interpolated Os on geometry has been fixed.
  • Printing to stderr in a RunProgram procedural on Windows now works as expected.
  • Issues with the DisplayChannel call not correctly parsing inline declarations of filter and filterwidth have been addressed.
  • A problem handling early subprocess termination in -p:2 renders has been addressed. In some situations, this may have resulted in infinite "recvfrom" loops in the master process.
  • A problem involving skipped execution of some lightsource shaders at ray hit points under unusual circumstances has been fixed. The unlit portions of the affected object would sometimes appear to be missing in reflections.
  • Variable substitution in RIB string paramaters is now properly disabled in inactive branches of IfBegin-Else-IfEnd blocks.
  • A ray tracing sample ordering problem that sometimes caused very bright or dark spots scattered across dense meshes has been fixed.
  • A problem parsing trace group membership names has been fixed, it would sometimes cause membership lists to be truncated in binary RIB files.
  • A problem fetching certain user attributes from ray-hit points using gather has been fixed. The problem only affected "attribute:varname" fetches of 3-component values.
  • Objects for which the "vpvolumes" shading strategy attribute is set now exhibit better small-grid combining behavior during regular surface and displacement shading.
  • RiInterior shaders executed on regular camera-visible geometry via the "vpvolumes" shading strategy will now properly be called to execute on sub-intervals within their volume region when non-vpvolume objects are "floating" within it.
  • Attribute look-ups from Interior shaders in vpvolumes mode now always properly return values from the attribute scope of the object to which the shader is attached, which is not always the same object that defines the end of the volume interval to be shaded (P).
  • A linking problem for the point cloud API has been fixed: linking with a dummy drand() function is no longer required.
  • The random number seed for hemisphere sampling has changed, so noise patterns in ambient occlusion and indirect diffuse results will be different. This change was necessary to fix systematic noise that occurred for very high frame numbers. The change also makes hemisphere sampling slightly faster.
  • Fixed incorrect samplebase size on triangular grids. This bug occasionally caused, for example, splotchy ambient occlusion on polygonal models.
  • Baking on implicit surfaces without specifying a radius per baked point caused PRMan to crash; this has been fixed.
  • In rare circumstances, the data baked from a shading grid would not be written to the point cloud file; this has been fixed.