color_helpers: Optimize pq_to_nits + nits_to_pq

Make these take in vector types, saves ~0.4ms
This commit is contained in:
Joshua Ashton 2023-05-09 02:52:35 +00:00 committed by Joshie
parent acef4c24ed
commit 580f9e05cb
2 changed files with 13 additions and 11 deletions

View file

@ -483,7 +483,7 @@ glm::vec3 calcEOTFToLinear( const glm::vec3 & input, EOTF eotf, const tonemappin
}
else if ( eotf == EOTF_PQ )
{
return glm::vec3( pq_to_nits( input.r ), pq_to_nits( input.g ), pq_to_nits( input.b ) );
return pq_to_nits( input );
}
return glm::vec3(0);
@ -502,7 +502,7 @@ glm::vec3 calcLinearToEOTF( const glm::vec3 & input, EOTF eotf, const tonemappin
}
else if ( eotf == EOTF_PQ )
{
return glm::vec3( nits_to_pq( input.r ), nits_to_pq( input.g ), nits_to_pq( input.b ) );
return glm::vec3( nits_to_pq(input) );
}
return glm::vec3(0);

View file

@ -45,7 +45,8 @@ inline float linear_to_srgb( float fVal )
return ( fVal < 0.0031308f ) ? fVal * 12.92f : std::pow( fVal, 1.0f / 2.4f ) * 1.055f - 0.055f;
}
inline float pq_to_nits( float pq )
template <typename T>
inline T pq_to_nits( const T& pq )
{
const float c1 = 0.8359375f;
const float c2 = 18.8515625f;
@ -54,23 +55,24 @@ inline float pq_to_nits( float pq )
const float oo_m1 = 1.0f / 0.1593017578125f;
const float oo_m2 = 1.0f / 78.84375f;
float num = std::max(std::pow(pq, oo_m2) - c1, 0.0f);
float den = c2 - c3 * std::pow(pq, oo_m2);
T num = glm::max(glm::pow(pq, T(oo_m2)) - c1, T(0.0f));
T den = c2 - c3 * glm::pow(pq, T(oo_m2));
return 10000.0f * std::pow(num / den, oo_m1);
return glm::pow(num / den, T(oo_m1)) * 10000.0f;
}
inline float nits_to_pq( float nits )
template <typename T>
inline T nits_to_pq( const T& nits )
{
float y = clamp(nits / 10000.0f, 0.0f, 1.0f);
T y = glm::clamp(nits / 10000.0f, T(0.0f), T(1.0f));
const float c1 = 0.8359375f;
const float c2 = 18.8515625f;
const float c3 = 18.6875f;
const float m1 = 0.1593017578125f;
const float m2 = 78.84375f;
float num = c1 + c2 * std::pow(y, m1);
float den = 1.0 + c3 * std::pow(y, m1);
float n = std::pow(num / den, m2);
T num = c1 + c2 * glm::pow(y, T(m1));
T den = T(1.0) + c3 * glm::pow(y, T(m1));
T n = glm::pow(num / den, T(m2));
return n;
}