Unity TextMeshPro文本存在背景框的问题研究

这篇具有很好参考价值的文章主要介绍了Unity TextMeshPro文本存在背景框的问题研究。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

Unity TextMeshPro文本存在背景框的问题研究

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

Unity TextMeshPro文本存在背景框的问题研究

 这个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%为一个比较合理的上限,那个这个下限是多少呢?官方没有规定,那也只有我们自己看着合适就好,这充分贯彻了那句话”计算机图形学的第一定律:如果它看起来是对的,那么它就是对的“

Unity TextMeshPro文本存在背景框的问题研究

 Unity TextMeshPro文本存在背景框的问题研究

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

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

  1. 调整Padding
  2. 调整采样字体大小Samping Point Size
  3. 调整字体图集分辨率Unity TextMeshPro文本存在背景框的问题研究

 了解更多

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

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

浅浅的了解SDF

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

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

Unity TextMeshPro文本存在背景框的问题研究Unity TextMeshPro文本存在背景框的问题研究

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

当然,纹理存储的信息是 [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由于采用的是变换矩阵计算而得,是不会出现问题,如果出问题,都出问题了,能出问题的一定是我们导出的设置相关引起的问题。那必然就是我们导出的纹理有问题

Unity TextMeshPro文本存在背景框的问题研究

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

以上都是自己根据看现成代码推理而得,个人不针对推理负责。不过解决方案你了解即可。文章来源地址https://www.toymoban.com/news/detail-450716.html

到了这里,关于Unity TextMeshPro文本存在背景框的问题研究的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity - TextMeshPro显示中文

    unity自带的字体资源(Font Asset)都无法显示中文字符,可进行以下操作自行生成支持中文的字体资源。 https://github.com/DavidSheh/CommonChineseCharacter 个人开发者推荐 思源系列字体 若只是学习交流直接从 C:/Windows/Fonts 中选择字体 直接将字体文件拖入编辑器的Project窗口即可 选择 W

    2024年02月14日
    浏览(39)
  • Unity - TextMeshPro

    TextMeshPro 是 Unity 的终极文本解决方案。它是 Unity 的 UI 文本和旧版文本网格的完美替代品。 TextMeshPro(也称为 TMP)功能强大且易于使用,它使用高级文本渲染技术以及一组自定义着色器;提供显着的视觉质量改进,同时在文本样式和纹理方面为用户提供难以置信的灵活性。

    2023年04月08日
    浏览(28)
  • Unity中TextMeshPro的使用

     在Unity中有自带的Text组件,这个组件已经能够满足我们日常开发中绝大多数的开发字体显示需求了,我们为什么还要使用这个TextMeshPro组件呢?这是因为Text使用的是基于位图的渲染技术而TextMeshPro基于的则是SDF算法即基于网格的文本渲染技术,并且TextMeshPro相比于Text拥有更

    2024年01月17日
    浏览(30)
  • 【Unity】TextMeshPro描边功能

    有的小伙伴第一次使用TextMeshPro的时候,会找不到TextMeshPro的描边功能,对此,我来简单的讲述一下。

    2024年03月12日
    浏览(50)
  • Unity的TextMeshPro使用概览

    一、生成动态字体 1.字体文件:比如windows系统的fonts文件夹中 2.导入unity,create——Text Mesh Pro——Font Asset 3.字体补充:建一个txt文件,收录常用汉字(中文标点符号也要自己处理),导入unity,然后选中生成的SDF字体,更新字体图集 4.选择合适的分辨率,太小会导致字体放大

    2023年04月09日
    浏览(27)
  • Unity [TextMeshPRO]动态字体显示中文

    我们知道Unity的Text组件在新版本中已经标记为legacy,TextMeshPRO因为有着更加出色的效果被Unity官方奉为主流。 言归正传,如果我们想要用TextMeshPRO]显示中文应该这么处理呢? 首先,我们肯定要导入一份中文字体 因为静态字体的文章较多,这里不再赘述 然后我们在字体上右键

    2024年02月12日
    浏览(40)
  • Unity TextMeshPro使用中文字体

      TextMeshPro是Unity新一代字体,是 Unity 的最终文本解决方案。它是 Unity UI Text 和旧版 Text Mesh 的完美替代方案。功能强大、易于使用、性能高效。目前TextMeshPro对中文的支持也还可以,不过默认不能用,需要自己成生成。    本文就介绍TextMeshPro中文字体文件的生成方法,并

    2024年02月08日
    浏览(37)
  • Unity TMP (TextMeshPro) 创建字体材质

    完整名称:Text Mesh Pro ,unity新一代主流字体插件 1.1 组件变化 内置的Text组件以及与内置Text组件绑定的Button、DropDown、InputField均被替换为使用TextMeshPro的版本 内置的Text组件以及与内置Text组件绑定的Button、DropDown、InputField则被移动到Legacy菜单 1.2 变化说明 旧的组件只是移动到

    2024年02月10日
    浏览(29)
  • Unity中使用TextMeshPro打出Emoji表情

    最近遇到一个需求,在聊天框中支持用户的Emoji输入,查了半天资料没有一个能说清楚的,于是自己研究琢磨了下。 最终效果 最终效果可以在APP输入框中使用系统的输入法输入emoji表情并显示,如下 1.1 准备好emoji素材 找到emoji图片,注意需要是 unicode.png 格式命名的。github上

    2024年01月18日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包