我正在尝试在OpenGL中实现Adobe Photoshop的Drop Shadow图层样式。我需要在Photoshop的“大小”属性控制的阴影边缘添加模糊度。我首先想到通过典型的高斯模糊算法运行它会很好。但仔细观察效果我很清楚高斯模糊不会产生相同的效果,因为它会均匀地处理光栅的所有碎片。在Photoshop中,模糊区域总是沿着阴影形状的边缘。这样可以朝着形状的中心变宽。任何人都可以指向一个算法或GLSL示例,根据大小参数模糊其边缘的形状,就像在Photoshop中一样?
更新:这是我使用Euclidian Distance字段的最终结果和中概述的技术 this Valve论文+最近的book“OpenGL Insights”:
答案 0 :(得分:5)
我对这个答案也很感兴趣,因为我试图在我的开源项目中复制Photoshop图层样式:
https://github.com/vinniefalco/LayerEffects
这就是我所知道的:
投影和内阴影是彼此的双重身份。在图层上添加投影与将内阴影添加到具有反转蒙版的图层相同。
技术设置为“精确”的外发光使用倒角度量计算欧几里德距离变换(EDT)。
笔画设置为Gradient,“Shape Burst”使用相同的EDT。
技术设置为“更柔和”的外发光使用与用于投影的相同的未知变换。
由于距离变换几乎在每个Photoshop图层样式中都起着关键作用,因此假设投影中的未知变换是EDT的变体可能是合理的。我能找到的唯一其他变体称为“高斯距离变换”(GDT)。不幸的是,在“医疗,遥感和工业应用的二维和三维图像配准”一书中只有一个描述。 PDF可用:
以下是GDT的描述:
如果我们使用单调递增的径向函数对图像进行卷积,将获得与距离变换图像类似的图像。高斯的逆可以用作单调递增的径向函数。因此,为了获得图像的距离变换,图像用高斯卷积,并且卷积图像的强度被反转。以这种方式计算距离变换使得所获得的距离对噪声不太敏感。这在图4.6中的示例中得到证明。图4.6a和4.6b分别示出了通过高斯卷积计算的图像4.5a和4.5b的距离变换。与欧几里德距离变换相比,高斯卷积计算的距离变换对噪声的敏感度较低。
鉴于此图片:
Before http://www.imgfsr.com/sitebuilder/images/fig4.5a-256x256.png
这是带符号的欧几里德距离变换和带符号的高斯距离变换:
EDT http://www.imgfsr.com/sitebuilder/images/fig4.5c-256x256.png GDT http://www.imgfsr.com/sitebuilder/images/fig4.5e-256x256.png