1.SuperSlide滚动的遮层遮罩遮罩层宽/高怎么计算的?如何设置具体一个值?
2.ligerUIä¸ligerDialogåligerWindowçåºå«
3.Cypress 踩坑记 - DOM 遮挡
4.[UE5] 遮挡剔除 源码阅读
5.UGUI源码阅读之Mask
6.DIY vue3组件: 动手实现高斯模糊遮罩层的对话框效果
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。源码
ligerUIä¸ligerDialogåligerWindowçåºå«
ä»APIæ¥çï¼å®ä»¬ä¹é´è§ä¹æ²¡ææ ¹æ¬æ§çåºå«ï¼ä¸é¢ç对æ¯å¾ï¼æè¿éåªååºäºAPIææ¡£ä¸åæ°ç对æ¯å¾ï¼ä¸¤ä¸ªç±»å ¶ä»çAPIä¹ä¸å¾ä¸æ åµå·®ä¸å¤ï¼DialogçAPIæ¯è¾å¤ï¼ä½å ä¹é½æ¶µçäºWindowä¸çAPIï¼å¯ä»¥èªè¡è®¿é®ä¸é¢çç½åæ¥çï¼
/WindowçAPIéé¢æ¯Dialogå¤åºäºä¸æ ·ä¸è¥¿ï¼é£å°±æ¯äºä»¶åè°å½æ°ã
为ä»ä¹ä»ä»¬çAPIè¿ä¹æ¥è¿ï¼ä¸ºå¥ä¸æ¯ä¸ä¸ªä¸è¥¿å¢ï¼ä¸é¢ææ¾å°äºå®çæºç ï¼
/ligerui/LigerUI/tree/Release/Source/lib/ligerUI/js/pluginså¨ ligerWindow.js ä¸ï¼æåç°ç¬¬è¡ï¼å¦ä¸
l.controls.Window.ligerExtend(l.core.Win,代码 {åæ ·æå¨ ligerDialog.js ä¸ï¼è¡ï¼æåæ ·çä¸å¥è¯ï¼å¦ä¸
l.controls.Dialog.ligerExtend(l.core.Win, {è¿è¡¨ç¤ºDialogä¸Windowæ¯ç»§æ¿èªåä¸ä¸ªç¶ç±» l.core.Winï¼éåææ¥çäº js/core/base.jsï¼å¨è¿ä¸ªæ件çè¡æçå°äº liger.core.Win ççå®é¢ç®ãliger.core.Win 并没æåå¾å¤çäºæ ï¼åªå®ç°é®ç½©åè½åå®ä¹ä¸äºæ½è±¡æ¥å£ã
æåæåéæ°åå»é è¯»äº ligerDialog.js ç代ç ï¼ä»ç¬¬ è¡å¼å§ä¸ç´å°ç»æï¼è¿ææ¯ Dialog ä¸ Window æ大çåºå«æå¨ï¼Dialog æ¯åä¾å¯¹è±¡ï¼ä¸å»ºè®®å¨ä½¿ç¨çæ¶å继æ¿ä¸æ©å±ï¼è Window æ¯ä¸ä¸ªå¤ä¾ç±»ï¼å 许ç´æ¥ç»§æ¿å¹¶æ©å±ã
ææ¿åºæºç éé¢ 5个 æåºæ¬çå½æ°ï¼æ¥è¯´æ Dialog æ¯åä¾ç±»çäºå®ï¼
$.ligerDialog.open = function (p){
// å®ä¾åä¸ä¸ª l.controls.Dialog 对象
// å é¨å¯ä»¥è¿½è¿°å°ç¬¬è¡ï¼ä½¿ç¨ liger.run() å½æ°æé Dialog å®ä¾
return $.ligerDialog(p);
};
$.ligerDialog.close = function ()
{
// æ ¹æ® Dialogç±»å æ¥å°å°ææç dialog å®ä¾å¯¹è±¡
var dialogs = l.find(l.controls.Dialog.prototype.__getType());
// 循ç¯æ¯ä¸ä¸ª dialogå®ä¾å¹¶éæ¯
for (var i in dialogs)
{
var d = dialogs[i];
d.destroy.ligerDefer(d, 5);
}
// éèé®ç½©å±
// å¨ligerUIä¸ï¼ææççªå£ä½¿ç¨çæ¯ä¸ä¸ªå ¨å±çmask
// ç¸å ³ä»£ç å¯ä»¥ç js/core/base.js è¡
l.win.unmask();
};
$.ligerDialog.show = function (p)
{
var dialogs = l.find(l.controls.Dialog.prototype.__getType());
if (dialogs.length)
{
for (var i in dialogs)
{
// å¦æå·²ç»åå¨ dialogå®ä¾ï¼é£ä¹å°±ç´æ¥ä½¿ç¨å®ä¾å¯¹è±¡
// æ¾ç¤ºå·²åå¨çdialogï¼å¹¶è¿å
dialogs[i].show();
return;
}
}
// å¦æä¸åå¨ dialogå®ä¾ï¼ååå§åä¸ä¸ªå®ä¾å¹¶è¿å
return $.ligerDialog(p);
};
$.ligerDialog.hide = function ()
{
var dialogs = l.find(l.controls.Dialog.prototype.__getType());
// éèdialogå®ä¾ä¹æ¯ç¸åçæ¹å¼
for (var i in dialogs)
{
var d = dialogs[i];
d.hide();
}
};
$.ligerDialog.tip = function (options)
{
// åå§åé项åæ°
options = $.extend({
showType: 'slide',
width: ,
modal: false,
height:
}, options || { });
$.extend(options, {
fixedType: 'se',
type: 'none',
isDrag: false,
isResize: false,
showMax: false,
showToggle: false,
showMin: false
});
// æé ä¸ä¸ªDialogå®ä¾
return $.ligerDialog.open(options);
};
æ ¹æ®ä¸é¢ç代ç 解读ï¼ç»è®ºå°±å¾æ¸ æ°äºï¼
Dialogæ¯ä¸ä¸ªåä¾å¯¹è±¡ï¼ä¸å»ºè®®ç»§æ¿ä¸æ©å±
Windowæ¯å¤ä¾ç±»ï¼å 许继æ¿å¹¶æ©å±
æè§å¾ligerUI对Windowç设计没æ Ext 设计å¾å¥½ï¼Dialogåºä½ä¸ºWindowçä¸ä¸ªåä¾å¯¹è±¡æç¸å¯¹åçï¼Extå°±æ¯è¿ä¹åçãæå ´è¶£çè¯ï¼å¯ä»¥äºè§£ä¸Extï¼Extæ¯ç®åæ认为å端UIç»ä»¶å设计å¾æ好çä¸ä¸ªæ¡æ¶ã
Cypress 踩坑记 - DOM 遮挡
Cypress是一个热门的测试工具,但使用过程中发现了某些问题,遮层遮罩以下记录问题发现及解决思路。源码
在Cypress下,代码emacs插件源码安装方法点击指令通常能正常工作,遮层遮罩但在特定场景下却表现异常。源码例如,代码测试点击遮罩层以关闭弹窗时,遮层遮罩预期操作顺畅,源码但当模型填充内容后,代码操作突然失败。遮层遮罩
测试代码简明易懂,源码执行Cypress后,代码一切如预期,但当模型内容增多,原本能正常点击的地方开始报错,明显不合理。
查阅文档发现,点击指令支持坐标或位置参数,但并未解决问题,ps作图psd源码似乎点击操作与元素遮挡计算有关。Cypress的遮挡计算似乎还有待优化。
深入源码分析,发现Cypress点击操作会进行一些判断,重要参数coords.fromElViewport显示了中心点坐标。Cypress使用该坐标获取最顶层元素并与目标元素进行对比。这是点击成功与否的关键因素,即中心点被遮挡可点击,未被遮挡则不能点击,操作略显简单粗暴,导致点击稳定性问题。
为验证分析结论,创建了测试用例。首先,创建一个极小的遮挡元素置于中央,测试发现点击失败。之后,将四周元素全部遮挡,仅留下中心一点,结果却能成功点击。
总结,钱包开发源码Cypress的遮挡检查方式过于直接,可能不甚妥当,且容易引起混淆。理论上,采用多层对比交叉区域的方法可能更为合理。关于点击方式的优化,提供坐标或方位选择,以更准确判断是否遮挡,而非仅支持force操作,后者会降低测试意义。
[UE5] 遮挡剔除 源码阅读
这篇文章旨在深入解析虚幻引擎5(UE5)原生的遮挡剔除机制,重点关注硬件遮挡剔除,并简述其他遮挡剔除技术及调试方法。此外,文章还涉及到移动端软件遮挡剔除技术的介绍和移动端的特定遮挡剔除流程。以下为详细内容。
### 遮挡剔除技术概览
UE5采用多种方法进行遮挡剔除,包括硬件遮挡剔除、分层Z缓冲遮挡剔除、视锥体剔除、距离剔除、io输入接口源码体积剔除,以及特殊的VR环绕剔除、软件遮挡剔除和预计算遮挡剔除。这些方法旨在优化游戏性能,减少可视Actor的绘制数量。
### 硬件遮挡查询(Hardware Occlusion Queries)
硬件遮挡查询需要与GPU进行数据交互,用于判断特定几何体是否被其他物体遮挡。在虚幻引擎中,通过使用硬件Query,能够批量创建查询、分配连续内存空间并进行后续定位,从而实现高效的回读数据过程。以DX为例,虚幻引擎利用了硬件Query的优势,实现了一套完整且高效的查询流程。
### 硬件遮挡查询流程
硬件遮挡查询的流程包括创建查询请求、执行具体查询内容(如在准备查询的Primitive周围绘制包围盒)、结束查询请求以及在每帧结束时回读查询数据。通过这种方式,虚幻引擎能够在下一帧中基于前一帧的数据进行高效的遮挡剔除。
### 分层Z缓冲遮挡查询(Hierarchical Z-Buffer Occlusion)
分层Z缓冲遮挡查询使用多层级的双语系统源码Z缓冲,通过记录上一级中周围四点中最远处的深度值,实现更精细的遮挡测试。计算结果通过shader进行处理并存储在贴图或缓冲中,最终回传至CPU以优化渲染性能。
### 预计算可见性剔除(PreCompute Visibility Culling)
预计算可见性剔除通过在场景中放置特定体积来预估可见性,适用于中小规模场景,但对大规模场景优化效果有限。
### 移动端软件查询(UE4)
在UE4中,软件遮挡剔除功能虽然已被UE5淘汰,但其优势在于无平台限制、低延迟和对GPU友好,但开发成本较高。
### UE5遮挡剔除源码阅读
UE5的遮挡剔除源码涉及多个类和结构体,如FPrimitiveOcclusionHistory、PendingOcclusionQuery、FRHIRenderQuery和FSceneViewState等。关键变量包括PrimitiveVisibilityMap、PrimitiveOcclusionHistorySet以及与多GPU支持相关的宏定义。
### 遮挡剔除流程
在延迟渲染管线中,遮挡剔除流程包含视锥体剔除、距离剔除、硬件遮挡剔除或分层Z缓冲剔除等多个阶段。在移动端前向渲染管线中,同样执行初始化视锥体、执行渲染前处理以及最终调用硬件遮挡查询的流程。
### 遮挡剔除调试
通过查看stat initviews、调用统计函数,可以深入了解各种遮挡剔除相关函数的调用次数和平均时间,有助于优化渲染性能。
UE5的遮挡剔除机制涉及多种技术,旨在提高游戏的渲染效率和视觉质量。通过源码阅读和调试,开发者可以深入了解并优化这些机制,实现更流畅、更高效的渲染体验。
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在相同参数情况下将获得同一个材质球。
DIY vue3组件: 动手实现高斯模糊遮罩层的对话框效果
前言 & 一点点废话
最近迷上了前端设计,想借此机会放松一下平日里繁忙的AI工作。帮朋友重构班级主页网站时,发现Vue3的模块化设计极为便捷,许多组件和钩子可以直接复用。因此,我决定整理并分享个人设计的组件实现。未来几篇文章将围绕这一主题展开。
你可能会问:为什么自己写组件,而不是直接使用像Element-Plus这样的库呢?答案是:尽管Element-Plus功能丰富,但其接口有限,样式定制难度较高,可能无法满足设计爱好者的需求。另外,大型组件库体积较大,对于追求轻量级和高效应用的开发者来说,自定义HTML5、CSS3与Vue3组件可能更为合适。我的组件库旨在简化复用流程,提供直观的特效展示,让使用者在短时间内上手,并能根据需求进行个性化定制。
为了帮助读者快速了解并复用组件,我将文章结构安排如下:
组件效果展示
登录界面和切换背景的对话框采用高斯模糊遮罩层,设计灵感源自苹果的特效,旨在吸引用户聚焦于对话框内容。
用法指南
参数设置说明:
槽位(Slot):用于嵌入自定义内容。
模板(Template)部分:展示基本结构与布局。
脚本(Script)部分:实现逻辑功能与状态管理。
只需通过设置showDialog为true即可激活对话框。
源码示例
请根据需求调整mainColor和backFilter变量。以下是一个可行的样式方案,供参考: