- 博客(343)
- 收藏
- 关注
原创 UE5——UMG——分析6
需要尽量把主界面Ul的drawcal控制在20以内,场景和角色/玩法就会有更多的性能发挥空间,很多3A追求的极简风UI是个不错的选择。解决思路:定制绘制流程,将icon和文字一次绘制,程序化绘制边框和品质背景色等信息,减少drawcal提交。5.通过合图集,材质内部拼接绘制可以显著减小drawcal,降低CPU开销,能解决一部分问题。引擎材质大部分逻辑默认是在PS执行,但UI的顶点很少,实际需要尽可能把逻辑放到VS做。2,合Instance,每个ltem一个Instance。
2024-03-19 23:15:13 377
原创 UE5——UMG——分析5
材质绘图:SDF 有向距离场1.每一个点的数值=离最近图形的距离值,形状内部为负值,外部为正值2.可以用于U边框,阴影等效果一次绘制,缩放不会变模糊,更加通用3.多个SDF容易合并,将简单图形组合成复杂图形一些高级应用:2.碰撞测试3.距离场阴影4.程序化建模5.体积云。
2024-03-19 22:31:37 394
原创 UE5——UMG——分析4
lmage:需要绘制的贴图或材质Tint:1.图片叠加颜色 2.Brush的最终颜色=lmage*TintDraW As1.Image 普通贴图/材质,4个顶点2.Border 九宫格边框贴图/材质,32个顶点,可单独控制tiling3.Box 九宫格贴图/材质,常用于绘制窗口面板背景,16个顶点4.RoundedBox圆角9宫格贴图/材质,常用于绘制圆角按钮等Margin(Box/Border专用)0utline Settings(RoundedBox专用)
2024-03-18 22:24:27 447
原创 UE5——UMG——分析3
1.UI贴图关掉MIPS,可以省掉3分之一内存,一般ASTC4x4压缩肉眼看不出变化,大色块图可以更激进。比如背包系统,能明确知道行列个数,每个ltem固定大小,可以在背包的容器层直接给出计算结果。4.绘制的element也可以改为自定义绘制的方式,自行缓存顶点索引等数据,避免每帧重新计算。3.在逻辑很明确时,可以override对应函数,直接给出布局结果,避免递归子Widget。虚幻商城和github都有第三方封装过的UMG组件,包括网格,粒子,Niagara等版本。
2024-03-18 20:51:57 293
原创 UE5——UMG——分析2
SlateWindow通过GetBubblePath,可以定位坐标位置的FWidgetPath实现对Widget的点击。真正绘制前会读取裁剪区域数据,调用RHI的ScissorRect实现裁剪。响应区,会在0nPaint前记录到Args的HittestGrid中。裁剪区域通过FSlateClippingManager栈式管理。Hittest区域会根据是否设置Visible来标记。我们需要缓存这个剪辑状态,以便下次绘制元素时使用。有裁剪区的控件,无法超出边界绘制。
2024-03-17 15:56:17 189
原创 UE5——UMG——分析1
SWiget控件基本都继承这个三大类:SPanel,SCompoundWidget,SLeafWidgetSLeafWidget:没有Slot的Widget,自己就是控件树的叶子节点SCompoundWidget:一个Slot的Widget,Slot内可以放置一个子WidgetSPanel:多个Slot的Widget,通过OnArrangeChildren对Widget布局。
2024-03-16 21:43:07 277
原创 UE5——源码阅读——168——将数据延迟和立即提交到GPU
是否是阴影贴图,是否存在虚拟阴影贴图缓存。这个容器管理渲染中失效的动态的基元实例。立即更新统一BUFF缓冲区。代表立即执行GPU写入操作。获取上传的基元数据的数量。收集延迟写入的具体信息。
2024-03-13 08:06:48 118
原创 UE5——源码阅读——167——GPU数据上传结构
基元数据存储动态渲染原始的数据。会返回一个基元ID的范围。实例自定义数据浮点的数量。代理将数据写入到GPU。GPU动态数据的上下文。管理给定视图动态基元。写入GPU的Pass。GPU写入的原始数据。
2024-03-13 07:47:33 114
原创 UE5——源码阅读——166——GPUScene
PostOpaqueRendering:在渲染不透明物体之后GPU写入操作。提高场景原始物体上传到数据的适配器,不支持Nanite材质表面上传的。在指定场景渲染过程中可以写入GPU场景的时机。判断每帧是否上传GPU的数据或者所有的图元。清除一组实例的范围数据,并把范围记录下来。场景数据上传到GPU,为后面渲染提供准备。是否开启GPUScene Undate。判断平台是否支持Nanite。创建Shader资源视图。填充包围盒的层次结构。对GPU场景可读可写。验证分组计数的有效性。是否进入外部访问模式。
2024-03-13 07:25:48 136
原创 UE5——源码阅读——165——GPU排序管理器
更新排序缓冲区,更新分配缓冲区和释放不在使用的缓冲区。完成排序批次的最终化,包含清理和准备的工作。GPU排序管理器,主要处理GPU排序任务。
2024-03-12 08:02:55 91
原创 UE5——源码阅读——164——粒子绘制
是否在渲染过程中,和确保在渲染过程中不会开始一个新的渲染过程。处于不是平面反射,不是场景捕获,不是反射捕捉。设置渲染目标,包含粒子模拟纹理和渲染纹理。创建一个渲染对象用于执行开始渲染过程。判断有多少遮挡查询并执行遮挡查询。通知特效系统场景即将被渲染。获取渲染目标和设置渲染目标。获取粒子注入的顶点着色器。缓存当前活动的渲染目标。从管道顶部开始遮挡查询。检测当前渲染是否被暂停。绑定顶点着色和像素着色。判断粒子是不是支持碰撞。
2024-03-12 07:50:38 110
原创 UE5——源码阅读——163——Nanite光线追踪管理更新
StagingAuxiliaryDataOffset:散层辅助数据的偏移量。RayTracingGeometryRHI:光线追踪的几何体。BaseMeshDateOffset:基于网格数据的偏移量。AuxiliaryDataOffset:辅助数据的偏移量。表示图形管线中标志的着色器频率数量 不包含计算着色器。AuxiliaryDataSize:辅助数据的大小。是否开启光线追踪,是否支持光线追踪的Shader。SegmentsMapping::段的映射。NumClusters:集群的数量。
2024-03-11 23:28:30 336 1
原创 UE5——源码阅读——162——光线追踪贴花
多少个贴花数据,准备上传到GPU。贴花代理在给定的视图中是否可见。创建BUFF描述和场景BUFF。用于单个Draw ,是临时的。准备shader添加Pass。是否为光线追踪贴花准备数据。用于多个的但只能用于当前帧。启用光线追踪的调试数据。创建光线追踪的贴花数据。获取绑定的Shader。用于多个的但可以跨帧。
2024-03-11 22:43:17 314
原创 UE5——源码阅读——161——提交管线状态
是否允许在给定的场景或视图中Lumen全局光照的功能。当前场景是否允许使用Lumen的功能。是否Lumen通过渲染环境遮罩。是否使用硬件光线追踪屏幕探测。是否使用光线追踪的全局照明。是否跳过全局追踪数据检测。是否使用自定义的光照模式。是否用光线追踪的环境遮挡。判断是否使用Lumen。是否支持屏幕空间反射。将值设置到管线里面去。扩展 给用户自定义的。
2024-03-11 21:44:43 205
原创 UE5——源码阅读——160——Nanite原理与家族管线
DiffuseIndirectDenoiser:漫反射间接光照的去躁的方法。DiffuseIndirectMethod:漫反射间接光照的计算方法。bFurthestHZB :是否需要从深度缓冲中生成最远的那个HZB。bClosestHZB:是否需要从深度缓冲中生成最近的那个HZB。屏幕空间的全局光照,在屏幕空间中采样计算模拟全局光照。ReflectionsMethod:反射的计算方法。屏幕空间全局光照,产生环境遮罩的缓冲。最新的全局光照,使用光线追踪的方法。禁用漫反射间接光照的计算方法。
2024-03-11 21:19:40 133
原创 UE5——源码阅读——159——特效光照遮蔽大气
在渲染Niagara着色器之前初始化RHI资源。根据场景中的天空光更新GPU的缓存。创建当前光源的基本交互任务完成。是不是渲染天空大气的效果。绘制Lumen可视化。初始化天空大气的资源。
2024-03-09 15:16:13 120
原创 UE5——源码阅读——158——Nanite遮挡剔除前注册视口
将你的屏幕上空间的位置转换到已经被转换过的世界空间的位置。是不是需要调试实例GPU场景的缓冲区。注册视图,注册到实例视图管理器中。获取Nanite最大边缘像素。获取Nanite最小边缘像素。构建平面,主要处理裁剪平面。判断有没有启用光线追踪。初始化光线追踪视图平移。设置全局的抖动淡入淡出。创建抖动统一着色器参数。创建淡出的统一BUFF。创建淡入的统一BUFF。是否覆盖绘制距离的原点。构建Nanite参数。转换后的全局裁剪平面。
2024-03-09 14:49:14 144
原创 UE5——源码阅读——157——运动模糊的时间缩放算法
把上一帧的视图信息保存到上一次的视图信息里。判断摄像机是否切换和摄像机重置路径追踪。当前世界没有被暂停和处于离线渲染。判断视图状态是不是需要遮挡查询。跟VR相关的动态遮挡查询的方法。拿到上一个遮挡查询的矩阵和原点。是不是需要重置路径追踪的累积。判断第一帧时间是不是被重置了。用于清除时域去躁的历史记录。判断投影矩阵是没有采样的。拿到运动模糊目标的FPS。是否强制摄像机的可见性。更新运动模糊的时间尺度。是不是重置当前摄像机。是不是小于真实的时间。相机是不是有大的移动。更新临时的LOD过度。
2024-03-09 14:11:10 162
原创 UE5——源码阅读——156——UE5是如何判断视口有大移动
计算当前帧与上一帧时间之间的差值。计算第一帧时间是否被重置。判断相机是否有大的移动。判断是不是要重置摄像机。保存上一帧的视图信息。检测视图偏移是否为0。
2024-03-09 13:47:47 122
原创 UE5——源码阅读——155——UE5是如何使用MASS和TAA算法
CVarTemporalAASamplesValue 都不等于的算法。保证当前像素是个恒定的时间采样密度,避免有对齐的收敛问题。将抗锯齿采样坐标转换为视图投影矩阵的偏移量。细分的算法,获取材质纹理的Mip的偏移。判断抗锯齿是不是以时间累计的方式。计算有效的主分辨率的比例。计算时间累积的抗锯齿数量。Box-muller变换。是否使用时间累积的方式。2xMSAA 采样算法。3xMSAA 采样算法。4xMSAA 采样算法。
2024-03-09 13:28:10 161
原创 UE5——源码阅读——154——运动模糊参数前期准备
RawOutput:只适用于VR渲染线程中动态分辨率和多重采样的抗锯齿,它会输出一个较小的矩形。SpatiaUpscale:在后处理过程中增加空间采样的步骤,来增加图像的分辨率。获取资源表的缓存,场景帧计数器赋值到资源表帧计数器。这个系数是向下采样的因子,根据分辨率的范围进行分割。检测成员变量是否使用了基于时间累计的抗锯齿方法。判断是不是立即执行的和是不是运行在渲染线程。遍历视图,主要设置运动模糊,检测移动的预值。根据是否降低采样的遮挡查询来计算遮挡像素的。准备加载场景路径追踪失效的计时器的值。
2024-03-09 12:42:38 158
原创 UE5——源码阅读——153——光照追踪环境准备
间接光的缓存,可以储存和重用间接光的数据结构,在渲染过程中记录间接光照,并储存在缓存中,在下一帧可以读取已经计算好的结果。GPU场景辅助,可以做GPU实例的剔除,在默认情况下移动平台禁用GPU场景实例化和剔除操作。设置最终要绘制的矩形框,根据是不是支持屏幕百分比来计算视图的矩形。根据当前引擎的ShowFlags,来确定光线追踪的网格命令模式。Nanite是否是活跃的 是的存在可视化标志。光线追踪模式是动态的,并且光线追踪能被改变。更新所有的基元场景信息的异步操作。指定当前视图的GPU的掩码。
2024-03-09 11:09:03 311
原创 UE5——源码阅读——152——渲染ViewFamilies
是否启用工具着色器 一个在桌面 一个在WINDOWS。是否启用发束 要启用插件 和渲染头发有关。判断平台是否支持窗口模式。判断是不是支持头发几何。获取GPU帧的时间统计。重置和收缩修改的边界。
2024-03-07 22:23:40 167
原创 UE5——源码阅读——151——GPU-Skin缓存视图
四边形过度绘制的着色器复杂度以像素着色器指令的计数来缩放。可视化,主要用于纹理流式传输和基元距离的精准性。主要用于纹理流式传输网格的UV密度的精准性。表示是否更新GPU的蒙皮缓存可视化的数据。主要用于纹理流式传输材质纹理缩放的精准性。是否允许GPU蒙皮缓存的可视化。拿到GPU蒙皮缓存可视化的数据。是否强制使用四边形的过度绘制。可视化流式纹理分辨率的精准性。是否强制使用纹理流式的构建。是否使用多个GPU的渲染。表示是否启用视图的模式。执行相关的视图扩展工作。是否强制使用流式的精度。是否支持跨GPU的复制。
2024-03-07 22:00:51 440
原创 UE5——源码阅读——150——渲染线程开始
DeferredAndAsync:延迟或异步清理场景渲染。Immediate:立即清理场景渲染。Deferred:延迟清理场景渲染。渲染ViewFamilies。等待所有的阴影网格绘制完成。刷新任务分配给RHI线程。刷新RHI线程在刷新资源。是不是需要等待任务完成。
2024-03-07 21:08:56 104
原创 UE5——源码阅读——146——批渲染绘制粗线条
线的Index 作为计数的。每次批处理线条的最大数量。相机对应位置的开始和结束。开始粗细 和结束粗细。
2024-03-06 23:07:19 107
原创 UE5——源码阅读——145——批渲染绘制点
计算三角形个数,一个点是由两个三角形构成的。记录到命令队列里面然后提交给GPU。创建BUFF和锁住BUFF。以视口的X轴作为参考的标准。计算原点基础世界的偏移。
2024-03-06 22:50:21 125
原创 UE5——源码阅读——144——批渲染CPU值传递到GPS
设置编辑器合成参数和其他参数。设置编辑器合成参数和其他参数。获取标准的遮罩像素着色。获取线性的遮罩像素着色。指定像素着色的RHI。指定像素着色的RHI。
2024-03-06 22:30:44 198
原创 UE5——源码阅读——143——批渲染BindShader到PSO
InTransform:世界坐标转视口坐标。设置顶点Shader和像素Shader参数。InFeatureLevel:功能级别。获取顶点Shader和像素Shader。ColorWeights:颜色权重。RHICmdList :命令列表。InGamma:Gamma值。Texture:纹理。
2024-03-06 21:52:28 101
原创 UE5——源码阅读——142——批渲染处理渲染
用于图层中根据一些透明通道遮挡,或保留其他图像的元素。调整亮度,对比度,饱和度 影响图层的显示效果。设置三角形列表 和设置管线状态。透明 Alpha可以用于写入。判断混合模式大于开始小于结束。缓存同时渲染的目标数是多少。深度模版目标是否存在纹理。准备一个批处理元素的参数。准备一个Color权重。仅用透明 Alpha。
2024-03-06 21:19:58 213
原创 UE5——源码阅读——141——批渲染PSO
放大着色器的指针 (可以将输入的几何数据进行扩展在生成多个几何数据,比如粒子 草地)网格着色器的指针(几何处理,可以复制几何操作 曲面细分,法线变换)几何着色器的指针 (几何处理和几何生成)是否存在片段密度的附件。深度模板目标像素格式。
2024-03-05 23:11:03 316
原创 UE5——源码阅读——140——批渲染RDG瓦片渲染
是应用于TranslatedViewProjectionMatrix这个矩阵之前的矩阵。没有AA抖动的投影矩阵(AA抖动就是抗锯齿,投影方式是剪裁空间中的Z等于1)可以将视图原点的位置量化,可以得到相对于瓦片的位置。生成相对世界坐标系到视图坐标系的矩阵。生成视图坐标系相对于世界坐标系的矩阵。上一帧视图坐标系到相对世界坐标系矩阵。可以被覆盖的平移的视口矩阵求逆。裁剪空间到相对世界坐标系的矩阵。是头戴显示器的矩阵去除滚动的。可以被覆盖的平移的视口矩阵。包含平移的 视口矩阵求逆。包含平移的 视口矩阵。
2024-03-05 22:24:07 320
原创 UE5——源码阅读——139——渲染
场景中是否存在未缓存的静态光照交互,如果存在,则需要进行完整的光照重建。基于当前功能级别创建多个场景渲染器。所有视图族都必须指向同一个场景。确保延迟的组件更新已经发送到渲染线程。在所有GPU上更新渲染目标的逻辑。获取鼠标和屏幕相关信息。
2024-03-04 22:46:47 172
原创 UE5——源码阅读——138——渲染
分配常量缓冲区,将常量缓冲区按照数量拷贝到常量缓冲区buff。映射表的索引,获取Shader参数。添加到队列,更新BUFF。更新统一缓冲区BUFF。
2024-03-04 22:25:25 138
原创 UE5——源码阅读——137——渲染
创建统一BUFF,UniformBufferLayout:描述Uniform Buffer布局和结构的类,它定义了参数数据在Uniform Buffer中的排列方式和结构。如果PoolBucket中有缓冲区,则从最后一个位置取出一个缓,中区,并进行一些检查。然后,更新统计信息,将缓冲区值给UniformBufferResource.判断池子是否打开,是不是在渲染线程,是不是RHI线程。生成一个统一BUFF,准备一个本地的CPU内容。定义缓冲区BUFF ,拿到池子的桶,创建BUFF,更新统计。
2024-03-04 22:15:06 292
原创 UE5——源码阅读——136——渲染
执行并行操作,大概意思是:用于在多个线程中执行相同的任务。函数的参数包括调试名称,循环次数、最小批次大小、要执行的函数、在并行for循环之前在主线程上执行的工作、标志以及可选的线程上下文。函数首先确定要使用的线程数,然后根据循环次数和线程数计算出批次大小和批次数。接下来函数根据优先级和任务类型创建并启动任务,并在主线程上执行预先工作。然后,函数使用并行执行器来执行循环体中的任务并等待所有任务完成。最后,函数检查任务是否全部完成,并进行一些断言和验证。更新Transform的变化和统一BUFF的变化。
2024-03-04 21:36:27 145
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人