forked from bartvdbraak/blender
Fix wrong white point of Linear ACES in config reading and the bundled config
The Blender/Cycles XYZ color space has a D65 white point instead of E, and this was not correctly accounted for both in the OpenColor config reading code and the bundled config. This meant that since the OpenColorIO v2 upgrade, the Linear ACES color space was not working correctly, and other OpenColorIO configs defining aces_interchange were not interpreted correctly.
This commit is contained in:
parent
1e7b2d0bc6
commit
eb20250d2a
@ -831,7 +831,8 @@ static bool to_scene_linear_transform(OCIO::ConstConfigRcPtr &config,
|
|||||||
|
|
||||||
void ShaderManager::init_xyz_transforms()
|
void ShaderManager::init_xyz_transforms()
|
||||||
{
|
{
|
||||||
/* Default to ITU-BT.709 in case no appropriate transform found. */
|
/* Default to ITU-BT.709 in case no appropriate transform found.
|
||||||
|
* Note XYZ here is defined as having a D65 white point. */
|
||||||
xyz_to_r = make_float3(3.2404542f, -1.5371385f, -0.4985314f);
|
xyz_to_r = make_float3(3.2404542f, -1.5371385f, -0.4985314f);
|
||||||
xyz_to_g = make_float3(-0.9692660f, 1.8760108f, 0.0415560f);
|
xyz_to_g = make_float3(-0.9692660f, 1.8760108f, 0.0415560f);
|
||||||
xyz_to_b = make_float3(0.0556434f, -0.2040259f, 1.0572252f);
|
xyz_to_b = make_float3(0.0556434f, -0.2040259f, 1.0572252f);
|
||||||
@ -848,24 +849,27 @@ void ShaderManager::init_xyz_transforms()
|
|||||||
|
|
||||||
if (config->hasRole("aces_interchange")) {
|
if (config->hasRole("aces_interchange")) {
|
||||||
/* Standard OpenColorIO role, defined as ACES2065-1. */
|
/* Standard OpenColorIO role, defined as ACES2065-1. */
|
||||||
const Transform xyz_to_aces = make_transform(1.0498110175f,
|
const Transform xyz_E_to_aces = make_transform(1.0498110175f,
|
||||||
0.0f,
|
0.0f,
|
||||||
-0.0000974845f,
|
-0.0000974845f,
|
||||||
0.0f,
|
0.0f,
|
||||||
-0.4959030231f,
|
-0.4959030231f,
|
||||||
1.3733130458f,
|
1.3733130458f,
|
||||||
0.0982400361f,
|
0.0982400361f,
|
||||||
0.0f,
|
0.0f,
|
||||||
0.0f,
|
0.0f,
|
||||||
0.0f,
|
0.0f,
|
||||||
0.9912520182f,
|
0.9912520182f,
|
||||||
0.0f);
|
0.0f);
|
||||||
|
const Transform xyz_D65_to_E = make_transform(
|
||||||
|
1.0521111f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.9184170f, 0.0f);
|
||||||
|
|
||||||
Transform aces_to_rgb;
|
Transform aces_to_rgb;
|
||||||
if (!to_scene_linear_transform(config, "aces_interchange", aces_to_rgb)) {
|
if (!to_scene_linear_transform(config, "aces_interchange", aces_to_rgb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
xyz_to_rgb = aces_to_rgb * xyz_to_aces;
|
xyz_to_rgb = aces_to_rgb * xyz_E_to_aces * xyz_D65_to_E;
|
||||||
}
|
}
|
||||||
else if (config->hasRole("XYZ")) {
|
else if (config->hasRole("XYZ")) {
|
||||||
/* Custom role used before the standard existed. */
|
/* Custom role used before the standard existed. */
|
||||||
|
@ -326,7 +326,8 @@ void OCIOImpl::configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config_, float xyz_to_rg
|
|||||||
{
|
{
|
||||||
ConstConfigRcPtr config = (*(ConstConfigRcPtr *)config_);
|
ConstConfigRcPtr config = (*(ConstConfigRcPtr *)config_);
|
||||||
|
|
||||||
/* Default to ITU-BT.709 in case no appropriate transform found. */
|
/* Default to ITU-BT.709 in case no appropriate transform found.
|
||||||
|
* Note XYZ is defined here as having a D65 white point. */
|
||||||
memcpy(xyz_to_rgb, OCIO_XYZ_TO_LINEAR_SRGB, sizeof(OCIO_XYZ_TO_LINEAR_SRGB));
|
memcpy(xyz_to_rgb, OCIO_XYZ_TO_LINEAR_SRGB, sizeof(OCIO_XYZ_TO_LINEAR_SRGB));
|
||||||
|
|
||||||
/* Get from OpenColorO config if it has the required roles. */
|
/* Get from OpenColorO config if it has the required roles. */
|
||||||
@ -336,12 +337,15 @@ void OCIOImpl::configGetXYZtoRGB(OCIO_ConstConfigRcPtr *config_, float xyz_to_rg
|
|||||||
|
|
||||||
if (config->hasRole("aces_interchange")) {
|
if (config->hasRole("aces_interchange")) {
|
||||||
/* Standard OpenColorIO role, defined as ACES2065-1. */
|
/* Standard OpenColorIO role, defined as ACES2065-1. */
|
||||||
const float xyz_to_aces[3][3] = {{1.0498110175f, -0.4959030231f, 0.0f},
|
const float xyz_E_to_aces[3][3] = {{1.0498110175f, -0.4959030231f, 0.0f},
|
||||||
{0.0f, 1.3733130458f, 0.0f},
|
{0.0f, 1.3733130458f, 0.0f},
|
||||||
{-0.0000974845f, 0.0982400361f, 0.9912520182f}};
|
{-0.0000974845f, 0.0982400361f, 0.9912520182f}};
|
||||||
|
const float xyz_D65_to_E[3][3] = {
|
||||||
|
{1.0521111f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 0.9184170f}};
|
||||||
|
|
||||||
float aces_to_rgb[3][3];
|
float aces_to_rgb[3][3];
|
||||||
if (to_scene_linear_matrix(config, "aces_interchange", aces_to_rgb)) {
|
if (to_scene_linear_matrix(config, "aces_interchange", aces_to_rgb)) {
|
||||||
mul_m3_m3m3(xyz_to_rgb, aces_to_rgb, xyz_to_aces);
|
mul_m3_series(xyz_to_rgb, aces_to_rgb, xyz_E_to_aces, xyz_D65_to_E);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (config->hasRole("XYZ")) {
|
else if (config->hasRole("XYZ")) {
|
||||||
|
@ -100,6 +100,7 @@ colorspaces:
|
|||||||
from_reference: !<GroupTransform>
|
from_reference: !<GroupTransform>
|
||||||
children:
|
children:
|
||||||
- !<FileTransform> {src: srgb_to_xyz.spimtx, interpolation: linear}
|
- !<FileTransform> {src: srgb_to_xyz.spimtx, interpolation: linear}
|
||||||
|
- !<FileTransform> {src: xyz_D65_to_E.spimtx, interpolation: linear}
|
||||||
- !<FileTransform> {src: xyz_to_aces.spimtx, interpolation: linear}
|
- !<FileTransform> {src: xyz_to_aces.spimtx, interpolation: linear}
|
||||||
|
|
||||||
- !<ColorSpace>
|
- !<ColorSpace>
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
1.0521111 0.0000000 0.0000000 0
|
||||||
|
0.0000000 1.0000000 0.0000000 0
|
||||||
|
0.0000000 0.0000000 0.9184170 0
|
Loading…
Reference in New Issue
Block a user