1.UE5 源码结构解读——Unreal Engine 5文件系统详细导览
2.游戏引擎随笔 0x36:UE5.x Nanite 源码解析之可编程光栅化(下)
3.UE5 打包 iOS 超详细全图文流程附工具软件下载
4.UE5实践1.配置环境以及简单的源码shadingmodel添加
5.UE5 打包
6.UE5 ModelingMode & GeometryScript源码学习(一)
UE5 源码结构解读——Unreal Engine 5文件系统详细导览
欢迎加入“虚幻之核:UE5源码全解”,探索Unreal Engine 5(UE5)的下载深层秘密。作为一款行业领先的源码游戏引擎,UE5不仅集成了Nanite虚拟化微多边形几何系统和Lumen动态全局光照等革新技术,下载还提供了一个深度解析专栏,源码帮助开发者、下载java sku实现源码图形程序员和技术艺术家从源码级别理解其核心构造。源码
UE5不仅仅是下载一个游戏引擎,它代表了虚幻技术的源码巅峰,赋予了创造创新视觉和互动体验的下载无限可能。我们的源码专栏将深入探讨这些技术背后的源代码,揭示它们的下载工作原理,并展示如何在您的源码项目中实现和优化它们。
每一期专栏都是下载一个精心设计的知识模块,旨在让读者不仅掌握UE5的源码功能,更从源码层面掌握其实现细节。从资产流水线到渲染过程,从物理模拟到AI行为树,无论您希望优化当前项目性能,还是探索UE5隐藏的功能和技巧,这里都将为您提供宝贵的资源。
“虚幻之核:UE5源码全解”是您探索虚幻引擎深层秘密的起点,让我们用源码解答虚幻世界中的奥秘。
游戏引擎随笔 0x:UE5.x Nanite 源码解析之可编程光栅化(下)
书接上回。
在展开正题之前,先做必要的铺垫,解释纳尼特(Nanite)技术方案中的Vertex Reuse Batch。纳尼特在软光栅路径实现机制中,将每个Cluster对应一组线程执行软光栅,每ThreadGroup有个线程。在光栅化三角形时访问三角形顶点数据,但顶点索引范围可能覆盖整个Cluster的个顶点,因此需要在光栅化前完成Cluster顶点变换。纳尼特将变换后的顶点存储于Local Shared Memory(LDS)中,进行组内线程同步,确保所有顶点变换完成,光栅化计算时直接访问LDS,实现软光栅高性能。
然而,在使用PDO(Masked)等像素可编程光栅化时,纳尼特遇到了性能问题。启用PDO或Mask时,可能需要读取Texture,根据读取的Texel决定像素光栅化深度或是否被Discard。读取纹理需计算uv坐标,而uv又需同时计算重心坐标,增加指令数量,降低寄存器使用效率,影响Active Warps数量,降低延迟隐藏能力,导致整体性能下降。复杂材质指令进一步加剧问题。
此外,当Cluster包含多种材质时,同一Cluster中的三角形被重复光栅化多次,尤其是材质仅覆盖少数三角形时,大量线程闲置,浪费GPU计算资源。
为解决这些问题,纳尼特引入基于GPU SIMT/SIMD的Vertex Reuse Batch技术。技术思路如下:将每个Material对应的三角形再次分为每个为一组的Batch,每Batch对应一组线程,富人按部就班指标源码每个ThreadGroup有个线程,正好对应一个GPU Warp。利用Wave指令共享所有线程中的变换后的顶点数据,无需LDS,减少寄存器数量,增加Warp占用率,提升整体性能。
Vertex Reuse Batch技术的启用条件由Shader中的NANITE_VERT_REUSE_BATCH宏控制。
预处理阶段,纳尼特在离线时构建Vertex Reuse Batch,核心逻辑在NaniteEncode.cpp中的BuildVertReuseBatches函数。通过遍历Material Range,统计唯一顶点数和三角形数,达到顶点去重和优化性能的目标。
最终,数据被写入FPackedCluster,根据材质数量选择直接或通过ClusterPageData存储Batch信息。Batch数据的Pack策略确保数据对齐和高效存储。
理解Vertex Reuse Batch后,再来回顾Rasterizer Binning的数据:RasterizerBinData和RasterizerBinHeaders。在启用Vertex Reuse Batch时,这两者包含的是Batch相关数据,Visible Index实际指的是Batch Index,而Triangle Range则对应Batch的三角形数量。
当Cluster不超过3个材质时,直接从FPackedCluster中的VertReuseBatchInfo成员读取每个材质对应的BatchCount。有了BatchCount,即可遍历所有Batch获取对应的三角形数量。在Binning阶段的ExportRasterizerBin函数中,根据启用Vertex Reuse Batch的条件调整BatchCount,表示一个Cluster对应一个Batch。
接下来,遍历所有Batch并将其对应的Cluster Index、Triangle Range依次写入到RasterizerBinData Buffer中。启用Vertex Reuse Batch时,通过DecodeVertReuseBatchInfo函数获取Batch对应的三角形数量。对于不超过3个材质的Cluster,DecodeVertReuseBatchInfo直接从Cluster的VertReuseBatchInfo中Unpack出Batch数据,否则从ClusterPageData中根据Batch Offset读取数据。
在Binning阶段的AllocateRasterizerBinCluster中,还会填充Indirect Argument Buffer,将当前Cluster的Batch Count累加,用于硬件光栅化Indirect Draw的Instance参数以及软件光栅化Indirect Dispatch的ThreadGroup参数。这标志着接下来的光栅化Pass中,每个Instance和ThreadGroup对应一个Batch,以Batch为光栅化基本单位。
终于来到了正题:光栅化。本文主要解析启用Vertex Reuse Batch时的软光栅源码,硬件光栅化与之差异不大,此处略过。此外,本文重点解析启用Vertex Reuse Batch时的光栅化源码,对于未启用部分,除可编程光栅化外,与原有固定光栅化版本差异不大,不再详细解释。
CPU端针对硬/软光栅路径的Pass,分别遍历所有Raster Bin进行Indirect Draw/Dispatch。由于Binning阶段GPU中已准备好Draw/Dispatch参数,因此在Indirect Draw/Dispatch时只需设置每个Raster Bin对应的Argument Offset即可。
由于可编程光栅化与材质耦合,sdk含源码吗导致每个Raster Bin对应的Shader不同,因此每个Raster Bin都需要设置各自的PSO。对于不使用可编程光栅化的Nanite Cluster,即固定光栅化,为不降低原有性能,在Shader中通过两个宏隔绝可编程和固定光栅化的执行路径。
此外,Shader中还包括NANITE_VERT_REUSE_BATCH宏,实现软/硬光栅路径、Compute Pipeline、Graphics Pipeline、Mesh Shader、Primitive Shader与材质结合生成对应的Permutation。这部分代码冗长繁琐,不再详细列出讲解,建议自行阅读源码。
GPU端软光栅入口函数依旧是MicropolyRasterize,线程组数量则根据是否启用Vertex Reuse Batch决定。
首先判断是否使用Rasterizer Binning渲染标记,启用时根据VisibleIndex从Binning阶段生成的RasterizerBinHeaders和RasterizerBinData Buffer中获取对应的Cluster Index和光栅化三角形的起始范围。当启用Vertex Reuse Batch,这个范围是Batch而非Cluster对应的范围。
在软光栅中,每线程计算任务分为三步。第一步利用Wave指令共享所有线程中的Vertex Attribute,线程数设置为Warp的Size,目前为,每个Lane变换一个顶点,最多变换个顶点。由于三角形往往共用顶点,直接根据LaneID访问顶点可能重复,为确保每个Warp中的每个Lane处理唯一的顶点,需要去重并返回当前Lane需要处理的唯一顶点索引,通过DeduplicateVertIndexes函数实现。同时返回当前Lane对应的三角形顶点索引,用于三角形设置和光栅化步骤。
获得唯一顶点索引后,进行三角形设置。这里代码与之前基本一致,只是写成模板函数,将Sub Pixel放大倍数SubpixelSamples和是否背面剔除bBackFaceCull作为模板参数,通过使用HLSL 语法实现。
最后是光栅化三角形写入像素。在Virtual Shadow Map等支持Nanite的场景下,定义模板结构TNaniteWritePixel来实现不同应用环境下Nanite光栅化Pipeline的细微差异。
在ENABLE_EARLY_Z_TEST宏定义时,调用EarlyDepthTest函数提前剔除像素,减少后续重心坐标计算开销。当启用NANITE_PIXEL_PROGRAMMABLE宏时,可以使用此机制提前剔除像素。
最后重点解析前面提到的DeduplicateVertIndexes函数。
DeduplicateVertIndexes函数给每个Lane返回唯一的顶点索引,同时给当前Lane分配三角形顶点索引以及去重后的顶点数量。
首先通过DecodeTriangleIndices获取Cluster Local的三角形顶点索引,启用Cluster约束时获取所有Lane中最小的顶点索引,即顶点基索引。将当前三角形顶点索引(Cluster Local)减去顶点基索引,得到相对顶点基索引的局部顶点索引。
接下来生成顶点标志位集合。遍历三角形三个顶点,将局部顶点索引按顺序设置到对应位,作用域插槽源码表示哪些顶点已被使用。每个标志位是顶点的索引,并在已使用的顶点位置处设置为1。使用uint2数据类型,最多表示个顶点位。
考虑Cluster最多有个顶点,为何使用位uint2来保存Vertex Mask而非位?这是由于Nanite在Build时启用了约束机制(宏NANITE_USE_CONSTRAINED_CLUSTERS),该机制保证了Cluster中的三角形顶点索引与当前最大值之差必然小于(宏CONSTRAINED_CLUSTER_CACHE_SIZE),因此,生成的Triangle Batch第一个索引与当前最大值之差将不小于,并且每个Batch最多有个唯一顶点,顶点索引差的最大值为,仅需2个位数据即可。约束机制确保使用更少数据和计算。
将所有Lane所标记三个顶点的Vertex Mask进行位合并,得到当前Wave所有顶点位掩码。通过FindNthSetBit函数找出当前Lane对应的Mask索引,加上顶点基索引得到当前Lane对应的Cluster Local顶点索引。
接下来获取当前Lane对应的三角形的Wave Local的三个顶点索引,用于后续通过Wave指令访问其他Lane中已经计算完成的顶点属性。通过MaskedBitCount函数根据Vertex Mask以及前面局部顶点索引通过前缀求和得到当前Lane对应的Vertex Wave Local Index。
最后统计Vertex Mask所有位,返回总计有效的顶点数量。
注意FindNthSetBit函数,实现Lane与顶点局部索引(减去顶点基索引)的映射,返回当前Lane对应的Vertex Mask中被设置为1的位索引。如果某位为0,则返回下一个位为1的索引。如果Mask中全部位都设置为1,则实际返回为Lane索引。通过二分法逐渐缩小寻找索引范围,不断更新所在位置,最后返回找到的位置索引。
最后,出于验证目的进行了Vertex Reuse Batch的性能测试。在材质包含WPO、PDO或Mask时关闭Vertex Reuse Batch功能,与开启功能做对比。测试场景为由每颗万个三角形的树木组成的森林,使用Nsight Graphics进行Profiling,得到GPU统计数据如下:
启用Vertex Reuse Batch后,软光栅总计耗时减少了1.毫秒。SM Warp总占用率有一定提升。SM内部工作量分布更加均匀,SM Launch的总Warp数量提升了一倍。长短板Stall略有增加,但由于完全消除了由于LDS同步导致的Barrier Stall,总体性能还是有很大幅度的提升。
至此,Nanite可编程光栅化源码解析讲解完毕。回顾整个解析过程,可以发现UE5团队并未使用什么高深的黑科技,而是依靠引擎开发者强悍的工程实现能力完成的,尤其是在充分利用GPU SIMT/SIMD机制榨干机能的同时,保证了功能与极限性能的实现。这种能力和精神,都很值得我们学习。
UE5 打包 iOS 超详细全图文流程附工具软件下载
另见: UE5 打包 Android 全图文流程附工具软件下载
教程目标前置条件教程环境软件下载
见文末
详细步骤
VMware
在 Windows 上安装 VMware 虚拟机(以下简称 VM )
这里选不选无所谓
点击许可证,输入序列码,可直接激活。也可安装完毕后再激活。纵横暗雷源码
(关注微信公众号“GameDevLearning”后回复 “VMware .5 序列码”获取序列码。)
添加虚拟机的 MacOS 支持
下载 unlocker
关闭虚拟机
停止所有 VM 服务
下载 unlocker ,解压之,放到 VMware 的安装目录
等待安装完毕
之后务必重新回到服务页面,开启所有 VM 相关服务,否则后面 MacOS 可能没法正常联网。
MacOS 虚拟机的创建和设置
这里点浏览时可能默认只显示 iso 文件,自己手动在全部文件里找即可。
这里如果没有 MacOS 可选的话,就是 unlock 那步没做好,再走一遍即可。
磁盘最好 G 以上,否则后面可能不够用。
内存 8G 以上,否则可能卡。
在 smc.present = "TRUE" 后加一行输入 smc.version = "0"
如果蓝屏或者显示 BootManager,大概是你的 MacOS 镜像有问题,下载我们的即可。
MacOS 的安装
MacOS 的配置
点不出这个界面的话,大概率是之前 VM 的服务没有重新开启,开启后重启 MacOS 再操作即可。
MacOS 升级
不升级的话,可能无法正常下载和使用 XCode 。
VMTool 安装
不安装的话,可能无法在虚拟机和主机之间共享文件,如证书无法拖到主机。同时也可能无法把虚拟机里的 MacOS 全屏。
XCode
说明
确保苹果系统已经更新到了 Monterey 版本(.3+),否则无法下载和安装 XCode 。
XCode 安装
不让安装的话,大概率是 MacOS 系统不匹配,按上文所述的升级系统即可。
下载要点时间,安装也要点时间,安装完毕之后转圈也要一些时间,耐心等待即可。
XCode 配置
Product Name 要跟 UE 游戏工程里的 PROJECT_NAME 保持一致。
注意,这里的 Organization Identifier 格式为 com.mydomain ,虽然基本可以随意,但是要记住,因为后面 UE 中会用到。
如果用的虚拟机,插上手机后要点虚拟机右下角的图标让手机连接虚拟机,否则可能导致 XCode 这里看不到目标手机。
插上手机后,记得在弹出的窗口中选择信任。
要让这个新工程在你的手机上运行一下,“这是为了给 mobileprovision 增加设备 ID”
不一定是AppleID的密码,如果Mac有登录密码,这就是登录密码
MacOS 证件获取和导出
P 证书的名字随意,但最好单纯以字母和数字命名。
密码推荐用 MacOS 密码,免得密码多了搞混。
把这个目录下的2个 mobileprovision 文件直接拖到 Windows 主机上,以便后面在 UE 里使用。
在 Windows 主机上新建一个文本文件,名字叫做“.keychain.password”,里边填写 MacOS 的登录密码。
把 .keychain.password 文件拖到 MacOS 的用户根目录,就是 MacOS 中名字是你的用户名的那个目录。
拖过去之后你可能没法直接看到文件,没关系,只要拖动成功了,那就是已经存在,只是隐藏了,下边让你看看。
远程登录支持
拷贝下来,后面要用。
Itunes
说明
请从本文给出的下载地址下载,如直接下载 Windows Store 的,可能无法运行或导致打包失败。
Itunes 安装
Unreal 源码修改
总览
MobileProvisionUtilities.cs
倘若这个文件没有,去 git 的 unreal 页面,找到对应引擎的源码的这个工程,拷贝到对应地址即可。
IOSToolChain.cs
UEBuildIOS.cs
UE5 中的配置
这里不清楚是哪个 mobileprovision 文件的话,两个都导入就好(每个文件导入一次)
看到哪个 mobileprovision 的 Status 是 Valid,就在前面打钩选中。
导入 p 后会让输入证书的密码,输入之前设置的密码即可(就是 MacOS 的登录密码)。
看到状态是 Valid 就对了,前面打钩。
[PROJECT_NAME]不用修改,会自动设置的。但是记得确保 UE 里的跟 XCode 里的都一致。
这里的包名用之前 XCode 工程新建的时候提到的那个包名
按回车
会让提示输入一些信息,如红框处所示,分别输入 yes、MacOS 登录密码、直接回车(2次)即可。
按回车,输入登录密码,最后在提示“请按任意键继续”的地方继续按回车,等待几秒后,可见下图。
这里会自动设置好,除非之前的操作出问题了(出问题大概是 MacOS 的远程没设置好,或者密码错了等等,仔细检查前面的步骤即可)
在 UE5 中打包 iOS
插上 iPhone , 在虚拟机里可以看到如图提示,选“连接到主机”,然后在手机上点“信任”。
前面的操作没问题的话,这里就是单纯的手机名字了。如果不是这样,检查上一步的操作,以及 iTunes 的安装。
选择 IPA 文件等打包文件的存储地址。
打包成功后会自动安装到手机上,LOG 中有 IPA 地址,本地也会有对应的 IPA 文件。
问题答疑软件下载扩展阅读
声明:本文来自公众号:GameDevLearning,转载请附上原文链接及本声明。
UE5实践1.配置环境以及简单的shadingmodel添加
环境配置:使用Windows 系统,Unreal引擎版本5.0.2,Rider版本.1.1,Epic Games。首先,需要关联GitHub账户以访问私有引擎源码,通过github.com/EpicGames/Unreal获取源码。
构建项目:解压源码后,执行Setup命令,等待下载引擎文件,大约需时G左右,注意预留足够的磁盘空间。接着运行GenerateProjectFiles生成项目文件,此时可以看到.sln文件,可使用Rider或Visual Studio打开并构建项目。构建过程中可能会耗时较长,例如在晚上:开始构建,次日3:左右完成,最终成功启动引擎。
解决BUG:启动引擎后可能会遇到模块加载问题,这通常与使用Rider导致的插件加载问题有关。解决方法是在代码中将相关插件的EnabledByDefault属性设置为false即可。
自定义着色模型:在配置环境后,可以参考相关文章进行自定义着色模型的添加。具体步骤包括修改C++文件中的EngineTypes.h、MaterialShader.cpp、Material.cpp、MaterialShared.cpp等文件,以实现着色模型的添加。同时,需要修改HLSLMaterialTranslator.cpp、ShaderMaterial.h、ShaderMaterialDerivedHelpers.cpp、ShaderGenerationUtil.cpp等文件,以完成Gbuffer的写入。此外,调整PixelInspectorResult.h、PixelInspectorResult.cpp、PixelInspectorDetailsCustomization.cpp等文件,以优化序列化显示。
修改着色模型部分:通过修改ShadingCommon.ush、Definitions.usf、BasePassCommon.ush、DeferredShadingCommon.ush、ShadingModelsMaterial.ush等文件,实现自定义着色模型的添加。同时,需要调整ToonShadingCommon.ush、ShadingModels.ush、BasePassPixelShader.usf文件,以支持多光源的自定义着色模型。
最终效果:通过上述步骤,可以实现自定义着色模型的添加,支持多光源渲染,并得到支持多光源的CustomShadingModel效果。此外,还存在一种无需修改引擎代码的方法实现自定义着色模型。
UE5 打包
准备发布虚幻引擎项目时,遵循虚幻引擎5.1文档指南,设置定制化打包。
在开发模式下,尝试使用官方lyra项目在win和Android平台打包,结果成功运行。
在项目启动程序中添加Android相关配置,遇到编译apk时报错问题。通过在环境中添加java和配置Android SDK与NDK,进入Android快速入门教程。在win环境下,预览移动平台,进行打包apk操作。
遇到打包apk失败,查看日志文件,发现ue编辑器中nDisplay插件与DMXDisplayCluster插件之间存在兼容性问题。取消nDisplay插件与DMXDisplayCluster实现集成的勾选,并尝试移除DMXDisplayCluster不支持Android的限制,但依然无法成功打包。
探索官方DEMO打包过程,通过注释相关代码部分以编译通过,但打包继续报错。深入分析,发现声明遮盖了一个本地变量,通常表示存在作用域内同名变量或函数的冲突。
进行烘培操作2小时后,尝试打包win包,结果遇到异常。考虑到不安装引擎源码直接打包安卓包,遭遇新的异常情况。在打包过程中,遇到提示SDK未设置的错误提示,检查主工具栏的SDK部分,发现Android的SDK未正常安装,作为生成数据的必要组件。
在尝试忽略windows环境下的SDK问题后,继续遇到打包失败。最终,定位到ue引擎的源码目录,安装相关SDK后,打包过程得以顺利进行。整个过程中,需要仔细排查错误信息,结合文档和实践,逐步解决问题。
UE5 ModelingMode & GeometryScript源码学习(一)
前言
ModelingMode是虚幻引擎5.0后的新增功能,用于直接在引擎中进行3D建模,无需外接工具,实现快速原型设计和特定需求的模型创建。GeometryScript是用于通过编程方式创建和操控3D几何体的系统,支持蓝图或Python脚本,提供灵活控制能力。
本文主要围绕ModelingMode与GeometryScript源码学习展开,涵盖DMC简介、查找感兴趣功能源码、动态网格到静态网格的代码介绍。
起因
在虚幻4中,通过RuntimeMeshComponent或ProceduralMeshComponent组件实现简单模型的程序化生成。动态网格组件(DynamicMeshComponent)在UE5中提供了额外功能,如三角面级别处理、转换为StaticMesh/Volume、烘焙贴图和编辑UV等。
将动态网格对象转换为静态网格对象时,发现官方文档对DMC与PMC对比信息不直接涉及此转换。通过搜索发现,DynamicMesh对象转换为StaticMesh对象的代码位于Source/Runtime/MeshConversion目录下的UE::Modeling::CreateMeshObject函数中。
在UE::Modeling::CreateMeshObject函数内,使用UEditorModelingObjectsCreationAPI对象进行动态网格到静态网格的转换,通过HasMoveVariants()函数接受右值引用参数。UEditorModelingObjectsCreationAPI::CreateMeshObject函数进一步处理转换参数,UE::Modeling::CreateStaticMeshAsset函数负责创建完整的静态网格资产。
总结转换流程,DynamicMesh对象首先收集世界、变换、资产名称和材质信息,通过FCreateMeshObjectParams对象传递给UE::Modeling::CreateMeshObject函数,该函数调用UE::Modeling::CreateStaticMeshAsset函数创建静态网格资产。
转换为静态网格后,程序创建了一个静态网格Actor和组件。此过程涉及静态网格属性设置,最终返回FCreateMeshObjectResult对象表示转换成功。
转换静态网格为Volume、动态网格同样在相关函数中实现。
在Modeling Mode中添加基础形状涉及UInteractiveToolManager::DeactivateToolInternal函数,当接受基础形状时,调用UAddPrimitiveTool::GenerateAsset函数,根据面板选择的输出类型创建模型。
最后,UAddPrimitiveTool::Setup函数创建PreviewMesh对象,UAddPrimitiveTool::UpdatePreviewMesh()函数中通过UAddPrimitiveTool::GenerateMesh生成网格数据填充FDynamicMesh3对象,进而更新到PreviewMesh中。
文章总结了Modeling Mode与GeometryScript源码的学习路径,从动态网格到静态网格的转换、基础形状添加到输出类型对应函数,提供了一条完整的流程概述。
越学越多——获取虚幻源码
游戏开发领域,知识永无止境。
那么,如何获取虚幻引擎的源码呢?
获得源码方法一:
官方教程:unrealengine.com/zh-CN/...
第一步:关联账户
1. 打开Epic Games启动器,点击管理账户后,跳转网页。
2. 如果网页无法打开,直接访问unrealengine.com/accoun...
3. 进入后,点击关联GitHub账户,点击授权EpicGames按钮,完成OAuth应用授权流程。
4. 接收邮件,加入GitHub上的@EpicGames组织。
第二步:下载源码
1. 登录GitHub账号。
2. 在GitHub个人页面点击右上角Your profile,进入后点击这个图标(有这个图标表示已经加入虚幻组织)。
3. 进入后,找到虚幻源码仓库,双击进入。
4. 下载源码。
第三步:打开源码文件
1. 下载后解压,地址不能有中文和空格。
2. 运行setup.bat,可能报错无法下载。
- 第一种错误:Failed to download 'cdn.unrealengine.com/de...': 远程服务器返回错误: () 已禁止。 (WebException)
解决办法:要解决此问题,您需要获取位于此处的文件:github.com/EpicGames/Un...
然后替换engine/build/commit.gitdeps.xml版本中的文件。
文件在这,点击下载Commit.gitdeps.xml。
- 第二种错误:下载至%时,下载失败。
解决办法:UE4源码下载对于文件路径长度有要求,将文件夹名字改短即可,6个字符长度。
再次运行Setup.bat,即可成功。这个阶段时间很长。
双击运行GenerateProjectFiles.bat文件,运行结束会生成UE5.sln文件,这个就是源码啦!
获取源码方法二:
这个方法适合只是想要了解学习引擎底层原理,并不用于编译的情况。
快速打开代码去查看,一般用于非程序人员想要进阶了解引擎原理的时候。
前提,安装Visual Studio。
第一步:打开虚幻引擎工程。
第二步:新建蓝图类,比如actor。
第三步:新建C++组件,选择actor组件。
第四步:创建类。
第五步:完成,在Visual Studio里查看代码。
游戏引擎随笔 0x:UE5 Lumen 源码解析(一)原理篇
Lumen 原理与核心组件介绍
实时全局光照(RTGI)一直是图形渲染领域的追求目标。UE5的Lumen是基于Epic的新一代游戏引擎开发的RTGI解决方案,它结合了SDF、Voxel Lighting、Radiosity等技术,并且支持软件和硬件光线追踪的混合使用。Lumen的复杂性在于其庞大的源码库,包含个Pass和众多文件,涉及RTGI技术的集成和优化。核心理念
Lumen聚焦于解决Indirect Lighting中的漫反射,利用粗粒度场景描述和非物理精确计算来达到实时性能。核心数学原理是渲染方程,通过Monte Carlo积分简化计算。加速结构与SDF Ray Marching
Ray Tracing依赖加速结构,但GPU并行计算有限。Lumen使用SDF的Ray Marching技术,特别是Mesh DF(距离场)和Global DF(全局距离场)来实现无需硬件支持的SWRT,分别用于短距离和长距离的光线追踪。Surface Cache与Radiance Cache
Surface Cache存储物体表面的材质属性,通过Cube Map简化获取。Radiance Cache则整合了直接光照信息,支持无限反弹全局光照。Lumen Scene与Screen Space Probe
Lumen的低精度粗粒度场景由SDF(Mesh)和Surface Cache(Material)构建,Screen Space Probe用于自适应放置并生成光照信息。Voxel Lighting与Radiosity Indirect Lighting
Voxel Lighting体素化相机周围空间,存储光照信息,通过Radiosity生成间接光照,弥补了Lumen单次Bounce的限制。World Space Probe与降噪
Word Space Probe提供更稳定的远距离光照,通过Clipmap优化性能。降噪策略包括Temporal\Spatial Filter和Importance Sampling。总结与流程
Lumen的Indirect Diffuse流程涉及多个步骤,包括Lumen Scene更新、Lighting以及Final Gather,其GPU端流程图展示了核心数据和操作。