解决UI黑边问题,Alpha Bleeding技术简介

问题描述

前段时间美术那边反馈部分UI有一圈黑边,而且同一个UI元素在不同位置,黑边的宽度还不一样,大概在1到2个像素,非常不美观。具体效果如下图:

其中涉及到2张图片,如下:

我们通过PhotoShop具体放大看下图片的边缘,可以看到2张图片的边缘都是没有黑边的,其中黄色块的边缘有1圈透明像素。如下:


问题分析

1. 检查图集

一般我们使用UI图片都会打成图集再使用,这里也不例外,所以第一步当然要检查下生成后的图集是否有问题。具体来说就是检查图集的padding是否过小

这是最简单最常见的错误,padding过小,也就是图片之间的距离过小,会导致渲染时出现采样问题。一般来说UI元素都是采用线性的,所以采样时会将附近的像素进行混合,如果padding不够大,就会混合到旁边图片的像素,导致出现一些黑边问题。

一般来说,padding设置成2个像素基本就没问题了。

2. 采样问题

上面的问题很容易解决,我相信大部分开发者都不太会在这里栽跟头,我们也不是。考虑到黑边时隐时现,估计会是采样问题。

后来在OpenGL的论坛里找到一篇回答:Blending and alpha - black border,里面有提到类似的问题,以及给出了解决方案。

简单来说,问题出在这2个非常简单的颜色块上,就是因为它们太简单了,其边缘没有任何的渐变或者羽化,我们可以叫它硬边缘。上面说到UI渲染一般都是线性采样(不然很容易有锯齿),那么当采样到这些硬边缘时,以白色块为例,白色是(1,1,1,1),边缘是完全透明的(0,0,0,0),那么线性采样后,就变成了(0.5,0.5,0.5,0.5),也就是灰色,这就是出现黑边的原因。

为什么其他UI元素没这个问题?其实所有图片或多或少都有这个问题,只是很多UI图片元素,其边缘不规则,而且有一定的过渡,所以一般看不出来。

解决方案

方案很多种,这里先讲一些不太现实的方案,最后讲一个非常简单的方案,大家没兴趣的可以直接看最后的方案4

1. 用点采样

既然线性采样会有问题,那么改成点采样是不是OK了?是的!

不过这也有很多限制,一般采样模式是和图片绑定的,一张图片只能有1个采样模式,如果你出问题的图片打成图集了,那么就意味着同个图集里所有图片都要用点采样。那为啥大家都不用点采样呢?当然就是因为它的效果不好,锯齿很严重,所以选择用这个方案,你最好把出问题的图片独立抽出来,减少影响面。

2. 用AlphaTest

在渲染时,一般有2种Alpha的渲染模式:AlphaBlend和AlphaTest。

如果你所有UI的图片,其Alpha是二元的,也就是说,要么是全透明,要么完全不透明,不存在半透明的图片。那么你可以考虑用AlphaTest,也就是把低于某个Alpha值的像素在渲染时直接丢弃掉,这样通过线性采样得到的边缘灰色像素,由于其Alpha值不会大于0.5,那么通过AlphaTest就可以把那些讨厌的黑边丢弃了。

不过没有半透明这个限制对大部分游戏来说,都不太能接受,除非你的UI是极简风格的,或许可以考虑。

3. 不用图集

这个Bug的根本原因就是采样硬边缘导致的,这些硬边缘就是因为打成图集时,图片和图片之间加上了一些透明像素做padding导致的。这样的话,我们不打成图集不就可以了?确实,对于硬边缘的图片可以考虑这个方案,像上面的灰色底图,如果采用单张图片,那么就不会有黑边问题,不过黄色块还是会有问题,因为它图片本身就有一圈透明像素!

很多时候,美术出图时,会考虑通过添加透明边缘把图片做成一样大,方便后续对齐,所以如果要采用这个方案,你也要留意下有没有这种图片存在。

4. 修改边缘像素

这是效果最好的方案(当然也有一些缺点,后面会讲到),上面讲到线性采样后,2个颜色混合成灰色了,那么如果边缘的颜色不是(0,0,0,0),而是(1,1,1,0)呢?这样的话,混合出来的颜色就是(1,1,1,0.5),也就是一个半透明的白色!当然重点不是白色,而是它和边缘的颜色是一致的,所以玩家看不出边缘有黑边。

具体来说,就是我们需要把所有图片边缘旁边的完全透明像素(颜色值为(0,0,0,0)),将其RGB值改成和边缘一致,其Alpha值保持为0。这样线性采样后,混合出来的颜色就和边缘的颜色是一样的,只不过变成半透明而已!这个技术就叫做Alpha Bleeding

有意思的是,不管RGB值怎么改,由于Alpha是0,那么在图片上都是看不到这个像素的,所以用了AlphaBleeding技术的图片和没用AlphaBleeding技术的图片肉眼看起来是一模一样的。

TexturePacker里打开AlphaBleeding

如果你是用TexturePacker来生成图集,那么恭喜你,TexturePacker自身就支持了AlphaBleeding,不过是叫ReduceBorderArtifacts。下面是官网的介绍:

ReduceBorderArtifacts

Transparent pixels get color of nearest solid pixel. These color values can reduce artifacts around sprites and remove dark halos at transparent borders. This feature is also known as “Alpha bleeding”.

不同版本的TexturePacker里,这个设置的位置可能会不同,不过在很早的版本就开始支持了。

下面是使用打开这个选项后生成的图集的效果,可以看到黑边完全消失了,看起来干净多了。如下:

Alpha Bleeding的缺点

对我来说,这些缺点影响比较小,不过大家还是要根据自身情况多注意下。

Alpha Bleeding带来的最大改变是,图片自身新增了不少的颜色值,而新增的这些颜色值会导致一些问题:

1. 部分对颜色数量敏感的压缩算法效果会变差

好吧,我知道的类似算法就是PNG8,PNG8是通过采用调色板来压缩图片的,8就是意味着8位调色板,也就是256色,所以如果你图片里包含的颜色数量低于256,那么采用PNG8是无损的,相反,颜色数量越多,颜色差异越大,最后压缩的效果就越差(这里指图片看起来有点糊)。

明显,采用Alpha Bleeding会导致最后的效果更差。

当然,由于UI图集一般包含大量不同的图片,所以都不建议采用PNG8压缩。

2. 文件大小变大

这个和压缩算法有关,一般的图片压缩算法,如PNG、JPEG等,都是对数据压缩的,所以数据越单一,越规律,压缩效果越好。同样大小的PNG图片,如果一张是纯色,一张是噪点,你会发现2张图片的文件大小差了非常多。

Alpha Bleeding会给图片增加了很多新的颜色值,这会增加文件层面上数据的复杂度,从而导致压缩效果变差。

我用自己游戏里最大的一张图集做过测试,会变大10%左右。当然这个不同图片结果不同,这个数据仅供参考。

3. 打图集时间变长

这个很好理解,因为打完图集后需要扫描整个图片来进行Alpha Bleeding。我自己没仔细研究怎么实现高效的Alpha Bleeding算法,不过估计复杂度最快都要O(n2)O(n^2)O(n2)。就算采用Texture Packer来打图集,打开Alpha Bleeding后也能明显感知到打图集的时间至少多了1倍以上。

也是因为这点,想在运行时做Alpha Bleeding也就不太现实了。

解决UI黑边问题,Alpha Bleeding技术简介相关推荐

  1. 【Visual C++】游戏开发五十五 浅墨DirectX教程二十二 水乳交融的美学:alpha混合技术

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/15026917 作者:毛星 ...

  2. Windows的位图alpha混合技术

    摘 要:本文介绍了在Windows环境下对位图的图像alpha混合技术,提供了alpha混合函数的实现方法,并对Windows API提供的alpha混合函数的使用进行了介绍. 关键词:Windows ...

  3. 滑动返回类库SwipeBackLayout的使用问题,解决返回黑屏,和看到桌面

    滑动返回类库SwipeBackLayout的使用问题,解决返回黑屏,和看到桌面 参考文章: (1)滑动返回类库SwipeBackLayout的使用问题,解决返回黑屏,和看到桌面 (2)https:// ...

  4. 用HTML做软件UI用到的的一些技术

    做WEB开发的想把网页做成应用程序的界面,开发应用程序的又想把程序界面做得和WEB一样.本文介绍一下用HTML做软件UI用到的的一些技术. 其实HTML UI也不是什么新鲜事了,Norton Anti ...

  5. 电脑调分辨率黑屏了怎么办_调整分辨率后黑屏 怎么调整显卡分辨率解决电脑黑屏...

    分辨率过高也是导致电脑黑屏的一个隐形因素,调整显卡分辨率可以解决电脑黑屏.下面是小编为大家介绍调整显卡分辨率解决电脑黑屏的方法,欢迎大家阅读. 调整显卡分辨率解决电脑黑屏的方法 可以尝试选择" ...

  6. 西湖大学自然语言处理(七)—— 解决OOV问题的两种平滑技术

    西湖大学自然语言处理(七)-- 解决OOV问题的两种平滑技术 Knesser-Ney Smoothing absolute discount smoothing Good-Turing Smoothi ...

  7. 学黑帽seo需要什么技术?

    学黑帽seo需要什么技术? 黑帽seo是网站优化的一种,通过非正规的手段去达到一个优化排名的作用,相比于白帽seo技术,黑帽seo的一大特点就是能更快的排名.黑帽的做法有非常的多种,如采集,站群,批量 ...

  8. Qt解决UI界面一次性加载数据过多卡顿的问题

    关于Qt如何解决UI界面一次性加载太多数据而卡顿的问题 思路分析: ​ 以QTableWidget电子词典为例,每次模糊查询单词时都会产生几十种,几千甚至上万种不同的结果: ​ 例如我们输入a,对a进 ...

  9. 解决CF黑边和无法全屏

    解决CF黑边和无法全屏 方法一 [Nvidia显卡设置] 下面是N卡设置,基本和A卡大同小异,就是把那个缩放功能选上就可以了: 方法二 在CF目录下找到config文件夹下面的uiconfig.xml ...

  10. 解决OBS黑屏的问题.

    解决OBS黑屏的问题. 找到控制面板. 选择集成图形. 点击应用.完成. 可以看教程https://www.bilibili.com/video/av31993205/ 很不错.文字介绍如下: 找到控 ...

最新文章

  1. EXT3与EXT4的主要区别
  2. android input鼠标坐标,android - 如何在EditText中设置光标位置?
  3. 南工大计算机学院,江南-欢迎访问湖北工业大学计算机学院官方网站
  4. java变量小明扑克牌_算法练习篇之:扑克牌顺子
  5. android 驱动(6)---DTS 分析
  6. 爬虫 正则 bs4 xpath 中文乱码 管道符
  7. 高性能服务器设计——模块间通信(转载)
  8. Windows server 2008 iis7 下配置PHP+MySql
  9. 访问win10的远程桌面(Remote Desktop)总是凭据或者用户密码错误
  10. WINDOWS自带md5校验工具
  11. 入职美团定级P7,最新最全180道高级岗面试题及答案
  12. 最好用的WIN7WIN10激活工具
  13. GPS同步时钟(NTP时间服务器)网口物理隔离的好处
  14. 2021年WordPress博客装修美化(一)
  15. 【译】如何学习机器学习
  16. 漫步数学分析十九——介值定理
  17. 伺服电机向前三秒,向后三秒,循环往复
  18. 浙江农林大学第二十二届程序设计竞赛部分题解
  19. 什么是外观检测系统?外观检测系统的功能有哪些?
  20. 3dmax2010中文版下载|3DSMax 2010 狂人精简版

热门文章

  1. FITS基本文件格式
  2. 页面html背景图片居中显示文字,DIV+CSS中让布局、背景图片、文字内容居中的方法...
  3. android点击按钮执行adb命令,Android 按键事件及adb命令模拟
  4. 明源售楼系统技术解析(一)搭建MVC3框架
  5. CC00083.bigdatajava——|Java特殊类.V11|——|Java.v11|自定义类枚举类|在switch结构使用|
  6. K8s中Secrets
  7. dedecms5.7(织梦)源码解析之程序安装补全篇
  8. 用python写爬虫 (三)获取数据、requests库
  9. 基于决策树模型的金融保险用户分类综合项目【数据可视化相关性分析填充缺失值转码建模商业应用】
  10. 用计算机如何算针入度指数,沥青针入度指数怎么计算?需要计算公式,最好说的详细一点!...