1.UGUI源码阅读之Mask
2.WPF 漂亮长方体、遮图遮罩正文体简单实现方法 Path实现长方体 正方体方案 WPF快速实现长方体、源码正方体的代码方法源代码
3.unity Mask遮罩效果
4.Unity源码学习遮罩:Mask与Mask2D
5.[UE5] 遮挡剔除 源码阅读
UGUI源码阅读之Mask
Mask主要基于模版测试来进行裁剪,因此先来了解一下unity中的遮图遮罩模版测试。
Unity Shader中的源码模版测试配置代码大致如上
模版测试的伪代码大概如上
传统的渲染管线中,模版测试和深度测试一般发生在片元着色器(Fragment Shader)之后,代码foc2.0源码但是遮图遮罩现在又出现了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使用相同的,它们处于不同的es源码环境Mask之下,但是只要m_StencilValue相等,两个RawImage还是可以进行合批。同时可以看到Mask1和Mask1 (1),Mask2和Mask2 (1)也进行了合批,说明stencilDepth相等的Mask符合合批规则也可以进行合批。
StencilMaterial.Add会将修改后的材质球缓存在m_List中,因此调用StencilMaterial.Add在相同参数情况下将获得同一个材质球。
WPF 漂亮长方体、正文体简单实现方法 Path实现长方体 正方体方案 WPF快速实现长方体、正方体的方法源代码
在WPF中实现类似长方体视觉效果的图形,这段XAML代码采用了声明式绘制方法,利用Path、PathGeometry和PathFigure等元素,以一种清晰直观的方式精确描述了长方体每个面的位置和形状。无需复杂的绘图逻辑,通过Path元素的组合,实现了长方体视觉效果的高效实现。
通过Panel.ZIndex属性定义的层次结构与ZIndex控制,使得图形能够展现立体感和前后遮挡效果。设置负值的边框线条显示在表面之下,模拟了长方体的边缘效果,增强立体感。开发api源码在颜色填充与样式定义上,通过Fill属性和Stroke属性,可以方便地定义各部分的颜色与轮廓线,实现复杂渐变、纹理等填充效果,以及不同宽度和颜色的线条,大幅增强了图形的表现力。
为了提高复用性和模块化设计,长方体可以被封装为一个用户控件或数据模板,将这些Path元素整合为一个可复用的组件,提升代码的组织性和维护性。动态调整与数据绑定特性使得所有几何路径点的坐标值能够作为动态属性进行绑定,根据运行时的数据变化自动调整长方体的大小和位置,实现动画效果或响应式布局。
由于使用的是标准WPF控件和属性,这段代码在Visual Studio或其他支持WPF的设计器中,能够直接预览和编辑长方体图形,大大提升了UI设计效率。WPF的强大矢量图形绘制功能及声明式编程模型,确保了代码的简洁性和视觉效果的高质量,同时提供了良好的扩展性。
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创建相应的Material。
镜子Shader-Plane用于实现场景中的mask遮罩效果。
其原理是利用Plane和Cube的Render Queue值来控制半透明和不透明的渲染顺序。
在Frame Debugger中,魔镜的做法是用天空盒覆盖场景,并设置总是通过模板测试,以覆盖魔镜背后的现实物体。
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。 RectMask2D的性能优化在于无需依赖Image组件,直接使用RectTransform的大小作为裁剪区域。3. 性能区别
Mask需要Image组件,裁剪区域受限于Image,而RectMask2D独立于Image,裁剪灵活。因此,Mask2D在不需要复杂裁剪时更高效。 总结:虽然Mask和Mask2D各有优势,选择哪种遮罩取决于具体需求,合理使用能提高性能和用户体验。[UE5] 遮挡剔除 源码阅读
这篇文章旨在深入解析虚幻引擎5(UE5)原生的遮挡剔除机制,重点关注硬件遮挡剔除,并简述其他遮挡剔除技术及调试方法。此外,文章还涉及到移动端软件遮挡剔除技术的介绍和移动端的特定遮挡剔除流程。以下为详细内容。
### 遮挡剔除技术概览
UE5采用多种方法进行遮挡剔除,包括硬件遮挡剔除、分层Z缓冲遮挡剔除、视锥体剔除、距离剔除、体积剔除,以及特殊的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的遮挡剔除机制涉及多种技术,旨在提高游戏的渲染效率和视觉质量。通过源码阅读和调试,开发者可以深入了解并优化这些机制,实现更流畅、更高效的渲染体验。