add threshold blending to opencl too.

This commit is contained in:
Campbell Barton
2012-08-08 18:10:13 +00:00
parent a401971cf8
commit 5019cd179f
3 changed files with 32 additions and 10 deletions

View File

@@ -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);
}
}

View File

@@ -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" \

View File

@@ -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;