Hi, we are working on an implementation of ACES transforms in an application and would like to separate the tonescaling back into two transform steps like it used to be, but use the ACES 1.1 consolidated solution offered by the ssts curve function if possible and recommended. We noticed that this did not work simply by calling ssts() twice with RRT params, then ODT params. Without a full understanding of the curve and coefficient making algorithm it is pretty hard. We took a stab at a new init_TsParams() function called init_TargetTsParams() and run the min,mid, and max through ssts using the RRT params similar to how the SegmentedSplineParams_c9 structures are initialized in the older RRT and ODT separate transform way. The image doesn’t look quite right, is darker and more saturated, so I know I’ve not quite got it right. Any help would be appreciated.
Thanks,
Jim DiNunzio
TsParams init_TargetTsParams(
float minLum,
float maxLum,
float expShift
)
{
TsPoint MIN_PT = { ssts(lookup_ACESmin(minLum), HDR_RRT_PARAMS), minLum, 0.0};
TsPoint MID_PT = { ssts(0.18, HDR_RRT_PARAMS), 4.8, 1.55};
TsPoint MAX_PT = { ssts(lookup_ACESmax(maxLum), HDR_RRT_PARAMS), maxLum, 0.0};
float cLow[5];
init_coefsLow( MIN_PT, MID_PT, cLow);
float cHigh[5];
init_coefsHigh( MID_PT, MAX_PT, cHigh);
MIN_PT.x = shift(ssts(lookup_ACESmin(minLum), HDR_RRT_PARAMS),expShift);
MID_PT.x = shift(ssts(0.18, HDR_RRT_PARAMS), expShift);
MAX_PT.x = shift(ssts(lookup_ACESmax(maxLum), HDR_RRT_PARAMS),expShift);
TsParams P = {
{MIN_PT.x, MIN_PT.y, MIN_PT.slope},
{MID_PT.x, MID_PT.y, MID_PT.slope},
{MAX_PT.x, MAX_PT.y, MAX_PT.slope},
{cLow[0], cLow[1], cLow[2], cLow[3], cLow[4], cLow[4]},
{cHigh[0], cHigh[1], cHigh[2], cHigh[3], cHigh[4], cHigh[4]}
};
return P;
}
// Code fragment to create new params for a target of 1000 nits
float mYMin = 0.0001;
float mYMid = 10.0;
float mYMax = 1000.0;
float expShift = log2f(inv_ssts(mYMid, HDR_RRT_PARAMS)) - log2f(0.18);
TsParams paramsFor1000NitTarget = init_TargetTsParams(mYMin, mYMax, expShift);
…
Then in the kernel do this
// --- Initialize a 3-element vector with input variables (OCES) --- //
V3f oces = {rIn, gIn, bIn};
// OCES to RGB rendering space
V3f rgbPre = mult_f3_f44( oces, AP0_2_AP1_MAT);
// Apply the tonescale independently in rendering-space RGB
V3f rgbPost = ssts_f3( rgbPre, params);
rOut = rgbPost[0];
gOut = rgbPost[1];
bOut = rgbPost[2];