improvement to the DOF node, after blurring the radius buffer (derived from the depth), overlay with the original so pixels in focus are not mixed with out of focus pixels.

This commit is contained in:
Campbell Barton
2012-08-08 16:46:12 +00:00
parent bd3ec60651
commit 2a78c2d304
3 changed files with 41 additions and 1 deletions

View File

@@ -73,11 +73,14 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext
this->getInputSocket(1)->relinkConnections(converter->getInputSocket(0), 1, graph);
graph->addOperation(converter);
FastGaussianBlurValueOperation * blur = new FastGaussianBlurValueOperation();
FastGaussianBlurValueOperation *blur = new FastGaussianBlurValueOperation();
addLink(graph, converter->getOutputSocket(0), blur->getInputSocket(0));
graph->addOperation(blur);
radiusOperation = blur;
converter->setPostBlur(blur);
/* maintain close pixels so far Z values don't bleed into the foreground */
blur->setOverlay(FAST_GAUSS_OVERLAY_MIN);
}
BokehImageOperation *bokeh = new BokehImageOperation();

View File

@@ -277,6 +277,28 @@ void *FastGaussianBlurValueOperation::initializeTileData(rcti *rect)
MemoryBuffer *newBuf = (MemoryBuffer *)this->m_inputprogram->initializeTileData(rect);
MemoryBuffer *copy = newBuf->duplicate();
FastGaussianBlurOperation::IIR_gauss(copy, this->m_sigma, 0, 3);
if (this->m_overlay == FAST_GAUSS_OVERLAY_MIN) {
float *src = newBuf->getBuffer();
float *dst = copy->getBuffer();
for (int i = copy->getWidth() * copy->getHeight() * COM_NUMBER_OF_CHANNELS; i != 0; i--, src++, dst++) {
if (*src < *dst) {
*dst = *src;
}
}
}
else if (this->m_overlay == FAST_GAUSS_OVERLAY_MAX) {
float *src = newBuf->getBuffer();
float *dst = copy->getBuffer();
for (int i = copy->getWidth() * copy->getHeight() * COM_NUMBER_OF_CHANNELS; i != 0; i--, src++, dst++) {
if (*src > *dst) {
*dst = *src;
}
}
}
// newBuf->
this->m_iirgaus = copy;
}
unlockMutex();

View File

@@ -42,11 +42,23 @@ public:
void initExecution();
};
enum {
FAST_GAUSS_OVERLAY_MIN = -1,
FAST_GAUSS_OVERLAY_NONE = 0,
FAST_GAUSS_OVERLAY_MAX = 1
};
class FastGaussianBlurValueOperation : public NodeOperation {
private:
float m_sigma;
MemoryBuffer *m_iirgaus;
SocketReader *m_inputprogram;
/**
* -1: re-mix with darker
* 0: do nothing
* 1 re-mix with lighter */
int m_overlay;
public:
FastGaussianBlurValueOperation();
bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
@@ -56,6 +68,9 @@ public:
void deinitExecution();
void initExecution();
void setSigma(float sigma) { this->m_sigma = sigma; }
/* used for DOF blurring ZBuffer */
void setOverlay(int overlay) { this->m_overlay = overlay; }
};
#endif