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:
authorCampbell Barton <ideasman42@gmail.com>2012-08-08 22:10:13 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-08-08 22:10:13 +0400
commit5019cd179f39ee8f80829bb0d6895e494a66ffa2 (patch)
tree38727d9646468394de783fd49554873495248638 /source/blender/compositor/operations
parenta401971cf88e3acadb04243929822da6fcf03174 (diff)
add threshold blending to opencl too.
Diffstat (limited to 'source/blender/compositor/operations')
-rw-r--r--source/blender/compositor/operations/COM_OpenCLKernels.cl17
-rw-r--r--source/blender/compositor/operations/COM_OpenCLKernels.cl.h17
-rw-r--r--source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp8
3 files changed, 32 insertions, 10 deletions
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;