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.
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
New Re-rendering Features
There are a number of improvements to PRMan's re-rendering technology:
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:
- The intersection tests themselves are faster since fewer quads/tris need to be hit tested.
- The number of lookups in the fine tessellation cache is reduced.
- Overall tessellation cache traffic is reduced.
- 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.
- 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.
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 rasterorient. 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%.
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.
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.
There is a new Deep Compositing Application Note that provides a closer look at these features.
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.
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>
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.
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:
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.
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():
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 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.
There is a new ray-traced implementation of `subsurface() <subsurface.html##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" "offscreenstrategy" "clamped" Attribute "dice" "offscreenstrategy" "sphericalprojection" Attribute "dice" "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.
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.
Pixar Animation Studios
|