【发布时间】:2011-06-30 16:54:33
【问题描述】:
我希望在 GPU 上进行“选择性模糊”或“表面模糊”。我已经阅读了一些关于该主题的研究论文,并且看到了大量的 C 代码,但理想情况下我想要 GLSL、HSL 或 CG 的东西。
【问题讨论】:
我希望在 GPU 上进行“选择性模糊”或“表面模糊”。我已经阅读了一些关于该主题的研究论文,并且看到了大量的 C 代码,但理想情况下我想要 GLSL、HSL 或 CG 的东西。
【问题讨论】:
实际上,双边模糊与高斯模糊没有太大区别,您只需将样本的值乘以高斯因子乘以中心像素的实际值之间的“接近度”函数的结果和采样的像素。
所以,在伪 GLSL 中
vec3 centreColour = texture2D(image,texCoord);
vec3 result = centreColour;
float normalization = 1;
for (int i = 0; i < NUM_SAMPLES; ++1)
{
vec3 sample = texture2D(image, texCoord + offsets[i]);
float gaussianCoeff = computeGaussianCoeff(offsets[i]);
//depends on your implementation, this is quick
float closeness = 1.0f - distance(sample,centreColour) / length(vec3(1,1,1));
float sampleWeight = closeness * gaussian;
result += sample * sampleWeight;
noralization += sampleWeight;
}
vec3 bilateral = result / normalization;
您可能应该有更好的方法来确定接近度值,例如在感知均匀的空间(如 LUV)中进行。
对于优化,您可以应用所有适用于高斯模糊的技术,除了那些忽略您必须知道像素值这一事实的技术。例如,使用纯高斯,您可以明智地选择您的 texcoords 并在一次提取中集成 4 个像素。那是行不通的。
有效的大事:
*分离你的过滤器。代替 5x5 样本 (25),水平执行 5 个,保存到中间缓冲区,垂直执行 5 个。它看起来并不完全相同,但仍会消除噪音。
*以较低的分辨率执行您的滤镜,然后将其与原版合成以获得一些细节。
【讨论】:
对于到达这里的任何人,如果您不自己重新实现,GPUImageView for Android 中有一个完整的实现。
实现包括顶点着色器和片段着色器。
【讨论】: