forked from bartvdbraak/blender
Fix #35327: compositing Z combine node was not giving the same result as previous
versions when the Z values were the same, Also was inconsistent between full sample on/off.
This commit is contained in:
parent
4e5541a9a6
commit
fa4ef0828e
@ -71,9 +71,18 @@ void ZCombineNode::convertToOperations(ExecutionSystem *system, CompositorContex
|
||||
else {
|
||||
// not full anti alias, use masking for Z combine. be aware it uses anti aliasing.
|
||||
// step 1 create mask
|
||||
MathGreaterThanOperation *maskoperation = new MathGreaterThanOperation();
|
||||
this->getInputSocket(1)->relinkConnections(maskoperation->getInputSocket(0), 1, system);
|
||||
this->getInputSocket(3)->relinkConnections(maskoperation->getInputSocket(1), 3, system);
|
||||
NodeOperation *maskoperation;
|
||||
|
||||
if (this->getbNode()->custom1) {
|
||||
maskoperation = new MathGreaterThanOperation();
|
||||
this->getInputSocket(1)->relinkConnections(maskoperation->getInputSocket(0), 3, system);
|
||||
this->getInputSocket(3)->relinkConnections(maskoperation->getInputSocket(1), 1, system);
|
||||
}
|
||||
else {
|
||||
maskoperation = new MathLessThanOperation();
|
||||
this->getInputSocket(1)->relinkConnections(maskoperation->getInputSocket(0), 1, system);
|
||||
this->getInputSocket(3)->relinkConnections(maskoperation->getInputSocket(1), 3, system);
|
||||
}
|
||||
|
||||
// step 2 anti alias mask bit of an expensive operation, but does the trick
|
||||
AntiAliasOperation *antialiasoperation = new AntiAliasOperation();
|
||||
|
@ -123,13 +123,7 @@ void ZCombineMaskOperation::executePixel(float output[4], float x, float y, Pixe
|
||||
this->m_image1Reader->read(color1, x, y, sampler);
|
||||
this->m_image2Reader->read(color2, x, y, sampler);
|
||||
|
||||
float fac = mask[0];
|
||||
// multiply mask with alpha, if mask == 0 color1, else color2 make sure
|
||||
float mfac = 1.0f - fac;
|
||||
output[0] = color1[0] * mfac + color2[0] * fac;
|
||||
output[1] = color1[1] * mfac + color2[1] * fac;
|
||||
output[2] = color1[2] * mfac + color2[2] * fac;
|
||||
output[3] = max(color1[3], color2[3]);
|
||||
interp_v4_v4v4(output, color1, color2, 1.0f - mask[0]);
|
||||
}
|
||||
|
||||
void ZCombineMaskAlphaOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)
|
||||
@ -142,15 +136,12 @@ void ZCombineMaskAlphaOperation::executePixel(float output[4], float x, float y,
|
||||
this->m_image1Reader->read(color1, x, y, sampler);
|
||||
this->m_image2Reader->read(color2, x, y, sampler);
|
||||
|
||||
float fac = mask[0];
|
||||
// multiply mask with alpha, if mask == 0 color1, else color2 make sure
|
||||
float fac = (1.0f - mask[0])*(1.0f - color1[3]) + mask[0]*color2[3];
|
||||
float mfac = 1.0f - fac;
|
||||
float alpha = color1[3] * mfac + color2[3] * fac;
|
||||
float facalpha = fac * alpha;
|
||||
mfac = 1.0f - facalpha;
|
||||
output[0] = color1[0] * mfac + color2[0] * facalpha;
|
||||
output[1] = color1[1] * mfac + color2[1] * facalpha;
|
||||
output[2] = color1[2] * mfac + color2[2] * facalpha;
|
||||
|
||||
output[0] = color1[0] * mfac + color2[0] * fac;
|
||||
output[1] = color1[1] * mfac + color2[1] * fac;
|
||||
output[2] = color1[2] * mfac + color2[2] * fac;
|
||||
output[3] = max(color1[3], color2[3]);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user