Opengl GLSL中的Photoshop阴影样式

Opengl GLSL中的Photoshop阴影样式,opengl,glsl,photoshop,Opengl,Glsl,Photoshop,我试图在OpenGL中实现Adobe Photoshop的阴影层样式。我需要添加一个模糊的阴影边缘,这是由“大小”控制的属性。我最初认为通过典型的高斯模糊算法运行它会很好。但仔细观察效果,我很清楚高斯模糊不会产生相同的效果,因为它会均匀地处理光栅的所有碎片。在Photoshop中,模糊区域总是沿着阴影形状的边缘。那些向形状的中心变宽。任何人都可以指出一个算法或GLSL示例,它根据大小参数模糊形状的边缘,就像在Photoshop中一样 更新:这是我使用欧几里得距离场和中概述的技术得出的最终结果 阀

我试图在OpenGL中实现Adobe Photoshop的阴影层样式。我需要添加一个模糊的阴影边缘,这是由“大小”控制的属性。我最初认为通过典型的高斯模糊算法运行它会很好。但仔细观察效果,我很清楚高斯模糊不会产生相同的效果,因为它会均匀地处理光栅的所有碎片。在Photoshop中,模糊区域总是沿着阴影形状的边缘。那些向形状的中心变宽。任何人都可以指出一个算法或GLSL示例,它根据大小参数模糊形状的边缘,就像在Photoshop中一样

更新:这是我使用欧几里得距离场和中概述的技术得出的最终结果 阀论文+最近的“OpenGL洞察”:
我对这个答案也很感兴趣,因为我正试图在我的开源项目中复制Photoshop图层样式:

这就是我所知道的:

  • 投影和内影是二元的。在层上添加放置阴影与在具有反转遮罩的层上添加内部阴影相同

  • “技术”设置为“精确”的“外部辉光”使用倒角度量计算欧几里德距离变换(EDT)

  • 笔划设置为渐变,“形状突发”使用相同的EDT

  • 技术设置为“柔和”的外部辉光使用了一些未知的变换,这些变换与用于放置阴影的变换相同

由于距离变换在几乎所有Photoshop图层样式中都起着关键作用,因此可以合理地假设Drop Shadow中的未知变换是EDT的变体。我唯一能找到的另一种变化称为“高斯距离变换”(GDT)。不幸的是,在《医疗、遥感和工业应用的二维和三维图像注册》一书中只有一个描述。PDF可供查阅:

以下是GDT的描述:

如果我们用单调递增的径向函数卷积一幅图像,就会得到一幅像距离变换图像一样的图像。高斯函数的逆函数可用作单调递增的径向函数。因此,为了获得图像的距离变换,用高斯函数对图像进行卷积,并反转卷积图像的强度。以这种方式计算距离变换使获得的距离对噪声不太敏感。这在图4.6中的示例中进行了演示。图4.6a和4.6b分别显示了通过高斯卷积计算的图像4.5a和4.5b的距离变换。与欧几里德距离变换相比,高斯卷积计算的距离变换对噪声不太敏感

鉴于此图像:


(来源:)

这是有符号欧几里德距离变换和有符号高斯距离变换:


(来源:)


(来自的图像)

我认为如果没有边缘检测,您将无法做到这一点。我使用了4个过程实现了它。第一个过程:渲染平面(仅使用平面几何体)使用黑色填充和基于方向的偏移。第二遍:宽度上的高斯模糊。第三遍:高度上的高斯模糊。第四遍:渲染最终的纹理平面。它看起来很好,但我希望使用更少的遍数。很好!最后,我也使用了距离场方法。仅供参考,我在回答中提到的切角度量是本文中描述的切角5,7,11距离:“近似距离变换的情况”。从我所尝试的一切来看,简单的欧几里德距离场效果很好,如果可能的话,我希望看到一些屏幕截图