core/colorpipeline: only reduce the reference luminance enough to get 50% headroom
If the output side / display can already show at least 50% headroom, dimming the image to get more space for the highlights doesn't improve the highlights a lot, definitely not enough to justify making the rest of the image worse for it.
This commit is contained in:
parent
b708a93c1e
commit
587afb3076
2 changed files with 2 additions and 2 deletions
|
@ -343,7 +343,7 @@ ColorTonemapper::ColorTonemapper(double referenceLuminance, double maxInputLumin
|
||||||
m_inputRange = maxInputLuminance / referenceLuminance;
|
m_inputRange = maxInputLuminance / referenceLuminance;
|
||||||
const double outputRange = maxOutputLuminance / referenceLuminance;
|
const double outputRange = maxOutputLuminance / referenceLuminance;
|
||||||
// = how much dynamic range this algorithm adds, by reducing the reference luminance
|
// = how much dynamic range this algorithm adds, by reducing the reference luminance
|
||||||
m_addedRange = std::clamp(m_inputRange / outputRange, 1.0, maxAddedHeadroom);
|
m_addedRange = std::min(m_inputRange, std::clamp(maxAddedHeadroom / outputRange, 1.0, maxAddedHeadroom));
|
||||||
m_outputReferenceLuminance = referenceLuminance / m_addedRange;
|
m_outputReferenceLuminance = referenceLuminance / m_addedRange;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ vec3 doTonemapping(vec3 color) {
|
||||||
// if the reference is too close to the maximum luminance, reduce it to get up to 50% headroom
|
// if the reference is too close to the maximum luminance, reduce it to get up to 50% headroom
|
||||||
float inputRange = maxTonemappingLuminance / destinationReferenceLuminance;
|
float inputRange = maxTonemappingLuminance / destinationReferenceLuminance;
|
||||||
float outputRange = maxDestinationLuminance / destinationReferenceLuminance;
|
float outputRange = maxDestinationLuminance / destinationReferenceLuminance;
|
||||||
float addedRange = min(inputRange / outputRange, 1.5);
|
float addedRange = min(inputRange, clamp(1.5 / outputRange, 1.0, 1.5));
|
||||||
float outputReferenceLuminance = destinationReferenceLuminance / addedRange;
|
float outputReferenceLuminance = destinationReferenceLuminance / addedRange;
|
||||||
|
|
||||||
// keep it linear up to the reference luminance
|
// keep it linear up to the reference luminance
|
||||||
|
|
Loading…
Reference in a new issue