color_helpers: Optimize pq_to_nits + nits_to_pq
Make these take in vector types, saves ~0.4ms
This commit is contained in:
parent
acef4c24ed
commit
580f9e05cb
2 changed files with 13 additions and 11 deletions
|
@ -483,7 +483,7 @@ glm::vec3 calcEOTFToLinear( const glm::vec3 & input, EOTF eotf, const tonemappin
|
||||||
}
|
}
|
||||||
else if ( eotf == EOTF_PQ )
|
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);
|
return glm::vec3(0);
|
||||||
|
@ -502,7 +502,7 @@ glm::vec3 calcLinearToEOTF( const glm::vec3 & input, EOTF eotf, const tonemappin
|
||||||
}
|
}
|
||||||
else if ( eotf == EOTF_PQ )
|
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);
|
return glm::vec3(0);
|
||||||
|
|
|
@ -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;
|
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 c1 = 0.8359375f;
|
||||||
const float c2 = 18.8515625f;
|
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_m1 = 1.0f / 0.1593017578125f;
|
||||||
const float oo_m2 = 1.0f / 78.84375f;
|
const float oo_m2 = 1.0f / 78.84375f;
|
||||||
|
|
||||||
float num = std::max(std::pow(pq, oo_m2) - c1, 0.0f);
|
T num = glm::max(glm::pow(pq, T(oo_m2)) - c1, T(0.0f));
|
||||||
float den = c2 - c3 * std::pow(pq, oo_m2);
|
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 c1 = 0.8359375f;
|
||||||
const float c2 = 18.8515625f;
|
const float c2 = 18.8515625f;
|
||||||
const float c3 = 18.6875f;
|
const float c3 = 18.6875f;
|
||||||
const float m1 = 0.1593017578125f;
|
const float m1 = 0.1593017578125f;
|
||||||
const float m2 = 78.84375f;
|
const float m2 = 78.84375f;
|
||||||
float num = c1 + c2 * std::pow(y, m1);
|
T num = c1 + c2 * glm::pow(y, T(m1));
|
||||||
float den = 1.0 + c3 * std::pow(y, m1);
|
T den = T(1.0) + c3 * glm::pow(y, T(m1));
|
||||||
float n = std::pow(num / den, m2);
|
T n = glm::pow(num / den, T(m2));
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue