1.【Unity源码学习】遮罩:Mask与Mask2D
2.DIY vue3组件: 动手实现高斯模糊遮罩层的自动遮罩自动遮罩对话框效果
3.unity Mask遮罩效果
4.Cypress 踩坑记 - DOM 遮挡
5.SuperSlide滚动的遮罩层宽/高怎么计算的?如何设置具体一个值?
6.UGUI源码阅读之Mask
【Unity源码学习】遮罩:Mask与Mask2D
Unity源码学习遮罩详解:Mask与Mask2D UGUI裁切功能主要有两种方式:Mask和Mask2D。它们各自有独特的源码源码原理和适用场景。1. Mask原理与实现
Mask利用IMaskable和IMaterialModifier功能,设置通过指定一张裁切图,自动遮罩自动遮罩如圆形,源码源码限定子元素的设置源码熊张辅政显示区域。GPU通过StencilBuffer(一个用于保存像素标记的自动遮罩自动遮罩缓存)来控制渲染,当子元素像素位于Mask指定区域时,源码源码才会被渲染。设置 StencilBuffer像一个画板,自动遮罩自动遮罩每个像素有一个1字节的源码源码内存区域,记录是设置否被遮盖。当多个UI元素叠加时,自动遮罩自动遮罩通过stencil buffer传递信息,源码源码实现精确裁切。设置2. Mask2D原理
RectMask2D则基于IClippable接口,其裁剪基于RectTransform的大小。在C#层,它找出所有RectMask2D的交集并设置剪裁区域,然后Shader层依据这些区域判断像素是否在内,不满足则透明度设为0。sourcemap暴露源码 RectMask2D的性能优化在于无需依赖Image组件,直接使用RectTransform的大小作为裁剪区域。3. 性能区别
Mask需要Image组件,裁剪区域受限于Image,而RectMask2D独立于Image,裁剪灵活。因此,Mask2D在不需要复杂裁剪时更高效。 总结:虽然Mask和Mask2D各有优势,选择哪种遮罩取决于具体需求,合理使用能提高性能和用户体验。DIY vue3组件: 动手实现高斯模糊遮罩层的对话框效果
前言 & 一点点废话
最近迷上了前端设计,想借此机会放松一下平日里繁忙的AI工作。帮朋友重构班级主页网站时,发现Vue3的模块化设计极为便捷,许多组件和钩子可以直接复用。因此,我决定整理并分享个人设计的组件实现。未来几篇文章将围绕这一主题展开。
你可能会问:为什么自己写组件,黑马狂奔源码而不是直接使用像Element-Plus这样的库呢?答案是:尽管Element-Plus功能丰富,但其接口有限,样式定制难度较高,可能无法满足设计爱好者的需求。另外,大型组件库体积较大,对于追求轻量级和高效应用的开发者来说,自定义HTML5、CSS3与Vue3组件可能更为合适。我的组件库旨在简化复用流程,提供直观的特效展示,让使用者在短时间内上手,并能根据需求进行个性化定制。
为了帮助读者快速了解并复用组件,我将文章结构安排如下:
组件效果展示
登录界面和切换背景的对话框采用高斯模糊遮罩层,设计灵感源自苹果的特效,旨在吸引用户聚焦于对话框内容。
用法指南
参数设置说明:
槽位(Slot):用于嵌入自定义内容。
模板(Template)部分:展示基本结构与布局。
脚本(Script)部分:实现逻辑功能与状态管理。android期末源码
只需通过设置showDialog为true即可激活对话框。
源码示例
请根据需求调整mainColor和backFilter变量。以下是一个可行的样式方案,供参考:
unity Mask遮罩效果
Unity官方2DMask屏幕遮罩效果,是一种后处理效果,其原理是将源像素与遮罩图形像素相乘。
该效果的处理过程发生在Camera的OnRenderImage方法中。
实现该效果需要使用shader和MaskEffect,同时运用C#编程语言中的Mask类。
Mask类继承自PostEffectsBase,其源码在网络上广泛传播,但无法确定最早的作者。
3D Mask方面,可参考魔镜的相关内容。
在Frame Debugger中,2盏灯会渲染2次,且会导致无法合批batched。
创建一个Plane以及几个Cube,并为Plane创建ASE-Surface和Material,同样为Cube创建相应的全屏banner源码Material。
镜子Shader-Plane用于实现场景中的mask遮罩效果。
其原理是利用Plane和Cube的Render Queue值来控制半透明和不透明的渲染顺序。
在Frame Debugger中,魔镜的做法是用天空盒覆盖场景,并设置总是通过模板测试,以覆盖魔镜背后的现实物体。
Cypress 踩坑记 - DOM 遮挡
Cypress是一个热门的测试工具,但使用过程中发现了某些问题,以下记录问题发现及解决思路。
在Cypress下,点击指令通常能正常工作,但在特定场景下却表现异常。例如,测试点击遮罩层以关闭弹窗时,预期操作顺畅,但当模型填充内容后,操作突然失败。
测试代码简明易懂,执行Cypress后,一切如预期,但当模型内容增多,原本能正常点击的地方开始报错,明显不合理。
查阅文档发现,点击指令支持坐标或位置参数,但并未解决问题,似乎点击操作与元素遮挡计算有关。Cypress的遮挡计算似乎还有待优化。
深入源码分析,发现Cypress点击操作会进行一些判断,重要参数coords.fromElViewport显示了中心点坐标。Cypress使用该坐标获取最顶层元素并与目标元素进行对比。这是点击成功与否的关键因素,即中心点被遮挡可点击,未被遮挡则不能点击,操作略显简单粗暴,导致点击稳定性问题。
为验证分析结论,创建了测试用例。首先,创建一个极小的遮挡元素置于中央,测试发现点击失败。之后,将四周元素全部遮挡,仅留下中心一点,结果却能成功点击。
总结,Cypress的遮挡检查方式过于直接,可能不甚妥当,且容易引起混淆。理论上,采用多层对比交叉区域的方法可能更为合理。关于点击方式的优化,提供坐标或方位选择,以更准确判断是否遮挡,而非仅支持force操作,后者会降低测试意义。
SuperSlide滚动的遮罩层宽/高怎么计算的?如何设置具体一个值?
以下是全部代码,请自行修改及js路径 SuperSlide - 实用焦点图 *{ margin:0; padding:0; list-style:none; }body{ background:#fff; font:normal px/px 宋体; }img{ border:0; }a{ text-decoration:none; color:#; }a:hover{ color:#1。
UGUI源码阅读之Mask
Mask主要基于模版测试来进行裁剪,因此先来了解一下unity中的模版测试。
Unity Shader中的模版测试配置代码大致如上
模版测试的伪代码大概如上
传统的渲染管线中,模版测试和深度测试一般发生在片元着色器(Fragment Shader)之后,但是现在又出现了Early Fragment Test,可以在片元着色器之前进行。
Mask直接继承了UIBehaviour类,同时继承了ICanvasRaycastFilter和IMaterialModifier接口。
Mask主要通过GetModifiedMaterial修改graphic的Material。大致流程:
1.获取当前Mask的层stencilDepth
2.StencilMaterial.Add修改baseMaterial的模板测试相关配置,并将其缓存
3.StencilMaterial.Add设置一个unmaskMaterial,用于最后将模板值还原
MaskableGraphic通过MaskUtilities.GetStencilDepth计算父节点的Mask层数,然后StencilMaterial.Add修改模板测试的配置。
通过Frame Debugger看看具体每个batch都做了什么。先看第一个,是Mask1的m_MaskMaterial,关注Stencil相关的数值,白色圆内的stencil buffer的值设置为1
这个是Mask2的m_MaskMaterial,根据stencil的计算公式,Ref & ReadMask=1,Comp=Equal,只有stencil buffer & ReadMask=1的像素可以通过模板测试,即第一个白色圆内的像素,然后Pass=Replace,会将通过的像素写入模板值(Ref & WriteMask=3),即两圆相交部分模板值为3
这个是RawImage的Material,只有模板值等于3的像素可以通过模板测试,所以只有两个圆相交的部分可以写入buffer,其他部分舍弃,通过或者失败都不改变模板值
这是Mask2的unmaskMaterial,将两个圆相交部分的模板值设置为1,也就是还原Mask2之前的stencil buffer
这是Mask1的unmaskMaterial,将第一个圆内的模板值设置为0,还有成最初的stencil buffer
可以看到Mask会产生比较严重的overdraw。
2.drawcall和合批
每添加一个mask,一般会增加2个drawcall(加上mask会阻断mask外和mask内的合批造成的额外drawcall),一个用于设置遮罩用的stencil buffer,一个用于还原stencil buffer。
如图,同一个Mask下放置两个使用相同的RawImage,通过Profiler可以看到两个RawImage可以进行合批
如图,两个RawImage使用相同的,它们处于不同的Mask之下,但是只要m_StencilValue相等,两个RawImage还是可以进行合批。同时可以看到Mask1和Mask1 (1),Mask2和Mask2 (1)也进行了合批,说明stencilDepth相等的Mask符合合批规则也可以进行合批。
StencilMaterial.Add会将修改后的材质球缓存在m_List中,因此调用StencilMaterial.Add在相同参数情况下将获得同一个材质球。