赞
踩
Unity的的贴图导入面板上有个开关,Alpha Is Transparency
:
文档中是这样说的:
Enable this property to dilate the color and avoid filtering artifacts on the edges if the alpha channel you specify is Transparency.
本文讲下这个选项做什么,解决什么问题。
这个选项开启后,图片中所有完全透明像素(alpha == 0)的RGB会改写为:与其最临近非完全透明像素(alpha>0)的RGB。
可以做个简单的试验看一下,创建一张4x4的图,中间2x2不透明给上不同颜色,周围一圈完全透明。
导入Unity后,分别看下开启/不开启 Alpha Is Transparency
时,用不透明shader输出RGB部分。
Alpha Is Transparency
完全透明像素的RGB为白色(PS的默认行为)。网页背景白色为了便于观察,图片四周加了黑边框。
Alpha Is Transparency
再来瞧下开启时的情况:
周围一圈的完全透明像素RGB值被填充了,填充成了临近非完全透明像素的RGB。
减少纹理过滤产生的瑕疵。
还是拿上面的4x4图片为例,用半透明shader叠加到灰色背景。
图片开启双线性采样后放大显示(发生magnification)。对比下开启和关闭时的情况:
可以看到右侧关闭 Alpha Is Transparency
时 ,插值部分颜色泛白。两种情况透明通道的插值是一样的,问题是,插值的出来的RGB也有全透明像素RGB的贡献,全透明区域的白色和其它颜色混合产生了白边。
在本文的例子中是白边,也有可能是其它颜色边,这取决于全透明区域的RGB部分存了什么。
在生成 Mipmap 时也会有同样的问题,会引入不期望的颜色。
Unity通过覆写全透明像素的RGB,使这些像素存储的RGB与临近像素一致,达到了减少纹理过滤瑕疵的目的。
这问题其实和 straight alpha 产生的问题类似,因此有了 premultiplied alpha。区别就是Unity 的Alpha Is Transparency
只处理全透明像素,解决了一部分问题而且不用修改混合公式,而预乘alpha除了能达到一样的目的还可以缓解半透明像素之间过滤产生的颜色问题。
Unity的方式在引擎导入资源时做了全透明像素的修改,同样也可以在美术软件里达到相同的目的,没有统一的术语有叫 padding 的,也有叫 color dilation 的,PVRTexTool 中叫 alpha bleed,这里列举一些相关资料:
Edge padding - polycountwiki.polycount.com最后打个小广告,我司(友谊时光)引擎开发部2021年招新,觉得北上广房价太贵,愿意来苏州发展的新老同学只要你有一技之长请私信我。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。