1

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

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

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

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

提前致谢

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

图片:在精灵着色器上使用混合

4

2 回答 2

2

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

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

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))
于 2019-01-04T14:20:34.710 回答
0

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

不是吗?

于 2019-01-04T16:16:01.843 回答