Unity3d - 在运行时从图像中删除白色背景

时间:2017-02-12 20:35:37

标签: unity3d shader transparency blending shaderlab

我正在为儿童制作统一申请。

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

问题是白色背景。如何将白色部分动态更改为透明?我正在使用Unity中的当前着色器并注意到如果我手动导入带有白色背景的图像并指定类型为#34;粒子/乘法"的着色器,则会删除白色部分,但图像也会显示比它应该更暗的方式,就像颜色不完全正确。如何在运行时使用代码执行此操作?这也是唯一的方法吗?因为我不想让图像失色。

简而言之,如何动态删除白色背景?此外,值得一提的是,只应移除外部背景,因此如果鱼具有例如白眼,则不应变为透明。所以检测外部部分也是我的问题的一部分。

提前致谢

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

Image: using blending on sprite shader

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

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

不是吗?