我是数字图像处理和计算机图形学的初学者。我想编程一个与Shadermap 3普通编辑器(更具体地说是位移层)类似的行为。

如此Shadermap 3演示视频所示,位移刷允许用户绘制位移图(灰度)



笔触产生的形状具有从形状的中间到边缘的平滑值过渡,在这种情况下,使形状略微弯曲。如图所示,可以使用画笔曲线编辑器微调形状的轮廓。

Shadermap 3可以使用滤镜和/或算法的哪些组合来将像素斑点或形状转换为位移具有给定宽度和曲线的地图?



#1 楼

我能想到的一种方法是对图像进行“符号距离变换”,其中每个像素都有关于像素距形状最接近的表面的距离的信息。由于已签名,因此您将能够知道像素在其形状的内部还是外部以及大小。距离大于-10,否则为白色。这样会使形状缩小10个像素。

您可以使用平滑步长或其他曲线在多个像素上的黑白之间过渡,以使其柔化以防边缘混淆。

可以通过蛮力进行距离变换,但是另一种方法是先制作一个voronoi图,然后将其转换为距离变换。 voronoi图以及(有符号的)距离变换,但以下两个链接可能对您有所帮助:

http://blog.demofox.org/2016/02/29/fast-voronoi在gpu上使用跳水洪水算法绘制图和距离场纹理/

http://blog.demofox.org/2016/03/02 / actually使签名距离场纹理与jfa /

评论


$ \ begingroup $
通常,您可能还想阅读带符号的距离字段。似乎相关,因为您可能可以跳过距离变换步骤而只需绘制sdf
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-3-14的3:12

$ \ begingroup $
谢谢,看来效果很好。使用OpenCV,应用距离变换,对图像进行阈值处理并最终将其归一化为0到255的值似乎提供了很好的结果。虽然确实有一些锯齿状的线。我尝试了高斯模糊处理,但是我真的很想知道是否有更好的解决方案。
$ \ endgroup $
–温柔的驼鹿
16 Mar 15 '16 2:54



$ \ begingroup $
有更好的解决方案。主题类的保证书是自己的问题,但这是一个简短的答案。第一步是使它在特定距离内从白色渐变为黑色。就像10是从黑色到白色的距离一样,您可以使其在9到11之间淡入淡出,您可以使用该距离值根据距离确定像素是亮还是暗。接下来,获取该像素阴影,该阴影应在0到1之间,并通过smoothstep函数进行处理。这将使它从线性淡入淡出变成更具吸引力的东西。调整淡入淡出的距离以达到口味(:
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-3-15的3:10

$ \ begingroup $
以下是smoothstep函数的详细信息:en.m.wikipedia.org/wiki/Smoothstep提供了更好或更详细的答案,您可能会问如何在使用距离字段进行渲染时进行抗锯齿。
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-3-15的3:12

$ \ begingroup $
抱歉,针对您的原始问题进行更多讨论。我相信曲线只是说明了如何将线性距离变成像素阴影。例如,如果您的宽度为10像素,并且相距5像素(正向或负向),则这意味着您已达到50%的距离,并在曲线上以50%的比例进行查找以查看如何使白色或黑色成为输出像素。
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
16-3-15的3:47