graphics - 有谁知道我在哪里可以找到双边过滤器(模糊)的glsl实现?

标签 graphics opengl-es

我正在寻找在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次。它看起来不会完全一样,但仍会消除噪音。

*以较低的分辨率执行滤镜,然后将其与原始图像进行组合以获取一些细节。

关于graphics - 有谁知道我在哪里可以找到双边过滤器(模糊)的glsl实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6538310/

相关文章:

graphics - BlackBerry - 图像 3D 变换

c++ - 为什么在使用 OpenGL 编译顶点着色器时会出现着色器编译器错误 #143、#160 和 #216?

math - 双轮廓 - 噪声函数的法向量

java - 在 Java Graphics2D 中获取字符串边界的问题

安卓:编码的相机预览帧总是横向的。如何旋转?

java - 来自不同类(class)的绘画

sorting - 我应该如何对对象进行排序?通过着色器还是通过网格?

opengl-es - 如何在 OpenGL 中设置背景?

opengl-es - OpenGL线宽

c - 为什么 FreeImage 加载 BGR 格式的图像?