Welcome to version 15 of Pixar's RenderMan. Highlights of this release include the introduction of true volume rendering, member functions and inheritance for RSL structs, support for imager shaders, a new shading pipeline stage - refinement - for guiding the renderer's tessellator, as well as support for Disney's new Ptex texture format, which eliminates the need for user-provided parameterization for subdiv and polygon meshes.
Details of this release are enumerated below.
Unlimited Threads - The licensing policy has been adjusted such that users now get "unlimited threads per seat" via any invocation of PRMan. In so doing, license sharing across invocations of PRMan is no longer possible: each invocation checks out one license that allows unlimited threads. In tandem with this policy change, PRMan will now instantiate the number of threads equal to the number of cores on the machine by default.
Volume Rendering - PRMan 15 introduces a new, simpler and more efficient method for rendering volumetric effects. Two new geometric primitives for volume rendering have been implemented, which, used in conjunction with new shading language model support, offer improved rendering of volumes and volumetric effects.
New Texture Format: Ptex - The renderer now supports the Ptex texture format, providing per-face texture mapping. Support is provided in several ways: via the ptexture() shadeop, a new ptxmake utility, and for the .ptx format in the environment() shadeop. Ptex supports arbitrary filters, large blur, and the standard texture() arguments "blur", "width", "sharpness", and "lerp". Additionally, there are two new utilities for examining per-face textures: ptxview and ptxinfo.
Filter Regions - The shading language supports a new type - filterregion - for accessing the texture system. A filterregion can be created from texture coordinates in a couple different ways, scaled, queried to determine size, and passed to the texture, shadow, environment, ptexture, and gather calls. A filterregion acts much like a struct.
Unlocked Procedurals - In prior releases, all procedural primitive geometry was run serially and could not be run simultaneously in multiple threads. This release adds a new attribute that allows this restriction to be removed. Specifying Attribute "procedural" "int reentrant" [1] will cause any subsequent procedural to not lock the global mutex. Of course, this requires that the procedural be thread safe. The default value of this attribute is 0, i.e. all procedurals remain locked. The default value can be overridden by a rendermn.ini flag: /prman/procedural/reentrant can be set to true or false, and this value will dictate the default value of Attribute "procedural" "reentrant" if not otherwise set. There are some caveats to this feature.
Subdivision Surface API - There is a new API for subdivision surfaces, providing limit surface and subdivision evaluation services for both procedural plugins and standalone applications.
Imager Shaders - PRMan now supports arbitrary imager shaders, operating on both pixel samples and final pixel values.
Struct Inheritance and Member Functions - RPS 15 introduces struct member functions and inheritance for structs. These two features provide useful mechanisms to aid code factoring and code maintainance. They also provide a namespace encapsulation for functions that are relevant to a struct.
Struct Methods - Support has been added for struct methods. Structs may also have private data and private functions, specified by the private keyword, e.g.::
Struct Foo{ private varying float privateFloat = 0; //...
Refinement Method - A new refinement method has been implemented, providing programmatic control over shading rate.
Upgraded Implicit Field Plugin Interface - The Implicit Field Plugin interface has been upgraded to version 2 and now supports SIMD eval methods. Existing plugins can simply be recompiled to get the default implementation and will be marked as version 2. Existing version 1 plugins that aren't recompiled should still work correctly. Additionally, the CreateVertexValue callback for implicit surface DSOs now gets a typename as well as a variable name, e.g. "float fuel" instead of just "fuel". This will only occur for a plugin that is marked version 2.
Implicit Cone Plugin - There is a new, true implicit cone plugin.
New Facevarying Subdivision Mode - The renderer now supports a facevaryinginterpolateboundary mode, in which smoothing is applied only for facevarying values away from the discontinuous boundary; any values at a facevarying boundary will not be smoothed. This mode is intended to be maximally compatible with ZBrush and Maya's "smooth internal" interpolations, and can be selected by setting the value of the "facevaryinginterpolateboundary" tag to 3.
Ray Differential Shadeop - There is a new shadeop - raydifferentials(a, b, c) - that computes three ray differentials.
gridmin(), gridmax() - There are two new shading language functions, gridmin() and gridmax(). These functions are defined for float inputs, and their output can be either uniform or varying float.
There is a new .ini setting - prman/constantmemorylimit with a default value of 0 (false) that makes the various memory limits for caches constant, regardless of the number of threads, rather than increasing with the number of threads.
There is a new cachesize limit for hemisphere sample results (HSRs). The size can be set with an option - Option "limits" "hemispheresamplememory" ... - or via .ini file, like so: /prman/raytrace/hemispheresamplememory ... The size is specified in KB. The default size is 10 MB (independent of the number of threads). If the size is set to 0, no HSRs will be stored.
Added a new command-line option to brickmake: -addpresence 0|1. This adds an extra float channel called _presence to the brick map. The _presence channel indicates how much of each voxel is full of data points from the point cloud. (The rest of the voxel is empty.) This is useful for brick maps of volume data.
Implemented texture3d() lookups in volume brick maps with _presence data. When there are _presence data in the brick map, the data values from each voxel are weighted by the presence in that voxel. If the total presence in all voxels that overlap the filter volume is less than 1, the remainder will be set to the "fill" data values. The "fill" data are the input values of the result parameter.
There is a new, optional RiCamera parameter, "float focusregion", which allows a range in depth to be kept in focus. The default value is 0 (off). Additionally, "float[3] depthoffield" can now be an RiCamera parameter.
The toslim utility is now included with RenderMan Pro Server.
Two new Rix interfaces are now accessible:
There have been significant changes to deep shadow memory management. A new Ri Option — deepshadowmemory — has been introduced, and there have been corresponding modifications to the deepshadowtiles option.
deepshadowmemory specifies a memory limit, rather than a number of tiles, as the largest size of the deep shadow cache it will try to maintain. The deepshadowmemory is specified in KB, as are all other memory limits, and has a default value of 40960.
The deepshadowtiles limit is now used as the initial number of tiles that the cache is optimized for; it now has a default value of 1000. The cache will grow from this number of tiles until the memory limit is reached, at which point it throws away tiles whenever the limit is crossed. Note that this change could affect performance, relative to previous versions; please consult the Known Issues for details.
Memory performance for all subdivision surfaces has been improved.
Memory management of caches across threads has been improved.
Brick Map memory consumption on 64-bit machines has been halved.
Ray tracing and ray-traced shading are faster.
Shadow rendering is faster.
Threading performance for RiBlobby implicit surfaces has been improved.
Baking for re-rendering is faster in scenes with high geometric complexity.
Performance on geometrically "heavy" scenes has been improved.
Memory performance for ray-traced occlusion() and indirectdiffuse() has been improved.
There have been numerous improvements pertaining to thread safety.
RiBlobby evaluation of implicit field function DSOs is much faster.
Changes to interpolation behavior have improved performance for occlusion() and indirectdiffuse() results with maxvariation > 0.
The brick map API has been updated, enabling the aforementioned reduction (by a factor of 2) in memory consumption.
For complete details, please consult the Brick Map API developer note.
A new Point Cloud API function is available: PtcGetNearestPointsData(). This function returns an interpolated lookup result at a given point and normal.
There is a new spheres display mode in the ptviewer utility for point clouds with all zero normals, which is particularly useful for viewing point clouds generated by the volume primitive.
The renderer now allows users to bake point clouds with no data (i.e. an empty string in the displaychannels parameter).
Fixed handling of the -dspyargs parameter of ptrender.
Fixed a bug that could lead to a crash when there are more brick maps in play than specified via /prman/texture3d/maxfiles in the rendermn.ini. When a brick map file pointer is recycled, the large arrays pointed to by the brick map are freed, but the brick map itself (which is quite small) is kept around. This makes it possible to re-open the brick map if needed, while keeping the overall memory use limited.
A ptfilter bug that could result in a crash when passing position point clouds and using -filter colorbleeding has been fixed.
Point clouds and brick maps with matrix data can now be read without crashing.
There is a new optional argument to txmake - -extraargs displaywindow - which adds the ability to txmake EXR images with display windows such that the display window becomes the full resolution of the output texture. Supported outputs are the tiff, exr, and Pixar texture formats.
Users can now select array elements from DisplayChannels that are arrays, e.g.
DisplayChannel "varying color[20] AOVOut1" Display "+output.exr" "openexr" "P,N,AOVOut1:5"
TIFF and OpenEXR shadows generated by the d_shadow display driver are no longer restricted to a 16K x 16K maximum resolution.
Source image width/height is now being stored correctly in TIFF textures.
A bug that caused incorrect channel names to be passed from an array of AOVs to the OpenEXR driver has been fixed.
A bug that caused the OpenEXR display driver to strip sequence numbers from channel names incorrectly has been fixed.
A query of the texturememory limit now returns its value in KB (the same as how it is specified in RIB).
The Options tab in the xml statistics now includes point, node, and deepshadow memory. The values reported are what was actually used. The renderer looks for the specification first in the RIB file, then in the .ini file; if not present, it then uses the default.
Due to security restrictions in modern browsers, having the XML style sheet as a separate file in a separate directory will no longer generate a correct stats display. Instead, we now embed the stylesheet directly into the stats file. While this increases the size of each stats file, the results are more useful in modern browsers. This default behavior can be changed via the rendermn.ini, like so:
/prman/statistics/embedstylesheet false
Brick map cache stats for brick map gprims have been improved.
Fixed some issues with combined shading statistics.
There is a new RiVolume primitive:
RiVolume "type" [ bounds ] [ nx ny nz ] ...
The RiVolume primitive is expected to be generally more efficient than the equivalent RiBlobby primitive, since field function evaluations are greatly reduced. Type can take the string value: "box", "ellipsoid", "cone", or "cylinder". We expect users to supply nx * ny * nz values for vertex and varying storage class variables, specified in an order where X varies fastest and Z varies slowest. Vertex is interpolated using a tricubic basis; varying is interpolated using a trilinear basis. For uniform/constant storage a single value is expected.
The new RiVolume primitive carries with it several caveats:
There is a new Attribute that controls visible point list compression, enabling significant speedups for volumes with high visible point depth complexity, but low actual color complexity:
Attribute "volume" "deptherror" [0.00392]
This number represents the maximum shift in adjacent visible points before they are considered too different to be composited together. In cases where there are no overlapping volumes, or there is no deep shadow map being output, the deptherror can be significantly increased (leading to faster and slimmer renders) since compositing early does not affect the final answer. However, compositing early will increase error for overlapping volumes and deep shadow map output, thus increasing the deptherror is not advised for those situations.
The rerendering mode of prman now supports implicit surfaces.
The "editlights" token in RiEditBegin can now signify an array of lights in addition to a colon-separated list of lights concatenated into a single string. To get the array behavior, use an inline declaration containing the array length, e.g.:
EditBegin "relighting" "string[2] editlights" ["light2" "light3"]
Rather than:
EditBegin "relighting" "string editlights" ["light2:light3"]
"w" is now an allowed variable in the shading language. Existing shaders that declare a local variable w continue to work.
There is a new subsurface scattering parameter: "followtopology". It diminishes subsurface scattering across local concavities such as wrinkles, skin pores, lips, etc.
There is a new "environmentblur" parameter for the occlusion() and indirectdiffuse() functions. This blur is applited to lookups into an environment map specified by the exisiting "environmentmap" parameter.
There is a new option, gridmemory, which can be used to set a grid memory threshold; when grid memory goes above this value, the renderer will attempt to discard grids that can be regenerated later by re-dicing the high-level gprim from which they originated.
The "hitsides" parameter for indirectdiffuse() has been split in two: "colorhitsides" and "occlusionhitsides" provide additional control point-based color bleeding. The "hitsides" parameter is still supported, however, setting "colorhitsides" to "front" and "occlusionhitsides" to "both" will provide more accurate results.
Corresponding to the change above, the ptfilter option -sides can now be specified by two separate options, -colorsides and -occlusionsides, for increased control.
A new rendermn.ini setting has been added to control statistics behavior on Linux and OS-X:
/prman/statistics/emitoncrash true
If set to false, PRMan will not emit statistics when it receives a synchronous signal, for example SIGSEGV. This will avoid a potential deadlock situation at the expense of not obtaining statistics if PRMan crashes.
NDC and screen space can now be retrieved from arbitrary cameras.
Ray-traced motion blurred RiBlobby volumes are now much faster to render.
Render speed has been improved across the board for "diagonal motion blur", including cases where primitives fly through the camera plane. This is particularly relevant for volumes going through the camera; in some situations, the memory requirements have been reduced by an order of magnitude, along with the increase in speed.
The handling of ray-traced RiBlobby volumetric envelopes has been significantly improved. Results are much more accurate, and problems with self-biasing should now be eliminated or greatly reduced.
The intersectinggeometry refinement strategy is now much more robust. Also, the interaction of volumes with opaque surfaces in general has been improved.
Volumes now respect RiGeometricApproximation. Note that due to the nature of their dicing algorithm, the response of RiBlobby to RiGeometricApproximation may be limited.
Thread safety during re-rendering has been improved.
Re-rendering bake options can now be queried via the option() shadeop, RxOption(), or a rib conditional, e.g.:
uniform float baking = 0; option("render:rerenderbake", baking);
Baking for re-rendering should result in smaller bakedb sizes when used with class-based shaders.
Visible point shading now allows both an Atmosphere and Interiors to run at a point.
Ptfilter can now compute multibounce partial color bleeding results. This is useful when ptfilter is used to compute multiple global illumination bounces and indirectdiffuse() is used to compute one additional bounce.
The RiHider "shutteropening" option has been replaced by the RiCamera "shutteropening" option, which provides the same functionality.
Users can now specify an array element for DisplayChannel "string source".
The -Progress option to ptfilter (notice the capital P, and it takes no argument) prints R90000 progress percentages but no other progress info. This mimics PRMan's -Progress behavior.
The ptfilter parameter -albedochannel now applies to colorbleeding as well as volumecolorbleeding.
The diffuse reflection coefficients are now clamped to the range [0,1] for multiple-bounce point-based color bleeding. This ensures more physically realistic results.
RicProcessCallbacks has been added to the PRMan Python binding.
ptfilter's threading performance has been improved.
Point cloud stats have been improved.
Read times for brick maps and organized point clouds have been significantly reduced.
toslim now provides basic support for Imager shaders.
As of RenderMan Pro Server version 15.2, pursuant to the deprecation of Alfred and the implementation of Tractor, Alfserver is no longer included with the RPS package. Existing customers still using Alfserver can download Alfserver as part of the Alfred 9 package, and, of course, the Alfserver included with RPS 15.1 remains compatible.
Filterregions do not support the Lagrangian filter.
Deep Shadow Memory Changes in 15.0
Since there was no memory limit in previous versions, introducing one means that RIB files that only specify a large increase in the number of tiles (all existing ones, using the new default values) will possibly use fewer tiles (and less memory) in 15 than in previous versions. Alternatively, they may use more tiles/memory than in 14, because the number of tiles now has a higher limit. This can have a very significant impact in performance when comparing 14 to 15. Try setting deepshadowmemory to the amount of memory that a stats file from 14 says was being used to do reasonable comparisons.
Note that the cache is configured roughly for the deepshadowtiles limit, and will work well for several multiples of that value. If the eventual number of deep shadow tiles is 10-20X more than the initial number, performance may suffer significantly. If large cache sizes are used, the deepshadowtiles limit should be increased as well. Note again that the default initial number has been raised from 100 to 1000. The number of tiles and the memory limit both increase with the number of threads, so multithreaded renders will start with a larger than expected size. Users can check their settings by looking in the deep shadow section of the stats files. If "Initial Tiles" is 4-8X smaller than "Num tiles used" it could be helpful to increase the deepshadowtiles limit.
Ray-traced subdivision meshes are now subject to the procedural memory limit - even if they aren't themselves inside a procedural. As a result, these meshes will be unloaded from memory once the procedural memory limit has been reached. If you have set the limit low, or if you are rendering scenes much larger than the default 1 GB procedural memory limit, you may notice slower ray tracing renders - raising the limit will alleviate this behavior (at the expense of increased memory, of course).
During startup of rerendering, deadlock can occur if the launched prman process is configured to send pixels back to the application through the use of the -dspy option in the launch string. To avoid deadlock, issue a blocking, synchronous RicFlush() before the first RiEdit().
Pixar Animation Studios
|