Table of Contents
In its latest incarnation, Pixar's RenderMan delivers new features and enhancements that improve the renderer's performance and versatility in a package designed to provide productions with simpler, more direct access to the renderer's power. While delivering on the bottom line, this release aims to make it easier for you to integrate our tools with yours.
At the core of RenderMan Pro Server 14 are several fundamental changes and new features, each designed to optimize the performance of (and your access to) RenderMan. These features include a simplified SDK for easy linking, a Python binding for simple integration, user-defined structures (structs) in the RenderMan Shading Language, a re-rendering mode for highly accelerated re-shading and editing, an API for reading brick maps, and a new 3D texture format for point clouds that allow users to read data on-demand. In addition, there have been further enhancements to the RenderMan Shading Language, as well as numerous speedups and improvements to performance, scalability, and memory usage.
What follows is an overview of the highlights of Release 14. Please follow the hyperlinks to learn more about the new features.
- The SDK is no longer a separate downloadable package.
- The static library — libprmanSDK.a — has been replaced by a dynamic library — libprman.so/dll/dylib.
- PRMan now loads libprman.so as a dynamic runtime.
- Other programs can load libprman.so as a dynamic runtime.
- A single library is all that is needed for third party stand-alone programs.
- Linkage on Windows platforms is simplified for other programs that might be plugins to Autodesk's Maya.
- Third party applications can, once again, direct link the renderer.
Perhaps most importantly, libprman.so supports new IPC (interprocess communication) features. This allows a client application to launch and control one or more more external prman processes and is the preferred means to connect to prman in re-rendering mode, but it can also be taken advantage of in regular rendering.
Developers should note that, with the introduction of the new SDK, Windows plugins will have to be recompiled against libprman.lib (instead of prman.lib) and all stand-alone programs will have to use OS-specific methods to locate the dynamic library.
- In conjunction with the new Python binding, there is a new Python-based implicit surfaces compiler. Documentation and examples can be found in $RMANTREE/blobby.py.
An organized point cloud consists of data points organized into an octree, and a collection of octree nodes. When texture3d() reads from an organized point cloud, the points and octree nodes are read on demand and cached, thus using much less memory than unorganized point clouds (which are read in their entirety). Additionally, the occlusion(), indirectdiffuse(), and subsurface() functions can read both unorganized and organized point cloud files; for more information on this aspect, see the Using organized point clouds section of the Point-Based Approximate Ambient Occlusion and Color Bleeding application note.
Note that PRMan 14.0 can read older point cloud files, but previous versions cannot read point cloud files generated by PRMan 14.0.
- Shaders can now be passed as shader parameters. That is, we now allow a string (i.e. a shader handle) to be provided as a value for a parameter of type "shader", enabling layer shaders, light shaders, et al., to access co-shaders as parameters, rather than parsing a co-shader list.
- There is a new pre-defined shader object, caller, which provides the shader pointer of the calling shader class. caller can be used to inspect the calling coshader or similar.
- Support for resizable arrays in RSL plugins has been improved, via a new RslResizer class. See What's New in RSL for more information.
- The shading system includes several new diagnostics, which are enabled by a shading debug level option. When enabled, a complete call stack is reported whenever a shading error is encountered. The shading system also detects the use of unitialized shader variables when debugging is enabled. See What's New in RSL f or more information.
- Uniform values are re-initialized to the default, if one is given prior to begin() running (i.e. once per grid). Previously strings could not persist between grids. Provided the shader is recompiled, this means:
- constant string foo = ""; will be initialized to the default value once prior to construct.
- constant string foo; will be initialized to "" prior to construct. User construct is assumed to set the value to something useful.
- uniform string foo = ""; will be reinitialized to "" prior to begin() running, i.e. at the start of shading on each grid.
- uniform string foo; retains the previous value. The default is "".
- Member variables of type shader may be computed in construct() and stored for the lifetime of the shader.
- Varying access in construct is now not legal. Any varying member cannot be accessed during construct().
- The renderer now provides better guarantees about construct frequency. Note that construct is called on shaders accessed during another shader's construct. See the User construct() method section of the Shader Objects and Co-Shaders application note for more information.
- Ordering for begin() has been improved. As with construct(), begin is called on shaders accessed during another shader's begin. See the User begin() method section of the Shader Objects and Co-Shaders application note for more information.
- Shaders passed via the parameter list do not need to be in scope when the shader binds to a gprim. Please see the Shaders as parameters section of the Shader Objects and Co-Shaders application note for more information on what is now supported.
- The caching of shader definitions has been improved, reducing the renderer's memory footprint. The size of the shader definition cache can be controlled using the defcache shading Option.
- String class members are now initialized to the empty string if they're not explicitly initialized, since uninitialized strings can crash the shading system.
- Multi-level break/continue statements now work even when the loop condition is uniform.
- An issue that prevented return statements inside uniform loops from operating correctly has been fixed.
- The RSL printf function now produces uniform output if the inputs are all uniform.
- The compiler now ensures that an array can no longer be assigned to a non-array variable.
- The predefined shaders "this", "surface", and "light" were inadvertently varying, which prevented them from being passed as parameters or copied.
- Fixed a multithreading bug in the built-in RSL getshader() and getlight() functions that could arise when looking up undefined shader handles.
- Fixed a bug that could cause a crash when calling a shader method with the wrong number of arguments.
- Fixed an array iterator bug involving varying resizable arrays.
- Fixed a spurious array length warning for long array parameter values in RIB.
- Fixed a bug involving grid combining and shader definition caching that could potentially cause an inconveniently abrupt cessation of functionality (i.e. a "crash").
- Fixed a bug involving combined shading for shaders with resizable array member variables.
- Fixed the RSL attribute() and option() functions to properly handle arrays of length one and resizable arrays.
- Several issues related to the allocation of space for method parameter defaults have been resolved.
- Output parameters are now initialized properly for optional method call outputs.
- Shaders in shader members now behave as expected.
- Fixed a bug that could cause shading local memory to grow larger than needed in certain cases where the shaders themselves are larger than the shader defcache allows.
- Several bugs relating to access of various types of variable sized arrays during construct have been resolved.
- A bug that prevented uniform integer primitive variables from being bound to equivalent shader float parameters has been fixed.
- Shaders passed via the parameter list can now have primitive variables bound to their parameters, e.g.:
Shader "first" "firstHandle" "varying float firstValuesHere" 0 Shader "second" "secondHandle" "uniform string otherShaderReference" "firstHandle" Polygon "P" [...] "varying float firstValuesHere" [....]
- Resizing an array now initializes the new elements with the default values.
- The renderer's use of an opacity method (if provided) has been optimized, and will no longer be run unnecessarily early in cases without displacement.
- construct() is now fully lazy. That is to say: no coshader will be constructed until either a) such time as getshader(), getshaders(), getlight(), or getlights() is about to return it, or b) we require the construction of a shader, and another is referenced by that shader's parameter list. This should greatly reduce memory consumption in cases where there are many many coshaders available at any given time.
- arraylength() on a variable length array shader parameter now correctly returns 0, rather than -1, when it is not bound in RIB.
- The sloinfo and slo library support shaders with parameters of type shader.
- Method calls in construct() with no return value are no longer considered to be in violation of the no varying access in construct rule.
- Varying arrays may be resized in construct, but the elements of the array are not accessible.
- The surface variable is available and valid during the displacement portion of the shading pipeline.
- The version number of the RiFilter interface has been incremented to 8 with the addition of new Ri interface routines that support re-rendering. As usual, most RiFilter plugins compiled against an older version of the interface will continue to work with the current release, but the converse is not true. There is an exception for any plugins that override callback functions to RiProcedurals; see Deprecated.
- There is a new Ri Control: RicProcessCallbacks.
- RiCamera definitions now behave properly as Options, i.e. they are pushed and popped by FrameBegin and FrameEnd.
- Color AOVs can now composite using a separate opacity AOV by passing in the name of that opacity AOV as the "string opacity" argument to RiDisplayChannel. The shader is required to perform premultiplication in the shader of the color AOV by the opacity AOV, and is also required to output the opacity AOV. The renderer will then composite the color AOV correctly using the value of the opacity AOV, rather than Oi. As an additional benefit, after declaring the color AOV in this fashion, shaders that do not have either the color or the opacity AOV in their output parameter list will now have the natural interpretation of "black, transparent", as opposed to "black, opaque" in previous releases.
- Floating point alpha channels derived from arbitrary opacity AOVs can now be specified by passing the value "alpha" for the "string interpretation" parameter to RiDisplayChannel.
- AOVs that are computed by the sigma hider and use a non-compositing pixel filter (such as average, min, max, zmin, or zmax) are now filtered correctly.
- A bug on certain setups that could lead to a crash when gathering Arbitrary Output Variables (AOVs) through volume shaders has been fixed.
- The functions occlusion(), indirectdiffuse(), and subsurface() can be passed an array of point cloud filenames.
- The function texture3d() can be passed an array of point cloud or brick map filenames.
- The automatically-computed filter size for texture3d() brick map lookups is now wider for brick maps with too few levels (i.e. fewer levels than required for optimal rendering quality — roughly one brick voxel per image pixel). The new automatic filter size gives smoother results for brick maps with few levels.
- Ptfilter has a new filter: crop. This filter crops a point cloud file to a given bounding box, i.e. it only writes the points that are within the bounding box.
- Brick map geometric primitives now "mix" properly with other gprims when using the LOD feature (DetailRange).
- There was a bug in the errorcode returned by texture3d() when a brick map lookup fails; this has been fixed.
- The point-cloud radius values computed automatically by bake3d() are no longer too large near the silhouette of implicit surfaces.
- The accuracy of point-based ambient occlusion near sharp edges has been improved. This eliminates thin white lines caused by missing ambient occlusion along, for example, intersecting planes.
- Fixed incorrect point-based color bleeding (and occlusion when computed along with color bleeding) for cone angles smaller than pi/2 when sortbleeding is off.
- The point-based subsurface(), occlusion(), and indirectdiffuse() functions have new parameters that allow users to specify the name of the point cloud channels that contain area and/or color data. Ptfilter has corresponding new command-line options.
- A bug that could lead to a crash when generating point clouds via multithreaded netrenders (or netrenders to multiple hosts) has been fixed.
- There is a new smoothing feature for subsurface scattering. This is useful if the source point cloud is too sparse relative to the diffuse mean free path length. Without the smoothing, the subsurface scattering results are very sensitive to the distance to the nearest point and can be noisy or aliased. Users can turn on this new feature by using the -smooth 1 option with the ptfilter utility or by passing "smooth" 1 to the new subsurface() function.
- The RiGeometricApproximation procedure can take a new parameter, focusfactor, that adjusts the dicing rate for blur due to RiDepthOfField. If focusfactor is not set, then the motionfactor value, if set, continues to affect the adjustment of dicing rate for both motion blur and depth blur. If focusfactor is set, then the motionfactor value only affects the motion blur adjustment, and focusfactor only affects the depth blur adjustment.
- RiCurves now support vertex storage class and bicubic interpolation for width and N.
- Extraordinary faces on Catmull-Clark subdivision surfaces no longer force binary dicing.
- An issue with clipping of RiCurves with very small parametric range has been fixed.
- Using rational (hpoint) P with polygonal meshes no longer crashes the renderer.
- Inconsistencies in the calculation of P for certain ray-traced, motion-blurred geometry types have been fixed.
- A bug in the RIBBound.so Rif plugin that was preventing it from accurately bounding geometry with transformation blur has been fixed.
- area(P, "dicing") now returns a reasonable result on implicit surfaces. The area is computed from the size of a pixel at the (camera-space) z, modulated by the shadingrate.
- Normals attached to RiPoints are no longer ignored, and can now be used to orient the disks when they are hit tested. Previously, all disks were always oriented towards the camera; this behavior will be the fallback if no normals are provided.
- The maxvariation parameter of occlusion() and indirectdiffuse() is now used for point-based occlusion and color bleeding. Previously, maxvariation was used for ray-traced calculations, but it was ignored for point-based calculations.
- time, dtime, and dPdtime are now computed for objects shaded using the vpvolumes shading strategy.
- dPdtime is now computed for all ray-traced geometry.
- The default value of maxvariation has been changed from -1 to 0.05. This change affects both ray-traced and point-based occlusion() and indirectdiffuse().
- The default matting behavior when a matte object is inside a vpvolumes shaded object has been fixed.
- A bug that could result in artifacts when using "doubleshaded=1" has been fixed.
- A bug that could cause different results when calling attribute("displacementbound:sphere", d) inside a surface or a displacement shader has been fixed.
- Fixed a bug related to invalid faces on subdivision surfaces (due to duplicate edges or non-manifold edges) that could cause problems with facevarying data.
- Rendering statistics now include a breakdown of time spent in RSL plugins.
- A warning is reported if a shader calls lights in a varying conditional context (e.g. in a branch of a varying "if" statement). Doing so is risky because values provided by the surface shader might be incompletely initialized.
- Certain warnings (i.e. those that include shader call stacks) are now reported using a new multi-line error format. For example:
S01008 {WARNING} Variable X is uninitialized: file myplastic.sl, line 21, pc 17 S01008 {CONTINUED} in myfunction, called at line 28 of myplastic.sl S01008 {CONTINUED} in mydiffuse, called at line 86 of myplastic.sl [Object:'<unnamed>']
- There is a new warning, S31003, to catch the case where undeclared variables fall back to rely on the .slo files for type information. Users who are certain that undeclared variables serve their interests can use woff to override this feature. This can also be done in the rendermn.ini, by adding /messages/disable S31003.
- PRMan now emits a warning (once) if bake3d() is asked to bake grids of points on geometry with raster-oriented dicing on. Point clouds generated from the aforementioned geometry are unsuitable for subsurface scattering, point-based occlusion and color bleeding, generating brick maps, etc.
- PRMan now emits a warning at the end of a render if an RslPlugin modifies the contents of an RtString that has been passed as an argument.
- The timing statistics for texture3d() and brick reads are more consistent.
- texture3d() calls that read point cloud files now return useful error codes.
- Various error messages and warnings have been updated for accuracy and efficacy.
- The built-in strings substituted for "$ARCH" or "%ARCH" in RIB searchpaths and procedural names have been updated; see Procedural Primitive Pathnames for details. Please consult the /architecture definitions in rendermn.ini for a way to revert to the previous names, or to supply site-specific names, and be sure to review your current site rendermn.ini for /architecture or /dirmap settings that may need to be updated to reflect the new built-in names.
- There is a new command line option to prman: -capture filename. When used, -capture writes all RIB rendered by prman to the given filename. Procedural primitives are written to a subdirectory as they are processed by the renderer, with paths written into the "captured" RIB file.
- There is a new attribute, "procedural" "int unloadable", that controls whether a procedural can be unloaded by proceduralmemory limiter or not. The default value is 1 (all procprims are subject to unloading).
- The libprman dynamic library for Linux distributions is now versioned. Users can link to libprman.so for an unversioned binary, or they can link to libprman_versioned.so for linkage to a specific release of the library.
- Illuminance loops can now fetch member variables from lights, using the same syntax that is used to fetch light parameters.
- Fixed a bug that could cause artifacts when spooling multithreaded netrenders to multiple hosts.
- The netrender -F client protocol now handles file names containing spaces or backslashes properly.
- The stability of the renderer with respect to multithreading and procedurals (particularly ray-traced) has been improved.
- A bug that could potentially cause a crash when using sloinfo with no command-line arguments has been fixed.
- A bug affecting multi-segment motion blur that could result in brighter-than-expected images has been fixed.
- Fixed a bug that could result in subdivision surfaces not correctly cloning string arguments for tags.
- A bug that could lead to erroneous resolution when the same declaration is used in multiple shadeop DSOs has been fixed.
- Fixed ASCII RIB formatting consistency by ensuring that a space precedes each token declaration in a parameter list.
- Fixed a bug with wnoise that could lead to a crash when N=0.
- The -catrib flag for prman now properly respects the -gzip and -binary flags.
- On Windows and OS X, the installer can now be run via the command line, bypassing the licensing application. As a consequence, installing via the command line will require handling licensing manually, via the rendermn.ini.
- Support for 64-bit builds on Windows Vista (64) and for 32- and 64-bit builds on OS X 10.5 (Leopard) has been added.
- A new version of the Pixar License Server, 6.0, is now available. Please consult the License 6.0 release notes for additional information.
- Passing the value [0 0] to the shutteropening parameter now gives the correct result, instead of wrongly mirroring the default behaviour of [0 1].
"current" space is no longer the default "camera" space in visible point volume shaders that execute from an arbitrary camera (and only in that case), "current" space is the actual named camera space.
RSL 2.0 now allows empty class member statements.
Eliminated a performance penalty that could result when shaders were instanced a significant number of times/attached to numerous pieces of geometry.
The stats overhead on ray-traced grids has been reduced.
The renderer now reports an error if prman/texture3d/maxfiles is exceeded.
The renderer now supports selecting array elements from DisplayChannels that are arrays. For example:
DisplayChannel "varying color[20] AOVOut1" Display "+output.exr" "openexr" "P,N,AOVOut1:5"
Pixar Animation Studios
|