New filters for rendering ACES in Substance Painter

(Jose L.) #1

Actually a filter to convert textures to ACEScg and a lut to convert ACEScg render view to ACES sRGB (in my lut release).
I also made another filter called PBR_SmartFit which helps on the inverse RRT conversion so values above 0.81 are not lost.
The filters are pretty straight forward with some settings exposed for linear or sRGB gamma input/output since Substance Designer unlike Painter defaults to sRGB. Substance Designer also lacks lut support so no option to render in ACES with Substance Designer.
*The ACEScg filter is based on the work of Stephen Hill (@self_shadow)

There’s only a gist when using “Output - sRGB” as IDT which I will now explain.
If you followed this thread a common issue when using “Output - sRGB” as IDT is HDR values. Source pure white 1.0 will remap to value of about 16.29, and target pure white corresponds now to value 0.81 in source losing 1/5 of texture information (textures should be in the 0-1 range, or less for PBR). A common recommendation and a standard in other painting programs is to use “Utility - sRGB - Texture” as IDT, this won’t apply an inverse RRT and hence after the forward RRT our images will look darker than normal. Depending on how you author your maps working in “Utility - sRGB - Texture” is fine, like when you create your albedo maps from scratch using ACES without relying on photographs or other media so it’s also available as an option in the filters. But nowadays in look development it’s not uncommon to mix textures from photographs, other non-ACES managed painting applications, or using library materials authored in sRGB.
This force us to stick to “Output - sRGB” for faithful tonal and color reproduction. To deal with the HDR values I created an special setting in PBR_SmartFit to keep all information within PBR legal range.

PBR_SmartFit is a filter to convert your source albedo maps to PBR legal range (0.0134-0.871 linear float as per Substance guidelines) in the smartest way, retaining source colorimetry, perceptual middle gray and full range details, unlike the internal “PBR Safe Albedo Color” which performs a range clamp on the out-of-PBR values. It tries to be faithful to source while making it PBR compliant. As I explained above, there’s an special option called “PBR for ACES”, when set to “Output - sRGB” what it does is create a special PBR range adapted to the inverse RRT which in turn maps said values to target PBR range while retaining source colorimetry, perceptual middle gray and full range details.
Following some comparisons rendering with Arnold for Maya using syntheticChart.01_ODT.Academy.sRGB_100nits_dim

Here I made a test asset to evaluate different materials under an ACES workflow. The default for Substance Painter is sRGB color space without any tonemapper. Following is ACESFilm tonemapper which like Brian Leleux ACES lut render the image too dark due to the lack of inverse RRT for the textures. Raising the gamma can patch this side effect but the premise is wrong to start with; bad environment exposure, contrasty textures, wrong light interaction -reflections, color bleed-… The last one is using ACEScg textures with the “ACESFilm - ACEScg” lut. Now environment has proper exposure at default gamma, color bleeding is more pronounced and overall light interaction is more correct.

The image below is after conversion of the HDRI assumed to be sRGB into ACEScg space. We normally don’t know what primaries the HDRIs were saved in because it is not normally specified but visual analysis can gives us a hint. Some use sRGB, others AdobeRGB and the ideal ones RAW, for which you should use rawtoaces for conversion of sensor spectral data.

More examples with different materials and environments.


Free download with instructions and more images on my ArtStation post.

1 Like

Anyone know of film schools teaching ACES?
(Karas) #2

As far as i know HDR map need to convert to ACES
because the color Primary changed, otherwise it will cause some saturate issues.


(Jose L.) #3

It depends on how you create the HDR image. I was researching on that the last day because how unsaturated and dull environment HDRIs generally are when preparing the presentation images.

The marble ball render on the left shows a dull EXR on the magic hour, so I knew something was off. Later I found that many OpenEXR HDRIs due to some color clipping are authored in AdobeRGB.
Others are directly written in RAW format and this is the recommended format in Arnold documentation and other programs. So I decided to stick to RAW, this matches Mari’s color space aliases and the gamut better matches to AdobeRGB (rather than sRGB). Since so few HDR authoring programs make use of the OpenEXR chromaticities attribute we can only assume. I decided to err on the saturated side, after all the HDRIs are heavily color edited (saturation, temperature, sharpness) to look nice. Still if you know your HDRI is sRGB you can still convert to ACEScg and load it in Substance Painter.
If the description is confusing I might change it after suggestions.


(Karas) #4

em… you are right , i thought all the HDRI maps were in sRGB primaries ,since most DCC and renderer said set the colorspace to Linear/RAW( no gamma correction ) for the HDR map and sRGB for color textures, i thought its stay in the same sRGB primaries.


(Christophe Brejon) #5

Hello Jose L,

sorry for the late reply. Things take a lot of time to implement here. and we are now starting to think about Look Development (and Surfacing) with an ACES workflow. :wink:

So far, here is the information I have gathered.
4 softwares are used to generate our textures :

  • Substance Painter : we can use your exr as a lut.

  • Substance Designer : no color management possible ?

  • Mari : we should ACES 1.0.3 OCIO config.

  • Photoshop : we can use ACES 1.0.3 ICC profiles. Otherwise there is a possible workflow described here.

Do you confirm this information ?

Now my question is : our rendering space is ACEScg and our display space is P3-D60 (ACES). The exr you provide displays as a SRGB (ACES) in Substance, right ? Could you make one for P3-D60 (ACES) ?

Thanks a lot in advance for your answers !



(Jose L.) #6

For the Substance Painter using only a lut (ACESFilm 2.0) is not enough. It is a hack, sort of. The proper way to do it is with the “ACESFilm - ACEScg” lut AND the ACEScg filter. By doing so you are properly converting Albedo to ACEScg with the filter and previewing in sRGB ODT with the lut, think of them as IDT (ACEScg filter), ODT (ACEScg lut).

Let me explain (I should probably record a video).
Let’s take Mari as an example. If you import an sRGB texture (photo, scan, etc), and use the default “Utility - sRGB - Texture”, it will paint/project darker than how you authored it, this is because “Utility - sRGB - Texture” doesn’t do an inverse RRT transform. Since your viewing transform includes an RRT everything will look darker.
The solution(?) is commonly said to be “Output - sRGB” used as IDT, this actually does an inverse RRT, hence when you apply the viewing transform the IDT and ODT cancel and you see what you authored. Now doing an inverse RRT (exponential function) presents a problem, you get an ACEScg albedo texture that is HDR, with values going as high as 16.29 (illegal albedo range, breaks PBR workflow), this will typically means that only values within 0-1 get validated (0-0.81 in source) losing 20% of texture information. We need ACEScg textures that represent the source material and at the same time are within 0-1 range, my solution is the PBR SmartFit filter.

While 0-1 is a valid texture range it still is an illegal PBR range, so with the PBR SmartFit filter (using a special mode) we can output a PBR range that is valid for the inverse RRT.

To sum it up, load both filters into Substance Painter and (recommended) place PBR SmartFit into the top stack of EACH material. Then place the ACEScg filter onto the top stack of ALL your materials. Check my second image for settings.
Following, load the “ACESFilm - ACEScg” lut, and in camera tonemapping use the “log” function transform. You are set.
To be on the safe side I also set Base Color, in “TEXTURE SET SETTINGS” panel to RGB32F.
Remember the exported Albedo maps from Substance Painter are sRGB gamma encoded, linearize to bring it back to ACEScg spec.
For a faster workflow, publish a “Convert to Linear” filter from Substance Designer and stack it on top of the ACEScg filter so you directly export linear within Painter.

The filters also work in Substance Designer but you can’t get a preview of your material since Substance Designer lacks lut support. Still you can validate PBR ranges and export your materials in ACEScg.

*Keep in mind, every color component of the render should be converted to ACEScg, this includes emission color, and HDRI environment maps. My filters are strictly for albedo. In a proper pipeline the HDRIs should also be converted to ACEScg, identify the source color space and convert to ACEScg in a third application, this way reflections and light interaction happen in ACEScg space.

Give me a day for the P3-D60 lut. If you have any questions don’t hesitate.

1 Like

(Christophe Brejon) #7

That’s awesome. Very clear and detailed explanation ! looking forward the P3-D60 exr then. :wink: Thanks Jose, much much appreciated !


(Jose L.) #8

Hello @ChrisBrejon
Sorry for the delay. Took the chance to revamp the luts and include 4 non-ACES tonemappers so people have something more accurate than ACESFilm 2.0 in case they don’t want to go the PBR+ACES route.
One tonemapper matches Marmoset Toolbag Hejl. The other three are “Uncharted 2” Hable’s based filmic tonemapping curves with two of them matching Blender’s “High” and “Medium High”. One of them converted to a Toolbag compatible .frag file as an extra tonemapper.
In the “LUTs for PBR+ACES” folder is included the “ACESFilm - ACEScg (P3-D60 ODT)” lut, tell me if it works. Download from my ArtStation.


(Christophe Brejon) #9

Thanks Jose. That sounds great ! I am currently on holidays but I’ll pass the link to my supervisor. Many many thanks ! Chris