From 5019cd179f39ee8f80829bb0d6895e494a66ffa2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 8 Aug 2012 18:10:13 +0000 Subject: add threshold blending to opencl too. --- .../blender/compositor/operations/COM_OpenCLKernels.cl | 17 ++++++++++++++--- .../compositor/operations/COM_OpenCLKernels.cl.h | 17 ++++++++++++++--- .../operations/COM_VariableSizeBokehBlurOperation.cpp | 8 ++++---- 3 files changed, 32 insertions(+), 10 deletions(-) (limited to 'source') diff --git a/source/blender/compositor/operations/COM_OpenCLKernels.cl b/source/blender/compositor/operations/COM_OpenCLKernels.cl index 441f6af79a5..9a89fe21414 100644 --- a/source/blender/compositor/operations/COM_OpenCLKernels.cl +++ b/source/blender/compositor/operations/COM_OpenCLKernels.cl @@ -101,6 +101,7 @@ __kernel void defocusKernel(__read_only image2d_t inputImage, __read_only image2 int2 inputCoordinate = realCoordinate - offsetInput; float size_center = read_imagef(inputSize, SAMPLER_NEAREST, inputCoordinate).s0; color_accum = read_imagef(inputImage, SAMPLER_NEAREST, inputCoordinate); + readColor = color_accum; if (size_center > threshold) { for (int ny = miny; ny < maxy; ny += step) { @@ -125,10 +126,20 @@ __kernel void defocusKernel(__read_only image2d_t inputImage, __read_only image2 } } } - } - color = color_accum * (1.0f / multiplier_accum); - write_imagef(output, coords, color); + color = color_accum * (1.0f / multiplier_accum); + + /* blend in out values over the threshold, otherwise we get sharp, ugly transitions */ + if ((size_center > threshold) && + (size_center < threshold * 2.0f)) + { + /* factor from 0-1 */ + float fac = (size_center - threshold) / threshold; + color = (readColor * (1.0f - fac)) + (color * fac); + } + + write_imagef(output, coords, color); + } } diff --git a/source/blender/compositor/operations/COM_OpenCLKernels.cl.h b/source/blender/compositor/operations/COM_OpenCLKernels.cl.h index e7de861710f..e72ed5bf755 100644 --- a/source/blender/compositor/operations/COM_OpenCLKernels.cl.h +++ b/source/blender/compositor/operations/COM_OpenCLKernels.cl.h @@ -103,6 +103,7 @@ const char * clkernelstoh_COM_OpenCLKernels_cl = "/*\n" \ " int2 inputCoordinate = realCoordinate - offsetInput;\n" \ " float size_center = read_imagef(inputSize, SAMPLER_NEAREST, inputCoordinate).s0;\n" \ " color_accum = read_imagef(inputImage, SAMPLER_NEAREST, inputCoordinate);\n" \ +" readColor = color_accum;\n" \ "\n" \ " if (size_center > threshold) {\n" \ " for (int ny = miny; ny < maxy; ny += step) {\n" \ @@ -127,10 +128,20 @@ const char * clkernelstoh_COM_OpenCLKernels_cl = "/*\n" \ " }\n" \ " }\n" \ " }\n" \ -" }\n" \ "\n" \ -" color = color_accum * (1.0f / multiplier_accum);\n" \ -" write_imagef(output, coords, color);\n" \ +" color = color_accum * (1.0f / multiplier_accum);\n" \ +"\n" \ +" /* blend in out values over the threshold, otherwise we get sharp, ugly transitions */\n" \ +" if ((size_center > threshold) &&\n" \ +" (size_center < threshold * 2.0f))\n" \ +" {\n" \ +" /* factor from 0-1 */\n" \ +" float fac = (size_center - threshold) / threshold;\n" \ +" color = (readColor * (1.0f - fac)) + (color * fac);\n" \ +" }\n" \ +"\n" \ +" write_imagef(output, coords, color);\n" \ +" }\n" \ "}\n" \ "\n" \ "\n" \ diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp index 0507cbed165..f7712f675f2 100644 --- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp +++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp @@ -101,8 +101,8 @@ void VariableSizeBokehBlurOperation::executePixel(float *color, int x, int y, vo float readColor[4]; float bokeh[4]; float tempSize[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}; + float multiplier_accum[4]; + float color_accum[4]; int maxBlur = tileData->maxBlur; #ifdef COM_DEFOCUS_SEARCH @@ -122,8 +122,8 @@ void VariableSizeBokehBlurOperation::executePixel(float *color, int x, int y, vo inputSizeBuffer->readNoCheck(tempSize, x, y); inputProgramBuffer->readNoCheck(readColor, x, y); - add_v4_v4(color_accum, readColor); - add_v4_fl(multiplier_accum, 1.0f); + copy_v4_v4(color_accum, readColor); + copy_v4_fl(multiplier_accum, 1.0f); float size_center = tempSize[0]; const int addXStep = QualityStepHelper::getStep() * COM_NUMBER_OF_CHANNELS; -- cgit v1.2.3