These are the release notes for appleseed 1.8.0-beta.
These notes are part of a larger release, check out the main announcement for details.
This release is the fruit of the formidable work of the appleseed development team over the last six months.
Many thanks to our code contributors:
- Aytek Aman
- Luis Barrancos
- François Beaune
- Artem Bishev
- Petra Gospodnetic
- Roger Leigh
- Gleb Mishchenko
- Jino Park
- Sergo Pogosyan
- Esteban Tovagliari
And to our internal testers, feature specialists and artists, in particular:
- Richard Allen
- Dorian Fevrier
- François Gilliot
- JC Gutiérrez
- Luke Kliber
- Nathan Vegdahl
Interested in joining the appleseed development team, or want to get in touch with the developers? Join us on Slack. Simply interested in following appleseed's development and staying informed about upcoming appleseed releases? Follow us on Twitter.
Support for Procedural Objects
We introduced support for procedurally-defined objects, that is objects whose surface is defined by a function implemented in C++. This opens up a vast array of possibilities, from rendering fractal surfaces such as the Mandelbulb shown below, to rendering raw CAD models based on Constructive Solid Geometry without tessellating them into triangle meshes. One could even use this mechanism to prototype new acceleration structures with appleseed.
appleseed ships with three samples procedural objects in
samples/cpp/: an infinite plane object, a sphere object and the Mandelbulb fractal. This last sample is particularly interesting: it's actually a generic Signed Distance Field raymarcher and a great toy to tinker with if you like procedural graphics!
Some good resources about Signed Distance Fields:
- Ray Marching and Signed Distance Functions by Jamie Wong
- Modeling with Distance Functions by Íñigo Quílez
Support for Procedural Assemblies
We also introduced long-awaited support for procedural assemblies. In appleseed's terminology, an assembly is a "package" that represents a part of the scene. A procedural assembly is one that gets populated at render time instead of being described in the scene file. Somewhat schematically, a procedural assembly is defined by a C++ plugin which is invoked by the renderer when it needs to know the content of the assembly.
Procedural assemblies allow to procedurally populate a scene, for instance to generate thousands of instances of a single object based on rules, without having to store all those instances on disk.
Below is an example of a procedural assembly: it is a modern recreation of the sphereflake object designed by Eric Haines et al. and described in the 1987's article A Proposal for Standard Graphics Environments, rendered using subsurface scattering (using the Normalized Diffusion BSSRDF), a Disney BRDF and image-based lighting:
For reference (and for fun; who doesn't love retro CG!) here is one early rendering of the Sphereflake by Eric Haines:
A particular type of procedural assembly supported by appleseed is an archive assembly. An archive assembly is defined by a bounding box and a reference to another appleseed scene file (extension
.appleseedz). The referenced scene file is loaded by the renderer at the appropriate time. This is a common but powerful mechanism to assemble large and complex scenes out of smaller parts.
One important use of procedural assemblies in production is reading parts of scenes from Alembic archives, Pixar's USD scenes and other custom file formats.
We recently started working on adding support for loading geometry directly from Alembic archives.
AOV Subsystem Rewrite
This release saw the previous AOV mechanism completely ripped out and reimplemented from scratch. While flexible, the previous AOV mechanism made it hard or in some cases impossible to composite AOVs back together. Moreover it lacked fundamental features such as splitting direct lighting from indirect lighting contributions or splitting diffuse from glossy scattering modes.
The new AOV subsystem implements what you expect from a modern renderer. appleseed currently supports the following AOVs:
- Direct Diffuse, Indirect Diffuse, Combined Diffuse
- Direct Glossy, Indirect Glossy, Combined Glossy
- Shading Normals
Here is an example of AOVs rendered from our shaderball scene:
And the beauty render:
AOVs must currently be declared manually in the scene file:
<output> <frame name="beauty"> <parameter name="camera" value="/group/camera" /> <parameter name="resolution" value="640 480" /> <parameter name="crop_window" value="0 0 639 479" /> <aovs> <aov model="diffuse_aov" /> <aov model="glossy_aov" /> </aovs> </frame> </output>
The next release of appleseed will allow adding/removing AOVs directly from appleseed.studio. It will also add AOVs for our render denoiser, and if time allows, it will introduce native Cryptomatte support. We are also considering adding a motion vectors AOV in a future release.
Color Pipeline Overhaul
The color pipeline is another area that received a ton of attention in this release.
First of all, remember that appleseed is fully capable of spectral rendering, currently using 31 equidistant wavelengths in the 400 nm to 700 nm visible light range.
In the name of speed and accuracy, we no longer switch on-the-fly between RGB and spectral representations during rendering. We had a neat mechanism that supported this feature for many years but it had three main problems: it prevented us from being completely rigorous about color management, it incurred tremendous complexity in the very core of the renderer and it had nasty edge cases causing severe performance issues. Instead, we now let the user decide which color pipeline to use: RGB or spectral:
The RGB pipeline is the default and for most purposes there is no point in changing it. However appleseed is one of the rare renderers with spectral capabilities and we will continue pushing and extending this mechanism over the releases to come. In particular the next release will extend the wavelength range to 380-780 nm and should feature a much improved RGB-to-spectral conversion algorithm.
We also removed a lot of settings from Frame entities that didn't make much sense anymore. appleseed's internal framebuffer is now always linear, unclamped, premultiplied and uses 32-bit floating point precision.
Finally, appleseed.studio is now using OpenColorIO for color management. There is now a dropdown menu in appleseed.studio to choose a display transform (an Output Device Transform in ACES terminology) at any point during or after rendering:
appleseed.studio will populate this dropdown menu with transforms listed in OpenColorIO's configuration on the user's machine.
Support for Plugins (work-in-progress)
In addition to the procedural objects and procedural assemblies described above, this release also allows to extend all "scene modeling components" of appleseed via external plugins written in C++. This includes cameras, BSDFs, BSSRDFs, EDFs, lights, materials, textures, environments... There are technicalities that make this work incomplete in this release; we will gradually fix them as the need arises.
Substance Painter Export Presets
We now include Substance Painter export presets in the
share/ folder inside appleseed's package.
Python Console in appleseed.studio (work-in-progress)
Our Google Summer of Code 2017 student Gleb Mishchenko implemented a Python console inside appleseed.studio, our scene tweaking, rendering, inspecting and debugging application:
Here is a closeup of the Python console loaded with a simple script that prints the name of all objects in the scene:
appleseed.studio also supports Python plugins: any directory with a
__init__.py file inside
studio/plugins/ will be imported and registered at startup. There are example plugins in
Our motivation behind the Python console is threefold: simplify and speed up the development of appleseed.studio; let users extend appleseed.studio using Python plugins, and let users automate tedious tasks using one-off Python scripts directly inside appleseed.studio, with immediate feedback on their scene.
This work is still very much in progress: our Python API is quite low-level and not as comfortable to use as it could be, and we have yet to bundle PySide to let scripts extend the user interface and add menus, panels and dialogs (however we did play with this and it already works on Linux).
Details of Gleb's GSoC project can be found in his report.
Support for Participating Media (work-in-progress)
Artem Bishev, another of our GSoC 2017 students, took upon himself the rather intricate task of implementing physically-based volumetric rendering in appleseed.
In this release, appleseed supports fully raytraced single-scattering and multiple-scattering inside homogeneous participating media. Two phase functions are currently supported: a fully isotropic phase function and the Henyey-Greenstein phase function.
A volumetric bunny in the Cornell Box (spectral render):
This work is very much in progress. Main upcoming features are heterogeneous media and OpenVDB support.
Details of Artem's project can be found in his report.
New Light Sampling Algorithm (work-in-progress)
Petra Gospodnetić, our third GSoC student this year, spent her summer implementing a new light sampling strategy in appleseed based on Nathan Vegdahl's Light Tree algorithm. The Light Tree is a simple yet clever unbiased sampling algorithm that picks better candidate points on area/mesh light sources.
To illustrate the benefits of the Light Tree, here is a comparison between the existing light sampling algorithm and the new one on a scene making heavy use of mesh lights (both images were rendered with 16 samples/pixel):
And here is the converged render:
Full details of Petra's work can be found in her report.
Other New Features and Improvements
- The physical sun light can now cast soft shadows, and the observer-Sun distance can be changed.
- Significantly improved our bump mapping implementation.
- Fixed a number of artifacts on silhouettes of coarsely tessellated meshes.
- Fixed artifacts due to high geometric complexity close to SSS materials.
- Lookup environment after glossy bounces even if IBL is disabled.
- Added instruction sets detection and release/host compatibility checks at startup.
- Switched from CIE 1964 10° color matching funtions to CIE 1931 2° color matching functions.
- Removed all color settings from Frame entities: pixel format, color space, clamping, premultiplied alpha, gamma correction.
- Removed Shade Alpha Cutouts option.
- Removed color and alpha multipliers from Physical Surface Shader.
- Removed Velvet BRDF as it has been superseded by the Sheen BRDF.
- Removed deprecated Microfacet BRDF in favor of higher-level ones such as Glass, Glossy, Metal or Plastic.
- Save chromaticities in OpenEXR renders (currently: scene-referred linear sRGB / Rec. 709 primaries).
- Made medium priorities signed (-128 to 127).
- Fixed incorrect rendering when the number of direct lighting samples is fractional.
- Improved the Entity Editor, in particular formatting and validation of numeric inputs.
- Fixed bug where the Entity Editor would close after renaming the entity.
- Fixed bug in material assignment editor window.
- Automatically realign camera target if it is off the viewing direction.
- Filtering regular expressions are now case-insensitive.
- Added ability to close the project via File → Close.
- Fixed multiple filtering bugs in the Tests dialog.
- Added button in Tests dialog to check only visible items.
- Improved handling of rendering failures such as out-of-memory errors.
- Persist file filters in image/texture file dialogs.
--to-stdoutmode to send rendered tiles to the standard output (in binary).
--continuous-savingmode since it fundamentally could not work reliably.
- Message coloring and verbosity settings set on the command line now have precedence over those set in