Unity TextMeshPro文本描边outline存在黑底问题研究

news2024/11/29 12:37:51

在使用TextMeshPro的时候遇到了字体黑底的问题,类似下图这样

 当字体较大的时候表现正常,当缩小到一定程度就会出现黑底。这个情况让人第一时间就是怀疑SDF计算缩放的时候存在问题。在我们重新导出字体,调整图集字体大小以及Padding后,让SP/PD值差不多大于3%就能解决这个问题

 这个SP/PD就是Padding值/Samping Point Size

Also, note the SP/PD ratio. The generator calculates this by dividing the Sampling Point Size by the Padding Value. For best results, this value should be under 10%. If it’s above 10%, either increase the Atlas Resolution or decrease the Padding value, then regenerate the font until the value is below 10%.

上面说到SP/PD值应该低于10%,这个是从节省图集大小来考虑的,当SP/PD过大,每个字符间隙很大,对于我们描边也没意义,10%就是差不多很够用的一个值。但是并没有说到需要一个下限,如果低于这个下限会出什么问题,文档没有说明,很多博客也没说到过。没错,如果过低就会出现上面看到的黑底问题,具体是为什么我们稍后讨论,这里先讲讲如何解决这个问题。

解决方案

我们的目标是控制SP/PD值在一个区间值内,低于某个值会出现黑底问题,高于会存在浪费空间的问题。10%为一个比较合理的上限,那个这个下限是多少呢?官方没有规定,那也只有我们自己看着合适就好,这充分贯彻了那句话”计算机图形学的第一定律:如果它看起来是对的,那么它就是对的“

 

 在我调整Padding将SP/PD控制在4%以上之后,肉眼看过去基本就感觉不出来了。

想要调整SP/PD值的方法如下:

  1. 调整Padding
  2. 调整采样字体大小Samping Point Size
  3. 调整字体图集分辨率

 了解更多

了解了如何解决这个问题,但是这是为什么呢?我脑子里面冒出了下面几个问题

  1. 为什么只有在缩放的时候或者字体很小的时候会出现黑底?
  2. 是不是只有使用outlie的时候才会出现黑底?
  3. 不使用也出现黑底,那个这个黑底出现的原因是什么?

浅浅的了解SDF

要想解决上面的问题,我们首先要浅浅的了解下什么是SDF,为什么SDF可以无限放大。

SDF(Signed Distance Field)是一种用于将矢量图形转换为比特图的技术,我们生成的图集其实就是一张单通道(Alpha)的纹理,这个alpha值就是存储的距离或者说是梯度。

通过这张纹理,我们可以知道字体的边界在哪里,有点类似边缘检测的卷积,也是知道边界梯度,我们可以拿这这个值无限放大字体,也可以在边界添加各种效果,其中当然就包括我们今天讨论的描边。

当然,纹理存储的信息是 [0,1]范围的值,在计算中需要-0.5映射到[-0.5,0.5]区间,0表示字体边界,大于表示在字体边界内,小于0表示在字体边界外。我们可以从TMP_SDF-Mobile.shader这个文件中窥探一二 

float bias = (0.5 - weight) * scale - 0.5;

 寻找线索

那个值是关键?

知道了解决问题的关键在于shader中,我们就需要研究下一个字体的渲染过程,我们测试发现,只有在缩放或字体极小的时候会出现黑底,那这个问题的关键肯定于缩放相关,Distance Field中很关键的scale值就与缩放相关,下面我们先看看代码

float2 pixelSize = vPosition.w;
pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));

float scale = rsqrt(dot(pixelSize, pixelSize));
scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1);

这个scale计算的是当前分辨率下,顶点的物理尺寸,当我们缩放字体的时候scale会变得很小,这个时候就出现了黑底。

接下来我们就是需要找到为什么scale值小的时候会出现黑底?

为什么scale值变小后会出问题?

half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
half4 c = input.faceColor * saturate(d - input.param.w);

理论上c的值在边界外a通道应该小于裁剪阈值0.01,但是没有,就可以推断上面代码d是大于input.param.w(bias),可以推断下面几种可能性

  1. d计算错误
    1. 采样得到alpha通道的梯度值错误
    2. 计算所得scale值错误
  2. bias计算错误

其中bias如果错误也可以转换到scale计算的错误。现在把范围缩小为到底是scale计算错误还是采样错误。由于我的目前比较菜,也只能猜测。我认为scale由于采用的是变换矩阵计算而得,是不会出现问题,如果出问题,都出问题了,能出问题的一定是我们导出的设置相关引起的问题。那必然就是我们导出的纹理有问题

 我们通过上面图对比,相同PointSize与TextureSize下,Padding更大的那个纹理,alpha通道表示得到的梯度更加的光滑,这个就可以解释文本在缩小的时候导致物理尺寸变小,导致纹理采样的时候不能准确计算边界导致了黑底的存在。

以上都是自己根据看现成代码推理而得,个人不针对推理负责。不过解决方案你了解即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/470474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】点云PointNet从0到1

文章目录 前言1 PointNet1.1 点云的数据集1.2 点云的挑战1.1 网络结构 前言 直接处理点云数据的深度学习技术PointNet End To end Learning for scattered, unordered point data Unified franework for various tasks Point-Based Methods 分为 PointNet 和 Poin…

万字长文 - Nature 综述系列 - 给生物学家的机器学习指南 1

生物数据的规模不断扩大和固有复杂性促使越来越多的人在生物学中使用机器学习来构建相关生物过程的信息和预测模型。所有机器学习技术都是把数据拟合到模型,然而,具体方法千差万别,乍一看似乎令人困惑。在这篇综述中,我们旨在向读…

好用免费,国内手机人人都能玩的GPT!

用了这个长时间的chatgpt真的是觉得离不开它,太好用的!又是是写作,编程,日常的一些咨询搜索的事情全部交给它了!但是很少有人在手机上能玩GPT! 对于大多数普通选手来说,想在手机上玩GPT,始终离不…

王一茗: “大数据能力提升项目”与我的成长之路 | 提升之路系列(三)

导读 为了发挥清华大学多学科优势,搭建跨学科交叉融合平台,创新跨学科交叉培养模式,培养具有大数据思维和应用创新的“π”型人才,由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

8种不同类型的防火墙

什么是防火墙? 防火墙是一种监视网络流量并检测潜在威胁的安全设备或程序,作为一道保护屏障,它只允许非威胁性流量进入,阻止危险流量进入。 防火墙是client-server模型中网络安全的基础之一,但它们容易受到以下方面的…

R语言 | 处理矩阵与更高维数据

目录 一、矩阵 1.1 建立矩阵 ​1.2 认识矩阵的属性 1.3 将向量组成矩阵 二、取得矩阵元素的值 2.1 矩阵元素的取得 2.2 使用负索引取得矩阵元素 三、修改矩阵的元素值 四、降低矩阵的维度 五、矩阵的行名和列名 5.1 取得和修改矩阵对象的行名和列名 5.2 dimnames()函数…

【MySQL自学之路】第4天——模式、表、视图、索引(数据定义详细版)

目录 前言 数据库 数据库的建立 数据库的使用 数据库的查看 数据库的删除 模式 查看所有的模式 模式和数据库之间的关系 ​编辑建立模式 删除模式 表 数据类型 查看一个数据库下面的所有表(必须进入要查看的数据库) 创建基本表 查看表结构(查看表建…

EU GMP附录一与关键区域空气微生物取样方案及相关法规标准解读

2022版EU GMP附录一与关键区域空气微生物取样方案疑问解答 3月30日2022版EU GMP附录一与关键区域空气微生物取样方案网络研讨会期间,我们收集到了部分参会听众针对该主题所提出的常见问题。根据以下这些问题,lighthouse微生物应用专家将来为您答疑解惑。…

多功能自动化智能运维平台,提升集群的全自动运维效率

一、开源项目简介 致力于打造一个集主机管理、配置部署、监控报警、异常诊断、安全审计等一系列功能的自动化运维平台。 探索创新的sysAK、ossre诊断工具及高效的LCC(Libbpf Compiler Collection)开发编译平台和netinfo网络抖动问题监控系统等&#xff…

放射学中的自然语言处理技术综述

放射学中的自然语言处理技术综述 写在最前面预览CLINICAL APPLICATIONS Automatic Protocoling 临床应用程序自动协议Extraction of Language Features, Patient Cohorting, and Coded Ontology from Charts 从图表中提取语言特征、患者队列和编码本体Medical Imaging Appropri…

vulnhub靶场之bluemoon

1.信息收集 存活主机进行探测,发现主机192.168.239.176存活。 对主机192.168.239.176进行端口扫描,发现21、22、80端口 访问http://192.168.239.176,并查看源码未发现可利用的行为。 进行目录扫描发现可疑路径/hidden_text 浏览器访问h…

Python的经典结构算法

学会了 Python 基础知识,想进阶一下,那就来点算法吧!毕竟编程语言只是工具,结构算法才是灵魂。 那新手如何入门 Python 算法呢? 几位印度小哥在 GitHub 上建了一个各种 Python 算法的新手入门大全。从原理到代码&…

SQL server 数据库同步(发布与订阅)【解决办法】

SQL server 数据库同步(发布与订阅)【解决办法】 一、本地防火墙放通二、创建共享文件夹2.1 在发布服务器上创建共享文件夹,该文件夹用于提供数据库信息同步的媒介2.2 设置共享权限,添加所有人,权限为读取 三、发布服务…

NetMQ | 发布订阅时使用含通配符的Topic

NetMQ | 发布订阅时使用含通配符的Topic 文章目录 NetMQ | 发布订阅时使用含通配符的Topic前言通配符如何使用通配符通配符的作用结束语 前言 今天我来介绍一下NetMQ发布订阅时如何使用含通配符的Topic,让我们能够更加灵活地订阅消息。 什么是Topic? 在NetMQ中&am…

这一次,让Kotlin Flow 操作符真正好用起来

前言 Kotlin Flow 如此受欢迎大部分归功于其丰富、简洁的操作符,巧妙使用Flow操作符可以大大简化我们的程序结构,提升可读性与可维护性。 然而,虽然好用,但有些操作符不太好理解,可惜的是网上大部分文章只是简单介绍其…

1970-01-01是什么?为什么计算机起始时间是1970年1月1日

我们是不是也曾见到过或者听说过1970-01-01,而且它好像常常存在于计算机行业,非常常见,从事IT行业的兄弟应该都接触过,那么到底为什么是1970-01-01,而不是其他呢? 其实,1970-01-01对于开发者来说都是不陌生…

带你了解现在的LED显示屏技术

随着LED显示屏技术的空前繁荣,LED显示屏产品备受关注,广泛应用于商业广告、实况播映、交通诱导、舞台演绎等领域,发展至今。你了解十大中国LED显示屏制造商吗? LED显示屏技术已经得到了长足的发展,现在的LED显示屏技术…

智融合·共未来丨智合同携手百融云创打造合同智能化应用服务平台

人工智能技术是当今社会的热议话题之一。近年来,众多企业在人工智能领域持续布局,相关技术已在社会生产各环节极大地提高了生产效率。如果把过去信息技术产业的发展比喻为“手工时代”,那么人工智能技术的出现则将把信息技术产业推向“自动化…

数据库迁移 | DBMotion v23.04 支持异地多活

Squids DBMotion新版本支持异地多中心双活同步了。异地多活支持业务在多个数据中心同时操作数据库,能极大地提升高可用性、容错性和用户体验。其中最关键的技术,无疑是数据同步、同步防环和数据冲突解决。Squids DBMotion通过复制数据打标和预置冲突策略…

生产凭证补传操作步骤

凭证包文件包含:身份证正面、身份证背面、拍照图片、身份证头像图片、联网核查文件、签名文件、签名轨迹文本、凭证json文件。 一、证件信息重复或者模糊。 1.提供业务流水号、证件信息。 2.将证件信息通过安全U盘导入生产机。 3.根据业务流水号前8位设备号及业务流…