Milestone 4.2.1

September 8, 2014


  • EXR overscan support: Overscan is now supported by extending the render region beyond the regular image coordinates. E.g. a ten-pixel overscan for a 640x480 image in all directions can be achieved with options region_min_x,region_min_y,region_max_x,region_max_y of -10,-10,649,489. The old render region defaults of -1,-1,-1,-1 will continue to render the whole image, but new defaults (INT_MIN) are available going forward indicating the render region is not used. EXR output will fully respect the overscan region with differing data and display windows, but the other image formats will simply enlarge the final image resolution to incorporate overscan since they cannot accomodate data outside the display area of the image. (#3102)
  • Improved Cook-Torrance specular and refraction sampling: Many scenes will now render with significantly reduced noise for glossy reflection and rough refraction with the microfacet-based Cook-Torrance BSDF. In particular, BSDFs viewed at grazing angles or involved in multiple glossy or refraction bounces are improved. (#4064, #4196, #4209)
  • Improved sampling of textured quad lights: Quad lights now use a new sampling strategy that adaptively chooses the best sample distribution for each shading point. The noise reduction is most noticeable with textured lights, both on surfaces and in volumes. (#3567)
  • Automatic texture_max_open_files: The options.texture_max_open_files is now set by default to 0, which means that the maximum number of texture files that can be simultaneously opened is automatically computed by Arnold using a new heuristic. This now works for Windows, Linux, and OS X. We expect that the majority of users will be able to leave this at 0 and get the best performance. If Arnold runs out of file handles, Arnold is now more likely to be able to recover without crashing. If the automatic texture_max_open_files that is set is deemed too low, then texture_max_open_files can still be set manually. However, a better solution (and often the only solution) on Linux and OS X is to increase, in the OS, the open file handle hard limit. (#4139, #4140, #4141)
  • Improved performance for shadow ray texture lookups: For shades done to shadow rays (transparency), texture lookups now use less texture I/O. (#4167)
  • Improved performance for rough glossy texture lookups: This improvement was supposed to have been in 4.0.12, but due to a bug, it was never actually enabled in the AiBRDFIntegrate() function used by the standard shader. Shaders that were manually calling the older APIAiCookTorranceIntegrate() were never affected by this bug and have been able to use this improvement since 4.0.12. Now both AiBRDFIntegrate()and AiCookTorranceIntegrate() make use of this feature. Now that the standard shader finally has this feature, users should find that glossy reflections will pull the correct texture mipmap level across all distances while maintaining an optimal amount of texture sharpness. This can result in dramatic reductions in texture I/O and lessens the need for using the texture_glossy_blur option, which we now recommend setting to zero. Unfortunately, third party shaders that do their own integration and manual ray tracing (such as alSurface and Kettle) will not be helped by these fixes, something that we hope to address in a future version. (#4164, #4176)
  • Faster IPR when rendering with many textures: Time between IPR progressive frames has been decreased when there are many textures being used. This is especially evident when the textures reside on a high latency file server. (#4152)
  • Low-level optimizations: Several optimizations were made to improve performance. Some of these are most noticeable on linux and/or when rendering empty or low-complexity regions. (#4193, #4212, #4228, #4149, #1231)
  • Upgraded OIIO to 1.4: This new version comes with many little improvements and bug fixes. For instance, processing a 54k-resolution TIFF file withmaketx on Linux is now 4.5x faster compared to the previous version. However, we now requires a manual texture flush in order for changes made to texture files be reflected inside of arnold. (#3593, #3646, #3826, #4154)

API additions

  • Python 3 support: The Arnold Python API and pykick are now fully compatible with Python 3, workarounds for module importing and unicode strings are no longer needed. (#4239)

Incompatible changes

  • Difference in microfacet BTDFs: Rough refraction viewed at grazing angles or using Phong-smoothed normals renders slightly darker now, especially for high roughness values. This affects the standard shader and AiMicrofacetBTDFIntegrate(), and fixes a bug in the previous BTDF sampling. (#4196, #4231)
  • Handling of unassociated alpha for TGA and PSD: OpenImageIO 1.4 has more conformant handling of unassociated ("unpremultiplied") alpha in TGA and PSD files. This results in improved texture filtering for typical files, but may also cause TGA files that are missing the appropriate metadata to render darker.

Bug fixes



#3998Writing an .ass with open procedurals will not preserve overrides
#4158Indirect from volumes in SSS is extremely noisy
#3183OIIO cache refuses to close texture files
#3355Overridden opaque attribute on procedural not written out
#3605extreme anisotropy in Cook-Torrance BRDF produces black
#3624Calling AiUniverseCacheFlush(AI_CACHE_TEXTURE) outside AiBegin / AiEnd crashes
#3674OIIO locking texture files between renders on windows
#3823deepexr driver crashes in tiled mode
#3867OIIO does not check validity of image SHA
#3893light_gamma is not applied to skydome_light color
#4068utility shader unconditionally overwrites opacity when opaque flag is off
#4119faceting in Cook-Torrance and Ward-Duer speculars
#4123NaNs in bump mapping when Ns and N differ very slightly
#4126make backtrace handler more resilient to errors
#4130zero-length or NaN tangents causing artifacts in Cook-Torrance and Ward-Duer MIS functions
#4131Zero roughness crashes AiCookTorranceIntegrate
#4134crash with non-existent procedural path and AI_RENDER_MODE_FREE
#4137null tangent vectors potentially causing crashes in Cook-Torrance and Ward-Duer
#4142Don't crash if OIIO runs out of file handles
#4144Crash after cloning shader with linked array parameter
#4147Support user data for mesh light texture
#4159AiShaderGlobalsGet*() hang if called during displacement
#4160Volume node should adjust rays to local space
#4161Wrong AtPoint2 constructor in Python bindings
#4163robustness fixes in OBJ procedural loader
#4164excessive texture I/O in cook-torrance blurry reflections in standard shader
#4171Sampling position offset should be object space in density shader
#4181Interactive creation of an object in an empty scene does not work
#4183Spherical quad sampling converges a different result than area sampling in quad_light
#4184Enable tiled Deep EXR output
#4186driver quantization API functions overflow with large float values
#4187skydome_light crash in IPR and corruption with per-component linked color
#4190Wrong shadow when using utility shader to modulate opacity of an object
#4194crash when reporting error before the options node was initialized
#4198Sky image texture returns NaN when looking at poles
#4205Degenerate linear or curved motion transforms can cause crashes
#4211Removing a node with unsolved references causes a crash
#4213bump2d shifts with highly scaled UV coordinates
#4214AiNodeGetArray/Matrix returns wrong matrices on instances
#4215Deep EXR driver crash when reused in the same session
#4222Shadow precision artifacts with lights with visible geometries
#4231Microfacet refraction has sharp total internal reflection
#4240SSS invalid or crashes on non-polymesh objects
#4244Camera exposure affecting AOV alpha channels
#4251Skydome interactive enable/disable not working
#4252Don't write 'options' node default values to .ass file
#4157Need to warn when passing empty filename as texture name
#4192Cannot set metadata for "node" parameter on an .mtd file
  • No labels