Since we use substance painter/Mari ,it is PBR already texture tool right?
For example , i set the basecolor to ‘‘Dry sand’’ RGB linear to 0.4, then i load the basecolor texture in maya and set the colorspace to “Utility - sRGB - Texture”, but it dark the basecolor texture again , make it lower than 0.4, does this break the PBR workflow? cause i already set plausible values to the basecolor but ACES make it darker .
THis is the main thing make me confuse about ACES “Utility - sRGB - Texture”
We now use “Output - sRGB” to preserver the value.
Karas, I just released two filters to deal with this within Substance Painter (and Designer).
“Output - sRGB” is the IDT to use for preserving the tonal range but as you noticed value 0.81 in source texture will be remapped to 1 and values above that (0.81-1.0) fully lost.
“Utility - sRGB - Texture” IDT will make everything darker unless you create your maps from scratch under a display referred view transform like “Output - sRGB”.
With the filters you have both ways while working in Substance Painter. For the “Output - sRGB” IDT I made sure that the inverse RRT fell right into PBR range.
Have a look here, in the next days I will properly make a full post in ACESCentral, so I can get some feedback.
I wanted to chime in to confirm what others mentioned with more details. I ended up making a diagram to show the error when roundtripping pixels from sRGB-Display => Scene Referred Rec. 709 => sRGB-Display. This uses the default OCIO ACES CG Config:
The position of each point is the sRGB color after roundtripping, with a thin grey line for each showing the original color’s coordinates. Each point is also colored by its original source color.
You can see that there’s a big group of colors around Yellow/Green that get mapped pretty far away from the source. I know that roundtripping can’t be perfectly lossless, but I thought this was interesting. And on the whole, most of the color volume is round-tripped quite well!
For posterity, here’s the OCIO python code to do the reverse mapping of a pixel:
# The config path should point to the file on your system
# If using the OCIO environment variable, PyOpenColorIO should find it automatically.
# You can get the exact path by running: ociocheck --path
config = OCIO.Config.CreateFromFile("ocio://cg-config-v2.2.0_aces-v1.3_ocio-v2.4")
input_space = "Linear Rec.709 (sRGB)"
source_display = "sRGB - Display"
display = config.getDefaultDisplay()
view = config.getDefaultView(display)
print(f"Inspecting transformation path:")
print(f" Input Space: '{input_space}'")
print(f" Output Display: '{display}'")
print(f" Output View: '{view}'\n")
processor_inverse = config.getProcessor(input_space, display, view, PyOpenColorIO.TransformDirection.TRANSFORM_DIR_INVERSE)
cpu_inverse = processor_inverse.getDefaultCPUProcessor()
processor_forward = config.getProcessor(input_space, display, view, PyOpenColorIO.TransformDirection.TRANSFORM_DIR_FORWARD)
cpu_forward = processor_forward.getDefaultCPUProcessor()
def run_pixel(cpu, pixel):
pix = cpu.applyRGB(pixel)
print("Running pixel: ",pixel, " => ",pix)
return pix
def roundtrip_pixel(pixel):
rev = cpu_inverse.applyRGB(pixel)
fwd = cpu_forward.applyRGB(rev)
print("Roundtripping pixel: ", pixel, " => ",rev, " => ",fwd)
return [pixel, rev, fwd]
print("Processing pixels")
print("Reversing: ----")
scene_ref = run_pixel(cpu_inverse, [1,0,0])
print("Sending back through: ----")
out_sdr = run_pixel(cpu_forward, scene_ref)
print("-----------")
I feel it’s worth pointing out that an OCIO Processor is smart enough to “cancel out” adjacent “forwards” and “inverse” pairs of the same transform, if it possibly can.
Continuing from John’s example above, here’s the python code for applying the concatenated inverse and forwards transforms in a single OCIO processor:
These are (almost) ideal circumstances, of course; it’s often not possible to send a concatenated transform to a single OCIO processor (e.g., a cumulative transform broken into a chain of separate Nuke nodes, or a series of oiiotool options). But applications that parse AMFs, for example, have the opportunity to realize the “intent” of an ACES OT preceded by its inverse.