Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzymon Ulatowski <szulat>2021-04-12 15:38:20 +0300
committerJeroen Bakker <jeroen@blender.org>2021-04-12 15:42:13 +0300
commit95e010a22eb422a1efa2f7e2bbb6b3ee168ce9e5 (patch)
treed836e368caef334e4984f46a4059888d5b3434a3 /source/blender/compositor/operations
parent53f277a2e6b433c7ad4fa3ad54547842e5672a8d (diff)
Fix T74680: Incorrect mixing in Glare node
The mixing function was designed to give correct results for Mix values of -1, 0, and +1, but the behavior between these points was not linear. This is unavoidable, because the function depends on both Mix and Mix^2 (by multiplying value and mf) so they could not cancel out completely. The new formula simply calculates the weighted sum without trying to invent a smooth function. Value for MixGlareOperation is now passed directly without scaling because it is then easier to use. Note that the previous formula performed max() twice for both input image and the result, now there is just one max() per channel because the glare input can't be negative. Reviewed By: jbakker Differential Revision: https://developer.blender.org/D7138
Diffstat (limited to 'source/blender/compositor/operations')
-rw-r--r--source/blender/compositor/operations/COM_MixOperation.cc27
1 files changed, 13 insertions, 14 deletions
diff --git a/source/blender/compositor/operations/COM_MixOperation.cc b/source/blender/compositor/operations/COM_MixOperation.cc
index 882326a04b1..58fa09fa2a8 100644
--- a/source/blender/compositor/operations/COM_MixOperation.cc
+++ b/source/blender/compositor/operations/COM_MixOperation.cc
@@ -462,27 +462,26 @@ void MixGlareOperation::executePixelSampled(float output[4],
float inputColor1[4];
float inputColor2[4];
float inputValue[4];
- float value;
+ float value, input_weight, glare_weight;
this->m_inputValueOperation->readSampled(inputValue, x, y, sampler);
this->m_inputColor1Operation->readSampled(inputColor1, x, y, sampler);
this->m_inputColor2Operation->readSampled(inputColor2, x, y, sampler);
value = inputValue[0];
- float mf = 2.0f - 2.0f * fabsf(value - 0.5f);
-
- if (inputColor1[0] < 0.0f) {
- inputColor1[0] = 0.0f;
- }
- if (inputColor1[1] < 0.0f) {
- inputColor1[1] = 0.0f;
+ /* Linear interpolation between 3 cases:
+ * value=-1:output=input value=0:output=input+glare value=1:output=glare
+ */
+ if (value < 0.0f) {
+ input_weight = 1.0f;
+ glare_weight = 1.0f + value;
}
- if (inputColor1[2] < 0.0f) {
- inputColor1[2] = 0.0f;
+ else {
+ input_weight = 1.0f - value;
+ glare_weight = 1.0f;
}
-
- output[0] = mf * MAX2(inputColor1[0] + value * (inputColor2[0] - inputColor1[0]), 0.0f);
- output[1] = mf * MAX2(inputColor1[1] + value * (inputColor2[1] - inputColor1[1]), 0.0f);
- output[2] = mf * MAX2(inputColor1[2] + value * (inputColor2[2] - inputColor1[2]), 0.0f);
+ output[0] = input_weight * MAX2(inputColor1[0], 0.0f) + glare_weight * inputColor2[0];
+ output[1] = input_weight * MAX2(inputColor1[1], 0.0f) + glare_weight * inputColor2[1];
+ output[2] = input_weight * MAX2(inputColor1[2], 0.0f) + glare_weight * inputColor2[2];
output[3] = inputColor1[3];
clampIfNeeded(output);