【问题标题】:Unity3d - remove white background from an image at runtimeUnity3d - 在运行时从图像中删除白色背景
【发布时间】:2017-02-12 20:35:37
【问题描述】:

我正在为儿童开发统一应用程序。

这个想法是孩子们在白色表面上绘制图像(如鱼),然后将其作为图像文件存储在文件夹中。应用程序必须在运行时导入这些,然后在二维空间中移动它们。我无法控制图像的绘制方式或在什么表面上绘制,因为这部分是由第三方 Web 应用程序完成的。我只是将它们作为共享文件夹中的图像文件接收。

问题是白色背景。如何将白色部分动态更改为透明?我正在使用 Unity 中的当前着色器,并注意到如果我手动导入具有白色背景的图像并分配“粒子/乘法”类型的着色器,白色部分将被移除,但图像看起来也比它应该的暗得多,就像颜色不完全正确。如何在运行时使用代码执行此操作?这也是唯一的方法吗?因为我不希望图像失去颜色。

简而言之,如何动态删除白色背景?另外,值得一提的是,只有外部背景应该被移除,所以如果鱼有白色的眼睛,那不应该变成透明的。所以检测外部对我来说也是问题的一部分。

提前致谢

编辑:我开始使用不同的着色器和着色器代码,并取得了一些进展。所以我导入了一个精灵,在上面添加了一些默认的精灵着色器,在着色器代码中,添加了这一行:Blend Zero SrcColor 正如所附图像中可见的那样,它产生了去除白色背景所需的效果。唯一的问题是,现在鱼也有点透明了。我要做的就是让鱼像左图一样正常,但像右图一样删除背景!

Image: using blending on sprite shader

【问题讨论】:

  • 不要将图片保存在白色背景上,而是将其保存在 alpha 透明背景上。或者,您可以处理图像,并创建一个十六进制键来表示保存图像的确切白色阴影,然后用 alpha 透明通道替换该像素,或者您可以只购买 10 美元的色度键资产工具
  • 感谢您的回复,但我无法控制图像的绘制表面,因为它们来自第三方 Web 应用程序。我只是将它们作为共享文件夹中的图像文件接收(我编辑了帖子并现在包含了这个解释)。同样,仅将颜色更改为透明也行不通,因为鱼的其他部分可能具有相同的颜色。例如,鱼可能有白色的眼睛,而且不应该是透明的。应该只是背景。
  • 那么您最有可能的 SOL,我假设您接收的图像只有一层。这意味着您可以判断要绘制的唯一方法是检查完全封装的对象,然后您可以过滤掉背景,但是如果绘图没有完全连接或绘图与角落重叠怎么办?所以可能可以使用凸包的组合来猜测应该封装的内容,然后以这种方式过滤掉背景
  • 在这里查看类似的问题:stackoverflow.com/q/9280902/3426025

标签: unity3d shader transparency blending shaderlab


【解决方案1】:

我可以想出一些方法,尽管您永远不会得到完美的结果 - 即使在图像编辑程序中这也可能很挑剔,因为通常除了背景之外还有更多的东西是白色的。

一种选择是将其添加到片段或表面函数中:

clip(_Threshold - col.r*col.g*col.b)

这里假设 _Threshold 是一个值接近 1 的属性(越低,灰色越透明),col 是反照率颜色。

您还可以尝试通过一些数学魔术将“白度”转换为 alpha。这是一个例子:

col.a = floor(saturate(col.r*col.b*col.g + (1-_Threshold)))

或者像这样:

col.a = saturate(pow(col.r*col.b*col.g + (1 - _Threshold), 10))

【讨论】:

    【解决方案2】:

    一种解决方法是使用白色背景,但您要更改的纹理始终是透明的,因此您要为透明纹理添加颜色,而另一个对象只是纯背景。

    不是吗?

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 1970-01-01
      • 2015-03-02
      • 2020-07-26
      • 1970-01-01
      • 2014-01-14
      • 2016-08-06
      • 2020-12-05
      相关资源
      最近更新 更多