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:
authorJeroen Bakker <j.bakker@atmind.nl>2012-07-09 19:21:43 +0400
committerJeroen Bakker <j.bakker@atmind.nl>2012-07-09 19:21:43 +0400
commitbfe776cd1d1e9036bd389469d74984d6f5ce81fb (patch)
tree1f8b1b2975fb78b01d09672df8b258629faafe8a /source/blender/compositor
parent0dafa97ea3f6d9662299579e5be1875cd28baaae (diff)
removed depth aware defocus
add blur to radius buffer
Diffstat (limited to 'source/blender/compositor')
-rw-r--r--source/blender/compositor/nodes/COM_DefocusNode.cpp12
-rw-r--r--source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp7
-rw-r--r--source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h6
-rw-r--r--source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp63
-rw-r--r--source/blender/compositor/operations/COM_FastGaussianBlurOperation.h16
-rw-r--r--source/blender/compositor/operations/COM_OpenCLKernels.cl30
-rw-r--r--source/blender/compositor/operations/COM_OpenCLKernels.cl.h30
-rw-r--r--source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp68
-rw-r--r--source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h1
9 files changed, 148 insertions, 85 deletions
diff --git a/source/blender/compositor/nodes/COM_DefocusNode.cpp b/source/blender/compositor/nodes/COM_DefocusNode.cpp
index 4c6b3ad137b..05bf907af5a 100644
--- a/source/blender/compositor/nodes/COM_DefocusNode.cpp
+++ b/source/blender/compositor/nodes/COM_DefocusNode.cpp
@@ -32,6 +32,7 @@
#include "COM_MathBaseOperation.h"
#include "COM_SetValueOperation.h"
#include "COM_GammaCorrectOperation.h"
+#include "COM_FastGaussianBlurOperation.h"
DefocusNode::DefocusNode(bNode *editorNode) : Node(editorNode)
{
@@ -46,7 +47,6 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext
NodeDefocus *data = (NodeDefocus *)node->storage;
NodeOperation *radiusOperation;
- OutputSocket * depthOperation;
if (data->no_zbuf) {
MathMultiplyOperation *multiply = new MathMultiplyOperation();
SetValueOperation *multiplier = new SetValueOperation();
@@ -64,7 +64,6 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext
graph->addOperation(maxRadius);
graph->addOperation(minimize);
radiusOperation = minimize;
- depthOperation = minimize->getOutputSocket(0);
}
else {
ConvertDepthToRadiusOperation *converter = new ConvertDepthToRadiusOperation();
@@ -73,8 +72,12 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext
converter->setMaxRadius(data->maxblur);
this->getInputSocket(1)->relinkConnections(converter->getInputSocket(0), 1, graph);
graph->addOperation(converter);
- radiusOperation = converter;
- depthOperation = converter->getInputSocket(0)->getConnection()->getFromSocket();
+
+ FastGaussianBlurValueOperation * blur = new FastGaussianBlurValueOperation();
+ addLink(graph, converter->getOutputSocket(0), blur->getInputSocket(0));
+ graph->addOperation(blur);
+ radiusOperation = blur;
+ converter->setPostBlur(blur);
}
BokehImageOperation *bokeh = new BokehImageOperation();
@@ -112,7 +115,6 @@ void DefocusNode::convertToOperations(ExecutionSystem *graph, CompositorContext
operation->setThreshold(data->bthresh);
addLink(graph, bokeh->getOutputSocket(), operation->getInputSocket(1));
addLink(graph, radiusOperation->getOutputSocket(), operation->getInputSocket(2));
- addLink(graph, depthOperation, operation->getInputSocket(3));
#ifdef COM_DEFOCUS_SEARCH
addLink(graph, search->getOutputSocket(), operation->getInputSocket(4));
#endif
diff --git a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp
index 91b68a90126..b4319d25d13 100644
--- a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp
+++ b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.cpp
@@ -32,6 +32,7 @@ ConvertDepthToRadiusOperation::ConvertDepthToRadiusOperation() : NodeOperation()
this->m_fStop = 128.0f;
this->m_cameraObject = NULL;
this->m_maxRadius = 32.0f;
+ this->m_blurPostOperation = NULL;
}
float ConvertDepthToRadiusOperation::determineFocalDistance()
@@ -68,6 +69,10 @@ void ConvertDepthToRadiusOperation::initExecution()
this->m_aperture = 0.5f * (this->m_cam_lens / (this->m_aspect * 32.0f)) / this->m_fStop;
float minsz = MIN2(getWidth(), getHeight());
this->m_dof_sp = (float)minsz / (16.f / this->m_cam_lens); // <- == aspect * MIN2(img->x, img->y) / tan(0.5f * fov);
+
+ if (this->m_blurPostOperation) {
+ m_blurPostOperation->setSigma(m_aperture*128.0f);
+ }
}
void ConvertDepthToRadiusOperation::executePixel(float *outputValue, float x, float y, PixelSampler sampler, MemoryBuffer *inputBuffers[])
@@ -88,7 +93,7 @@ void ConvertDepthToRadiusOperation::executePixel(float *outputValue, float x, fl
#endif
radius = 0.5f * fabsf(this->m_aperture * (this->m_dof_sp * (this->m_inverseFocalDistance - iZ) - 1.f));
// 'bug' #6615, limit minimum radius to 1 pixel, not really a solution, but somewhat mitigates the problem
- if (radius < 0.5f) radius = 0.5f;
+ if (radius < 0.0f) radius = 0.0f;
if (radius > this->m_maxRadius) {
radius = this->m_maxRadius;
}
diff --git a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h
index 415befea168..f0e905db9c2 100644
--- a/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h
+++ b/source/blender/compositor/operations/COM_ConvertDepthToRadiusOperation.h
@@ -24,7 +24,7 @@
#define _COM_ConvertDepthToRadiusOperation_h
#include "COM_NodeOperation.h"
#include "DNA_object_types.h"
-
+#include "COM_FastGaussianBlurOperation.h"
/**
* this program converts an input color to an output value.
* it assumes we are in sRGB color space.
@@ -43,6 +43,8 @@ private:
float m_cam_lens;
float m_dof_sp;
Object *m_cameraObject;
+
+ FastGaussianBlurValueOperation *m_blurPostOperation;
public:
/**
* Default constructor
@@ -68,5 +70,7 @@ public:
void setMaxRadius(float maxRadius) { this->m_maxRadius = maxRadius; }
void setCameraObject(Object *camera) { this->m_cameraObject = camera; }
float determineFocalDistance();
+ void setPostBlur(FastGaussianBlurValueOperation *operation) {this->m_blurPostOperation = operation;}
+
};
#endif
diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp
index 8f0ebd9b8d2..6d9c980ea58 100644
--- a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp
@@ -220,3 +220,66 @@ void FastGaussianBlurOperation::IIR_gauss(MemoryBuffer *src, float sigma, unsign
#undef YVV
}
+
+
+///
+FastGaussianBlurValueOperation::FastGaussianBlurValueOperation() : NodeOperation()
+{
+ this->addInputSocket(COM_DT_VALUE);
+ this->addOutputSocket(COM_DT_VALUE);
+ this->m_iirgaus = NULL;
+ this->m_inputprogram = NULL;
+ this->m_sigma = 1.0f;
+ setComplex(true);
+}
+
+void FastGaussianBlurValueOperation::executePixel(float *color, int x, int y, MemoryBuffer *inputBuffers[], void *data)
+{
+ MemoryBuffer *newData = (MemoryBuffer *)data;
+ newData->read(color, x, y);
+}
+
+bool FastGaussianBlurValueOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)
+{
+ rcti newInput;
+
+ if (this->m_iirgaus) {
+ return false;
+ }
+ else {
+ newInput.xmin = 0;
+ newInput.ymin = 0;
+ newInput.xmax = this->getWidth();
+ newInput.ymax = this->getHeight();
+ }
+ return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
+}
+
+void FastGaussianBlurValueOperation::initExecution()
+{
+ this->m_inputprogram = getInputSocketReader(0);
+ initMutex();
+}
+
+void FastGaussianBlurValueOperation::deinitExecution()
+{
+ if (this->m_iirgaus) {
+ delete this->m_iirgaus;
+ this->m_iirgaus = NULL;
+ }
+ deinitMutex();
+}
+
+void *FastGaussianBlurValueOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
+{
+ lockMutex();
+ if (!this->m_iirgaus) {
+ MemoryBuffer *newBuf = (MemoryBuffer *)this->m_inputprogram->initializeTileData(rect, memoryBuffers);
+ MemoryBuffer *copy = newBuf->duplicate();
+ FastGaussianBlurOperation::IIR_gauss(copy, this->m_sigma, 0, 3);
+ this->m_iirgaus = copy;
+ }
+ unlockMutex();
+ return this->m_iirgaus;
+}
+
diff --git a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h
index 1e303b23869..5f76490473f 100644
--- a/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h
+++ b/source/blender/compositor/operations/COM_FastGaussianBlurOperation.h
@@ -40,7 +40,23 @@ public:
void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers);
void deinitExecution();
void initExecution();
+};
+
+class FastGaussianBlurValueOperation : public NodeOperation {
+private:
+ float m_sigma;
+ MemoryBuffer *m_iirgaus;
+ SocketReader *m_inputprogram;
+public:
+ FastGaussianBlurValueOperation();
+ bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output);
+ void executePixel(float *color, int x, int y, MemoryBuffer * inputBuffers[], void *data);
+ void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers);
+ void deinitExecution();
+ void initExecution();
+ void setSigma(float sigma) { this->m_sigma = sigma; }
};
+
#endif
diff --git a/source/blender/compositor/operations/COM_OpenCLKernels.cl b/source/blender/compositor/operations/COM_OpenCLKernels.cl
index ce197915360..1f3b28f15d3 100644
--- a/source/blender/compositor/operations/COM_OpenCLKernels.cl
+++ b/source/blender/compositor/operations/COM_OpenCLKernels.cl
@@ -53,7 +53,7 @@ __kernel void bokehBlurKernel(__read_only image2d_t boundingBox, __read_only ima
//KERNEL --- DEFOCUS /VARIABLESIZEBOKEHBLUR ---
__kernel void defocusKernel(__read_only image2d_t inputImage, __read_only image2d_t bokehImage,
- __read_only image2d_t inputDepth, __read_only image2d_t inputSize,
+ __read_only image2d_t inputSize,
__write_only image2d_t output, int2 offsetInput, int2 offsetOutput,
int step, int maxBlur, float threshold, int2 dimension, int2 offset)
{
@@ -65,7 +65,6 @@ __kernel void defocusKernel(__read_only image2d_t inputImage, __read_only image2
float4 readColor;
float4 bokeh;
float tempSize;
- float tempDepth;
float4 multiplier_accum = {1.0f, 1.0f, 1.0f, 1.0f};
float4 color_accum;
@@ -77,7 +76,6 @@ __kernel void defocusKernel(__read_only image2d_t inputImage, __read_only image2
{
int2 inputCoordinate = realCoordinate - offsetInput;
float size = read_imagef(inputSize, SAMPLER_NEAREST, inputCoordinate).s0;
- float depth = read_imagef(inputDepth, SAMPLER_NEAREST, inputCoordinate).s0 + threshold;
color_accum = read_imagef(inputImage, SAMPLER_NEAREST, inputCoordinate);
for (int ny = miny; ny < maxy; ny += step) {
@@ -85,21 +83,17 @@ __kernel void defocusKernel(__read_only image2d_t inputImage, __read_only image2
if (nx >= 0 && nx < dimension.s0 && ny >= 0 && ny < dimension.s1) {
inputCoordinate.s0 = nx - offsetInput.s0;
inputCoordinate.s1 = ny - offsetInput.s1;
- tempDepth = read_imagef(inputDepth, SAMPLER_NEAREST, inputCoordinate).s0;
- if (tempDepth < depth) {
- tempSize = read_imagef(inputSize, SAMPLER_NEAREST, inputCoordinate).s0;
-
- if ((size > threshold && tempSize > threshold) || tempSize <= threshold) {
- float dx = nx - realCoordinate.s0;
- float dy = ny - realCoordinate.s1;
- if (dx != 0 || dy != 0) {
- if (tempSize >= fabs(dx) && tempSize >= fabs(dy)) {
- float2 uv = { 256.0f + dx * 256.0f / tempSize, 256.0f + dy * 256.0f / tempSize};
- bokeh = read_imagef(bokehImage, SAMPLER_NEAREST, uv);
- readColor = read_imagef(inputImage, SAMPLER_NEAREST, inputCoordinate);
- color_accum += bokeh*readColor;
- multiplier_accum += bokeh;
- }
+ tempSize = read_imagef(inputSize, SAMPLER_NEAREST, inputCoordinate).s0;
+ if (size > threshold && tempSize > threshold) {
+ float dx = nx - realCoordinate.s0;
+ float dy = ny - realCoordinate.s1;
+ if (dx != 0 || dy != 0) {
+ if (tempSize >= fabs(dx) && tempSize >= fabs(dy)) {
+ float2 uv = { 256.0f + dx * 256.0f / tempSize, 256.0f + dy * 256.0f / tempSize};
+ bokeh = read_imagef(bokehImage, SAMPLER_NEAREST, uv);
+ readColor = read_imagef(inputImage, SAMPLER_NEAREST, inputCoordinate);
+ color_accum += bokeh*readColor;
+ multiplier_accum += bokeh;
}
}
}
diff --git a/source/blender/compositor/operations/COM_OpenCLKernels.cl.h b/source/blender/compositor/operations/COM_OpenCLKernels.cl.h
index ca66ab85802..1c223a527ca 100644
--- a/source/blender/compositor/operations/COM_OpenCLKernels.cl.h
+++ b/source/blender/compositor/operations/COM_OpenCLKernels.cl.h
@@ -55,7 +55,7 @@ const char * clkernelstoh_COM_OpenCLKernels_cl = "/// This file contains all ope
"\n" \
"//KERNEL --- DEFOCUS /VARIABLESIZEBOKEHBLUR ---\n" \
"__kernel void defocusKernel(__read_only image2d_t inputImage, __read_only image2d_t bokehImage,\n" \
-" __read_only image2d_t inputDepth, __read_only image2d_t inputSize,\n" \
+" __read_only image2d_t inputSize,\n" \
" __write_only image2d_t output, int2 offsetInput, int2 offsetOutput,\n" \
" int step, int maxBlur, float threshold, int2 dimension, int2 offset)\n" \
"{\n" \
@@ -67,7 +67,6 @@ const char * clkernelstoh_COM_OpenCLKernels_cl = "/// This file contains all ope
" float4 readColor;\n" \
" float4 bokeh;\n" \
" float tempSize;\n" \
-" float tempDepth;\n" \
" float4 multiplier_accum = {1.0f, 1.0f, 1.0f, 1.0f};\n" \
" float4 color_accum;\n" \
"\n" \
@@ -79,7 +78,6 @@ const char * clkernelstoh_COM_OpenCLKernels_cl = "/// This file contains all ope
" {\n" \
" int2 inputCoordinate = realCoordinate - offsetInput;\n" \
" float size = read_imagef(inputSize, SAMPLER_NEAREST, inputCoordinate).s0;\n" \
-" float depth = read_imagef(inputDepth, SAMPLER_NEAREST, inputCoordinate).s0 + threshold;\n" \
" color_accum = read_imagef(inputImage, SAMPLER_NEAREST, inputCoordinate);\n" \
"\n" \
" for (int ny = miny; ny < maxy; ny += step) {\n" \
@@ -87,21 +85,17 @@ const char * clkernelstoh_COM_OpenCLKernels_cl = "/// This file contains all ope
" if (nx >= 0 && nx < dimension.s0 && ny >= 0 && ny < dimension.s1) {\n" \
" inputCoordinate.s0 = nx - offsetInput.s0;\n" \
" inputCoordinate.s1 = ny - offsetInput.s1;\n" \
-" tempDepth = read_imagef(inputDepth, SAMPLER_NEAREST, inputCoordinate).s0;\n" \
-" if (tempDepth < depth) {\n" \
-" tempSize = read_imagef(inputSize, SAMPLER_NEAREST, inputCoordinate).s0;\n" \
-"\n" \
-" if ((size > threshold && tempSize > threshold) || tempSize <= threshold) {\n" \
-" float dx = nx - realCoordinate.s0;\n" \
-" float dy = ny - realCoordinate.s1;\n" \
-" if (dx != 0 || dy != 0) {\n" \
-" if (tempSize >= fabs(dx) && tempSize >= fabs(dy)) {\n" \
-" float2 uv = { 256.0f + dx * 256.0f / tempSize, 256.0f + dy * 256.0f / tempSize};\n" \
-" bokeh = read_imagef(bokehImage, SAMPLER_NEAREST, uv);\n" \
-" readColor = read_imagef(inputImage, SAMPLER_NEAREST, inputCoordinate);\n" \
-" color_accum += bokeh*readColor;\n" \
-" multiplier_accum += bokeh;\n" \
-" }\n" \
+" tempSize = read_imagef(inputSize, SAMPLER_NEAREST, inputCoordinate).s0;\n" \
+" if (size > threshold && tempSize > threshold) {\n" \
+" float dx = nx - realCoordinate.s0;\n" \
+" float dy = ny - realCoordinate.s1;\n" \
+" if (dx != 0 || dy != 0) {\n" \
+" if (tempSize >= fabs(dx) && tempSize >= fabs(dy)) {\n" \
+" float2 uv = { 256.0f + dx * 256.0f / tempSize, 256.0f + dy * 256.0f / tempSize};\n" \
+" bokeh = read_imagef(bokehImage, SAMPLER_NEAREST, uv);\n" \
+" readColor = read_imagef(inputImage, SAMPLER_NEAREST, inputCoordinate);\n" \
+" color_accum += bokeh*readColor;\n" \
+" multiplier_accum += bokeh;\n" \
" }\n" \
" }\n" \
" }\n" \
diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
index 90fd0f04ea4..61538fde258 100644
--- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
@@ -33,7 +33,6 @@ VariableSizeBokehBlurOperation::VariableSizeBokehBlurOperation() : NodeOperation
this->addInputSocket(COM_DT_COLOR);
this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); // do not resize the bokeh image.
this->addInputSocket(COM_DT_VALUE); // radius
- this->addInputSocket(COM_DT_VALUE); // depth
#ifdef COM_DEFOCUS_SEARCH
this->addInputSocket(COM_DT_COLOR, COM_SC_NO_RESIZE); // inverse search radius optimization structure.
#endif
@@ -44,7 +43,6 @@ VariableSizeBokehBlurOperation::VariableSizeBokehBlurOperation() : NodeOperation
this->m_inputProgram = NULL;
this->m_inputBokehProgram = NULL;
this->m_inputSizeProgram = NULL;
- this->m_inputDepthProgram = NULL;
this->m_maxBlur = 32.0f;
this->m_threshold = 1.0f;
#ifdef COM_DEFOCUS_SEARCH
@@ -58,7 +56,6 @@ void VariableSizeBokehBlurOperation::initExecution()
this->m_inputProgram = getInputSocketReader(0);
this->m_inputBokehProgram = getInputSocketReader(1);
this->m_inputSizeProgram = getInputSocketReader(2);
- this->m_inputDepthProgram = getInputSocketReader(3);
#ifdef COM_DEFOCUS_SEARCH
this->m_inputSearchProgram = getInputSocketReader(4);
#endif
@@ -70,7 +67,6 @@ void VariableSizeBokehBlurOperation::executePixel(float *color, int x, int y, Me
float readColor[4];
float bokeh[4];
float tempSize[4];
- float tempDepth[4];
float multiplier_accum[4] = {0.0f, 0.0f, 0.0f, 0.0f};
float color_accum[4] = {0.0f, 0.0f, 0.0f, 0.0f};
@@ -89,43 +85,39 @@ void VariableSizeBokehBlurOperation::executePixel(float *color, int x, int y, Me
#endif
{
this->m_inputSizeProgram->read(tempSize, x, y, COM_PS_NEAREST, inputBuffers);
- this->m_inputDepthProgram->read(tempDepth, x, y, COM_PS_NEAREST, inputBuffers);
this->m_inputProgram->read(readColor, x, y, COM_PS_NEAREST, inputBuffers);
add_v4_v4(color_accum, readColor);
add_v4_fl(multiplier_accum, 1.0f);
float sizeCenter = tempSize[0];
- float centerDepth = tempDepth[0] + this->m_threshold;
for (int ny = miny; ny < maxy; ny += QualityStepHelper::getStep()) {
for (int nx = minx; nx < maxx; nx += QualityStepHelper::getStep()) {
if (nx >= 0 && nx < this->getWidth() && ny >= 0 && ny < getHeight()) {
- this->m_inputDepthProgram->read(tempDepth, nx, ny, COM_PS_NEAREST, inputBuffers);
- if (tempDepth[0] < centerDepth) {
- this->m_inputSizeProgram->read(tempSize, nx, ny, COM_PS_NEAREST, inputBuffers);
- float size = tempSize[0];
- if ((sizeCenter > this->m_threshold && size > this->m_threshold) || size <= this->m_threshold) {
- float dx = nx - x;
- float dy = ny - y;
- if (nx == x && ny == y) {
- }
- else if (size >= fabsf(dx) && size >= fabsf(dy)) {
- float u = 256 + dx * 256 / size;
- float v = 256 + dy * 256 / size;
- this->m_inputBokehProgram->read(bokeh, u, v, COM_PS_NEAREST, inputBuffers);
- this->m_inputProgram->read(readColor, nx, ny, COM_PS_NEAREST, inputBuffers);
- madd_v4_v4v4(color_accum, bokeh, readColor);
- add_v4_v4(multiplier_accum, bokeh);
- }
+ this->m_inputSizeProgram->read(tempSize, nx, ny, COM_PS_NEAREST, inputBuffers);
+ float size = tempSize[0];
+ float fsize = fabsf(size);
+ if (sizeCenter > this->m_threshold && size > this->m_threshold) {
+ float dx = nx - x;
+ float dy = ny - y;
+ if (nx == x && ny == y) {
+ }
+ else if (fsize > fabsf(dx) && fsize > fabsf(dy)) {
+ float u = (256 + (dx/size) * 256);
+ float v = (256 + (dy/size) * 256);
+ this->m_inputBokehProgram->read(bokeh, u, v, COM_PS_NEAREST, inputBuffers);
+ this->m_inputProgram->read(readColor, nx, ny, COM_PS_NEAREST, inputBuffers);
+ madd_v4_v4v4(color_accum, bokeh, readColor);
+ add_v4_v4(multiplier_accum, bokeh);
}
}
}
}
}
- color[0] = color_accum[0] * (1.0f / multiplier_accum[0]);
- color[1] = color_accum[1] * (1.0f / multiplier_accum[1]);
- color[2] = color_accum[2] * (1.0f / multiplier_accum[2]);
- color[3] = color_accum[3] * (1.0f / multiplier_accum[3]);
+ color[0] = color_accum[0] / multiplier_accum[0];
+ color[1] = color_accum[1] / multiplier_accum[1];
+ color[2] = color_accum[2] / multiplier_accum[2];
+ color[3] = color_accum[3] / multiplier_accum[3];
}
}
@@ -143,16 +135,15 @@ void VariableSizeBokehBlurOperation::executeOpenCL(OpenCLDevice* device,
device->COM_clAttachMemoryBufferToKernelParameter(defocusKernel, 0, -1, clMemToCleanUp, inputMemoryBuffers, this->m_inputProgram);
device->COM_clAttachMemoryBufferToKernelParameter(defocusKernel, 1, -1, clMemToCleanUp, inputMemoryBuffers, this->m_inputBokehProgram);
- device->COM_clAttachMemoryBufferToKernelParameter(defocusKernel, 2, 5, clMemToCleanUp, inputMemoryBuffers, this->m_inputDepthProgram);
- device->COM_clAttachMemoryBufferToKernelParameter(defocusKernel, 3, -1, clMemToCleanUp, inputMemoryBuffers, this->m_inputSizeProgram);
- device->COM_clAttachOutputMemoryBufferToKernelParameter(defocusKernel, 4, clOutputBuffer);
- device->COM_clAttachMemoryBufferOffsetToKernelParameter(defocusKernel, 6, outputMemoryBuffer);
- clSetKernelArg(defocusKernel, 7, sizeof(cl_int), &step);
- clSetKernelArg(defocusKernel, 8, sizeof(cl_int), &maxBlur);
- clSetKernelArg(defocusKernel, 9, sizeof(cl_float), &threshold);
- device->COM_clAttachSizeToKernelParameter(defocusKernel, 10, this);
+ device->COM_clAttachMemoryBufferToKernelParameter(defocusKernel, 2, 4, clMemToCleanUp, inputMemoryBuffers, this->m_inputSizeProgram);
+ device->COM_clAttachOutputMemoryBufferToKernelParameter(defocusKernel, 3, clOutputBuffer);
+ device->COM_clAttachMemoryBufferOffsetToKernelParameter(defocusKernel, 5, outputMemoryBuffer);
+ clSetKernelArg(defocusKernel, 6, sizeof(cl_int), &step);
+ clSetKernelArg(defocusKernel, 7, sizeof(cl_int), &maxBlur);
+ clSetKernelArg(defocusKernel, 8, sizeof(cl_float), &threshold);
+ device->COM_clAttachSizeToKernelParameter(defocusKernel, 9, this);
- device->COM_clEnqueueRange(defocusKernel, outputMemoryBuffer, 11, this);
+ device->COM_clEnqueueRange(defocusKernel, outputMemoryBuffer, 10, this);
}
void VariableSizeBokehBlurOperation::deinitExecution()
@@ -160,7 +151,6 @@ void VariableSizeBokehBlurOperation::deinitExecution()
this->m_inputProgram = NULL;
this->m_inputBokehProgram = NULL;
this->m_inputSizeProgram = NULL;
- this->m_inputDepthProgram = NULL;
#ifdef COM_DEFOCUS_SEARCH
this->m_inputSearchProgram = NULL;
#endif
@@ -189,10 +179,6 @@ bool VariableSizeBokehBlurOperation::determineDependingAreaOfInterest(rcti *inpu
if (operation->determineDependingAreaOfInterest(&bokehInput, readOperation, output) ) {
return true;
}
- operation = getInputOperation(3);
- if (operation->determineDependingAreaOfInterest(&newInput, readOperation, output) ) {
- return true;
- }
#ifdef COM_DEFOCUS_SEARCH
rcti searchInput;
searchInput.xmax = (input->xmax / InverseSearchRadiusOperation::DIVIDER) + 1;
diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h
index 8e5589fafec..6c9196c3eab 100644
--- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h
+++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.h
@@ -33,7 +33,6 @@ private:
SocketReader *m_inputProgram;
SocketReader *m_inputBokehProgram;
SocketReader *m_inputSizeProgram;
- SocketReader *m_inputDepthProgram;
#ifdef COM_DEFOCUS_SEARCH
SocketReader *inputSearchProgram;
#endif