Skip to content

Instantly share code, notes, and snippets.

@kvvzr
Created October 10, 2018 05:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kvvzr/2d6e55d7b0b0141fa430063c162cac40 to your computer and use it in GitHub Desktop.
Save kvvzr/2d6e55d7b0b0141fa430063c162cac40 to your computer and use it in GitHub Desktop.
#include <metal_stdlib>
using namespace metal;
#include <CoreImage/CoreImage.h>
extern "C" { namespace coreimage {
float4 bilateralFilter(sampler src, float2 texelOffset, float distanceNormalizationFactor, destination dest) {
const int gaussianSamples = 9;
float2 blurCoordinates[9];
for (int i = 0; i < gaussianSamples; i++) {
int multiplier = i - (gaussianSamples - 1) / 2;
float2 blurStep = float(multiplier) * texelOffset;
blurCoordinates[i] = dest.coord() + blurStep;
}
float4 centralColor = src.sample(src.transform(blurCoordinates[4]));
float gaussianWeightTotal = 0.18;
float4 sum = centralColor * gaussianWeightTotal;
float4 sampleColor;
float distanceFromCentralColor;
float gaussianWeight;
sampleColor = src.sample(src.transform(blurCoordinates[0]));
distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor);
gaussianWeightTotal += gaussianWeight;
sum += sampleColor * gaussianWeight;
sampleColor = src.sample(src.transform(blurCoordinates[1]));
distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor);
gaussianWeightTotal += gaussianWeight;
sum += sampleColor * gaussianWeight;
sampleColor = src.sample(src.transform(blurCoordinates[2]));
distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor);
gaussianWeightTotal += gaussianWeight;
sum += sampleColor * gaussianWeight;
sampleColor = src.sample(src.transform(blurCoordinates[3]));
distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor);
gaussianWeightTotal += gaussianWeight;
sum += sampleColor * gaussianWeight;
sampleColor = src.sample(src.transform(blurCoordinates[5]));
distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor);
gaussianWeightTotal += gaussianWeight;
sum += sampleColor * gaussianWeight;
sampleColor = src.sample(src.transform(blurCoordinates[6]));
distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor);
gaussianWeightTotal += gaussianWeight;
sum += sampleColor * gaussianWeight;
sampleColor = src.sample(src.transform(blurCoordinates[7]));
distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor);
gaussianWeightTotal += gaussianWeight;
sum += sampleColor * gaussianWeight;
sampleColor = src.sample(src.transform(blurCoordinates[8]));
distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);
gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor);
gaussianWeightTotal += gaussianWeight;
sum += sampleColor * gaussianWeight;
return sum / gaussianWeightTotal;
}
}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment