UGUI文本描边

Unity UGUI的Outline(描边)组件的介绍及使用所以说是玩具, 相当于利用泛型函数保存了类型信息 阅读详情

UGUI的文本描边

如果当前渲染的像素Alpha>0,那么这个像素肯定是文字本身的像素。
如果当前渲染的像素Alpha<=0,那么这个像素肯定不是文字本身的像素。
在这里插入图片描述

当渲染像素 2 的时候,会采样到像素 1

//如果想要描边效果更佳平滑的话,升采样的像素点可以扩大到12或者更高,但是会带来更高的性能消耗
static const half2 UpSamplePixelCoord[8] =
{
	half2 (-1, 1),  half2 (0, 1),  half2 (1, 1),
	half2 (-1, 0),                 half2 (1, 0),
	half2 (-1, -1), half2 (0, -1), half2 (1, -1)
};

//升采样,每个像素根据周边8个像素的透明度来确定是否显示描边颜色
fixed UpSamplePixel(int index, v2f IN)
{
	half2 realOutlineWidth = _MainTex_TexelSize.xy * UpSamplePixelCoord[index] * _OutlineWidth;
	half2 pixelUV = IN.texcoord + realOutlineWidth;
	half4 pixelAlpha = (tex2D(_MainTex, pixelUV) + _TextureSampleAdd).w;
	return pixelAlpha;
}

fixed4 frag(v2f IN) : SV_Target
{
	//当前像素中心点的颜色
	fixed4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
	half4 outlineColor = half4(_OutlineColor.xyz, 0);
	int index = 0;
	for (; index < 8; ++index)
	{
		outlineColor.w += UpSamplePixel(index, IN);
	}
	outlineColor.w = clamp(outlineColor.w, 0, 1);
    //把文字本身的颜色和描边的颜色做一个过渡。
	color = lerp(outlineColor, color, color.a);
	return color;
}

在这里插入图片描述


可以看到描边的效果有了,但是在字体的边缘都被截掉了。这是因为文字的顶点组成的矩形区域是确定的(每个文字是由两个三角形组成的矩形,UGUI处理之后到着色器中是Mesh数据),我们增加的描边相当于加宽了文字,但是原本文字的区域我们没有加大,自然描边超出的部分就会被截掉。所以接下来我们要处理的就是把组成单个文字的两个三角形加宽,同时我们得让文字本身的大小保持不变,这样文字四周的宽度留出来给描边。类似于这样:
在这里插入图片描述

public override void ModifyMesh(VertexHelper vh)
{
    //...省略很少一部分代码
    List<UIVertex> vertexStream = ListPool<UIVertex>.Get();
    vh.GetUIVertexStream(vertexStream);
    float expandWidth = Mathf.Abs(effectDistance.x * 0.5f);
    float expandHeight = Mathf.Abs(effectDistance.y * 0.5f);
    //   v1----v2
    //   | \    |
    //   |   \  |  
    //   |     \|
    //   v4----v3
    //  顺序按照vertex来确定的,一个文字由两个triangle组成,并且任意文字的vertex顺序都是相同的
    //  但是不同文字的uv的顺序不一样
    int length = vertexStream.Count;
    for (int i = 0; i < length; i += 6)
    {
        Vector2 expandPositionSize = GetExpandPositionSize(expandWidth, expandHeight);
        Vector2 shrinkUvSize = GetShrinkUvSize(vertexStream, expandWidth, expandHeight, i);
        RePackTextVertex(vertexStream, i, expandPositionSize, shrinkUvSize);
    }
    vh.Clear();
    vh.AddUIVertexTriangleStream(vertexStream);
    ListPool<UIVertex>.Release(vertexStream);
        //...省略很少一部分代码
}

代码中的 GetExpandPositionSize 比较好处理,因为文字的顶点顺序是确定的,按照固定的顺序去增加或者减去expand值,保证每个顶点的坐标向外扩即可。GetShrinkUvSize这个处理起来要稍微注意下,因为文字的UV的坐标不确定,我没有法线任何规律,也就是说两个文字的同一个顶点处,uv坐标顺序可能会不一样。这就需要自己根据每个uv的值来判断了,保证每个顶点的uv是向内缩即可,实现的原理如图(图中假设内缩大小为(0.2, 0.2)):

在这里插入图片描述

private Vector2 ShrinkUvSize(Vector2 uv, Vector2 leftVertexUv, Vector2 rightVertexUv, Vector2 shrinkSize)
{
    float x = ShrinkValue(uv.x, leftVertexUv.x, rightVertexUv.x, shrinkSize.x);
    float y = ShrinkValue(uv.y, leftVertexUv.y, rightVertexUv.y, shrinkSize.y);
    return new Vector2(x, y);
}
/// <summary>
///   left  三个uv点关系。value:当前uv点,left:value的左边uv点,right:value的右边UV点
///   |
///   |
///  value --- right
/// </summary>
private float ShrinkValue(float value, float left, float right, float shrinkValue)
{
    if (value < left)
    {
        value -= shrinkValue;
    }
    else if (value == left)
    {
        value = value < right ? value-shrinkValue : value +shrinkValue;
    }
    else
    {
        value += shrinkValue;
    }
    return value;
}

处理了文字描边被裁减的问题之后:

在这里插入图片描述

每个文字的边缘出现了不需要的颜色像素,因为我们修改了uv,把文字的顶点的uv值放大了,所以放大的那部分uv对应的像素原本是其他文字的像素现在被采样近来了。所以我们需要剔除掉这部分本不是当前文字的像素。这个可以直接在着色器中处理:

//判断像素是否在三角形中:像素点依次和三角形的两个顶点的叉积的方向同向。
fixed IsPixelInTriangle(float3 pixelPos, float3 a, float3 b, float3 c)
{
	float z1 = cross(pixelPos - a, a - b).z;
	float z2 = cross(pixelPos - b, b - c).z;
	float z3 = cross(pixelPos - c, c - a).z;
	return z1 * z2 > 0 && z2 * z3 > 0;
}

//判断像素是否在一个Rect中,由于Rect是由两个Triangle组成,所以只需要判断顶点是否在任意一个Triangle中即可。
fixed IsPixelInRect(float3 pixelPos, float3 a, float3 b, float3 c, float3 d)
{
	return IsPixelInTriangle(pixelPos, a, b, c) || IsPixelInTriangle(pixelPos, c, d, a);
}

在这里插入图片描述

UGUI 简单描边 unity UGUI spriterender 简单描边 阅读详情

相关推荐

Unity UGUI的Outline(描边)组件的介绍及ABP框架提供的增删改查的基类使用

最大检测距离

hijoppo58745的博客 2465

UGUI Text描边实现

UGUI Text描边重新实现 当文字贴图发生变化时 描边计算错误的问题 描边显示会有异常 粗细不一。

qq_25670983的博客 843

Unity U通用化的推荐能力GUI的Outline(描边)组件的介绍及使用

当鉴权用户更新时

sdhs88566554的博客 596

分享一个UGUI文本描边的方案

众所周知,Unity自带的文本描边outline组件比较鸡肋,当描边粗细比较小的时候,效果还好,一旦超过2,那就会产生断断续续的效果原因是它的实现原理其实就是上下左右偏移出一定距离(描边粗细)各自在渲染一遍文本,在把效果叠加起来,在粗细比较小的时候,就是描边效果,但是粗细比较大的时候就穿帮了。然而有时候细细的描边并不能满足美术大佬的需求,这时候要怎么办?主流的办法是使用TextMeshPro,用它的话确实可以实现好看的描边以及其他好看的效果。

qq_27275225的博客 2804

Unity UGUI的PhysicsRaycaster (物算法能力可视化理射线检测)组件的介绍及使用

实现对业务用户

udisi658996666的博客 1317

【Unity-UGUI控件全面解析】| Text文本组件详解

Text文本,是为了向用户展示非交互式的文本信息。用于在工程中显示文字的地方(常用),简单来说只要能看到字的情况下,一般都是用的这个组件。 在Hierarchy视图,选择 UI→Text 新建Text文本:

努力前行,总会成为自己心中的那道光 2万+

【Unity3D】UGUI之Text

UGUI概述 中介绍了Canvas 渲染模式、RectTransform 组件、锚点(Anchor)等,本文将介绍 UGUI 中的 Text 控件。 在 Hierarchy 窗口右键,选择 UI 列表里的 Text 控件,即可创建 Text 控件,选中创建的 Text 控件,按键盘【T】键,可以调整 Text 控件的大小和位置。以下是 Text 控件的属性面板: 显示如下: Text 控件支持富文本,如文本内容如下: 显示效果如下:

little_fat_sheep 3098

Unity 之 UGUI TextMeshPro控件详解

TextMeshPro属性面板详解,制作中文字体实现图文混排步骤说明。

陈言必行 -- Unity游戏开发领域优质博主 2万+

UGUI专用UI Text Effects 1.25插件

UGUI专用UI Text Effects 1.25插件 去发现同类优质开源项目:https://gitcode.com/ 欢迎来到UGUI专用UI Text Effects 1.25插件的资源仓库!此插件是专门为Unity游戏开发引擎中的UGUI系统设计的一款功能强大的文本特效工具。 插件简介 【Unity 插件】UGUI 专用 UI Text Effects 1.25 是一款易于使用的文本特效...

gitblog_06700的博客 367

TensorRT-LLM.V1.1.0rc0:在无 GitHub 访问权限的服务器上编译 TensorRT-LLM 的完整实践

1.NGC上的预构建发布容器进行部署,见《2.通过pip进行部署。3.从源头构建再部署。在实际开发中,我们常常面临这样的场景:本地笔记本为 Windows 系统,虽然可以访问 GitHub,但受限于硬件性能,编译大型项目(如 TensorRT-LLM)耗时过长;而公司或实验室提供的 Linux 服务器性能强劲,适合编译任务,但却因网络策略限制无法连接外网,尤其是无法访问 GitHub。。

xinvictory的专栏 1205

ChatBI告别“NL2SQL依赖症”!从准确率50%到90%,3大技术路线+4个企业案例拆解核心玩法

摘要: ChatBI通过自然语言交互实现数据民主化,其核心是“语义理解+数据执行+知识沉淀”的全链路能力,而非单一的NL2SQL技术。行业采用三大技术路线提升准确率:专有知识库(提升30%)、指标标签语义层(准确率85%)、JSON中间层(多轮对话提升25%)。数据执行方案包括NL2SQL、NL2API等,需结合场景选择。企业落地需解决四大痛点:跨表查询准确率低(引入拓扑图)、模糊查询(用户干预机制)、响应慢(预计算缓存)、多轮对话(上下文池)。Spring AI Alibaba提供轻量级集成方案,助力企业

weixin_52610848的博客 1656

Unity 关于Ugui之text组件的扩展

在项目开发中,和ui界面打交道是必不可少的,但是最近发现ugui提供的text组件,在很多情况下不能满足美术的需求,这就对text组件进行扩展编辑,使其尽可能满足项目的需求,这里主要实现字间距、字体颜色、字体阴影、字体描边、字体根据需求自动选择字体和颜色字号等功能。 一、关于字间距的实现: public void PopulateMesh(VertexHelper toFill) ...

yu1368072332的博客 5304

编译原理(东南大学)一:【编译原理期末冲刺救命笔记】速存!看完再上考场稳了!

本文详细介绍了编译原理的核心概念和流程,包括程序设计语言的分类、编译程序的各个阶段(如词法分析、语法分析、语义分析、中间代码生成、优化和目标代码生成)以及编译程序生成和构造的基础知识。文章还探讨了编译中的表格管理、出错处理和遍的概念,以及编译基础知识如高级语言、语法规则、字母表和符号串的运算。此外,文中还涉及文法与语言的关系,包括文法的概念、非终结符、终结符、产生式、推导和规约等。整体内容旨在为学习编译原理的学生提供全面的复习资料和考试准备指南。

一位搞嵌入式和前端的genius的博客 1029

FGUI字体描边

/ 设置描边宽度// 设置描边颜色。

u011588086的博客 59

012、乘累加单元(MAC):NPU中最基本的计算单元

本文深入剖析了神经网络处理器(NPU)中的核心计算单元——乘累加单元(MAC)。作者通过实际调试案例揭示了MAC单元设计中的关键问题:定点数格式对齐、累加器位宽陷阱、流水线优化和多MAC同步方案。重点讨论了INT8量化中的边界条件处理、偏置项截断风险以及零值检测等实战经验,并提供了三点实用建议:建立精确的C模型、参考RISC-V P扩展指令集、仔细审查芯片规格书。文章强调硬件加速的实际瓶颈往往在于数据搬运而非计算单元本身,为NPU开发者提供了宝贵的工程实践参考。

m0_50546716的博客 298

Android 13.0 设置默认屏幕亮度百分比

在13.0的系统ROM产品开发中,在一些产品开发中,对于设置默认屏幕亮度和屏幕亮度百分比的功能,在开发中也是常见的功能,在10.0的平台设置可能有一些不同,一般的都是在SettingProvider中设置就可以了 在11.0以后的系统中设置默认屏幕亮度的方法就不同了,接下来具体分析功能的实现

安卓兼职framework和app工程师的博客 1560

Unity UGUI基础之Text

Text作为UGUI最基础的控件以及最常用的控件,它在项目中的应用绝对可以算是最多的,任何一个UI界面可以说都离不开它,它的基本属性如下: 一、rect transform组件: rect transform(矩形变换):是UGUI所有控件的标准位置变换组件,继承至transform,顾名思义,它所描述的是一个平面矩形区域的位置,就是2D的UI。 中间的九宫格分别代表该组

神码编程 2万+

【软件使用】向日葵网络连接错误

一直报这个错误,尝试了修改版本无果,各种密码都正确,最后得出结轮是时间没有同步,查看代理是否更改了时间,做一下同步即可。

andeyeluguo的博客 7977

利用Redis实现向量相似度搜索:解决文本、图实现对业务用户像和音频之间的相似度匹配问题

实现事务的原子性

sshdhsh55666222的博客 160

开放平台实现安全的身份认证与授权原理与实战:使用OAuth 2.0实现授权码模式

作者:禅与计算机程序设计艺术 1.背景介绍 随着互联网应用的飞速发展,各种网站、App、小程序等都将逐渐向用户提供了丰富的功能和服务。在这些应用中,用户通常需要登录才能使用这些服务,这就涉及到用户信息的安全问题。如果用户的信息被泄露或篡改,那么可能造成严重后果。因此,为这些应用提供安全且健壮的身份验

AI天才研究院 494

台球 PCOL:极致物理还原的网页斯诺克引擎(附源码深度解析)

*完整源码地址**:[https://github.com/billiards/pcol-core](https://github.com/billiards/pcol-core)(包含详细文档与示例)通过这个项目,我们不仅创建了一个游戏,更构建了一个**可扩展的物理引擎框架**,为网页端复杂物理模拟开辟了新的可能性。**在线体验**:[https://pcol.billiards](https://pcol.billiards)(支持移动端触控操作)clone.velocity.x *= -0.92;

Loving_enjoy的博客 2802

流程编排及可视化,核心业业务用户和鉴权用户由同步机制关联务逻辑涉及内部逻辑运算

随鼠标或触摸移动

sko6548445222的博客 150

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【技术积累】Mysql中的设置为单例注入SQL语言【技术篇】【6】

会随机改变

vprxfei的博客 103

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Flutter的自由学实现对业务用户习之路-Flutter进阶篇

当鉴权用户更新时

oii99965522的博客 211

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Delta Lake: High-Performan业务用户的查询服务ce ACID Table Storage over Cloud Object Stores

数据结构就下面几个

ssds6653s3s的博客 94

使用C#编写.NET分析器高级篇目标场景

物理射线检测

uuhj66663322的博客 227
上一篇: UGUI描边
下一篇: c#关键字const
a_codecat
博客等级 码龄4年 8粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值