IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> ue5-Nanite运行时数据获取 -> 正文阅读

[游戏开发]ue5-Nanite运行时数据获取

nanite的执行起始:

VisBuffer64是可视信息的纹理对象,在NaniteRender.cpp中的FRasterContext InitRasterContext,这里对RasterContext的对象初始化,其中的VisBuffer64就在这里创建的纹理。

LumenSceneRendering的nanite阶段会初始化。

除了lumen的处理,在FDeferredShadingSceneRenderer::Render在开启了nanite后也会初始化

FDeferredShadingSceneRenderer::RenderHitProxies也在开启了nanite后处理,但是是在editor下开启的

在ShadowDepthRendering.cpp中RenderShadowDepthAtlasNanite也会在开启了nanite后初始化

RenderShadowDepthAtlasNanite是在FDeferredShadingSceneRenderer::Render的bOcclusionBeforeBasePass时执行RenderShadowDepthMaps时处理的。但是他不支持开启Hierarchical Z-Buffering分层Z缓冲(HZB)

nanite剔除处理:

Nanite的FDeferredShadingSceneRenderer::Render处理流程

Nanite::CullRasterize

实例剔除:

这里执行FCompactViewsVSM_CS的computehader,/Engine/Private/Nanite/InstanceCulling.usf,执行CompactViewsVSM_CS内核,这里主要是比较所有mipmap看有哪些PageRectBounds是没被遮挡的。

这里比较的是他的宽高和xy,如果宽高大于xy则说明不能被裁剪。

初始化:

然后执行FInitArgs_CS到/Engine/Private/Nanite/NaniteClusterCulling.usf的InitArgs,初始化clusterculling的信息。

几何体剔除:

AddPass_PrimitiveFilter,执行FPrimitiveFilter_CS的computeshader,执行到"/Engine/Private/Nanite/NanitePrimitiveFilter.usf"的"PrimitiveFilter"。这里主要对隐藏的对象做过滤。

视野裁剪:

然后执行AddPass_InstanceHierarchyAndClusterCull,如果有虚拟阴影则执行FInstanceCullVSM_CS,到"/Engine/Private/Nanite/NaniteInstanceCulling.usf"的"InstanceCullVSM"。

如果没有虚拟阴影则执行FInstanceCull_CS执行到"/Engine/Private/Nanite/NaniteInstanceCulling.usf"的"InstanceCull"。主要是执行BoxCullFrustum执行到NaniteHZBCull.ush的BoxCullFrustum做裁剪。分正交与透视视角,BoxCullFrustumOrthoNoClip和BoxCullFrustumGeneral。

节点剔除与簇剔除:

然后AddPass_InstanceHierarchyAndClusterCull执行FPersistentClusterCull_CS,执行到"/Engine/Private/Nanite/NaniteClusterCulling.usf"的"PersistentClusterCull"。

首先会执行NodeCull,在nodecull里面会拿出NodeData,然后解压字节为CandidateNode,通过andidateNode.InstanceId拿到FInstanceSceneData,通过FInstanceSceneData拿到FInstanceDynamicData。然后查看可见性

如果可见则通过BoxCullFrustum和GetScreenRect来判断是否在范围内。

HZB剔除:

如果NaniteView开启了HZB也就是多Mip层级的z-buffer剔除方案并且可见则核心查看IsVisibleHZB也就是是否通过层级被剔除掉

可以在NaniteHZBCull.ush中的IsVisibleHZB看到他的实现方案。

光栅化:

AddPass_Rasterize

首先会执行FHWRasterizePS,然后如果有用meshshader则执行FHWRasterizeMS。如果不用meshshader则用FHWRasterizeVS。是关于硬件光栅化。FHWRasterizeMS和FHWRasterizeVS都是做顶点处理,然后FHWRasterizePS对渲染做插值得到颜色信息。

然后执行FMicropolyRasterizeCS是执行软件光栅化,执行/Engine/Private/Nanite/NaniteRasterizer.usf"的"MicropolyRasterize"

材质、深度、速度、模板等信息保存:

FDeferredShadingSceneRenderer::Render中执行

Nanite::EmitDepthTargets,执行到NaniteMaterials.cpp的EmitDepthTargets。如果需要计算导出深度的话则执行FDepthExportCS,执行到"/Engine/Private/Nanite/NaniteDepthExport.usf"的"DepthExport"。这里主要输出场景的速度贴图,材质信息

如果不能走深度导出的话则首先判断如果支持模板标记则执行FEmitSceneDepthStencilPS("/Engine/Private/Nanite/NaniteExportGBuffer.usf"的"EmitSceneDepthStencilPS")或输出速度,深度,材质,模板信息。

如果不支持模板标记则执行FEmitSceneDepthPS("/Engine/Private/Nanite/NaniteExportGBuffer.usf"的"EmitSceneDepthPS")输出速度,深度。然后通过FEmitSceneStencilPS("/Engine/Private/Nanite/NaniteExportGBuffer.usf"的"EmitSceneStencilPS")更改深度信息。

最后执行FEmitMaterialDepthPS("/Engine/Private/Nanite/NaniteExportGBuffer.usf"的"EmitMaterialDepthPS")输出材质,深度信息。

最近与最远的层级深度信息获取:

接下来是SceneTextureReductions.cpp的BuildHZBFurthest,然后执行BuildHZB,首先他会将FurthestHZBTextureClosestHZBTexture的HZB故意位于单独的渲染目标中,因为在大多数情况下,只能选择其中一个。将它们分开,避免在这种情况下将缓存中的大小加倍,以避免性能下降。然后执行ReduceMips,里面的话是如果能执行computeshader则执行FHZBBuildCS("/Engine/Private/HZB.usf"的"HZBBuildCS")这里面主要是对所有mipmap执行四个像素找最大和最小深度值,因为ParentTextureMip是c++中传过来的SceneDepth

如果不用computeshader则用ps来输出FHZBBuildPS("/Engine/Private/HZB.usf", "HZBBuildPS")

上面是都i当前的最近和最远深度获取。然后下面就对其他mipmap获取相同的hzb的构建信息。

组织nanite光栅化数据:

Nanite::ExtractResults,这里主要是组织结果到数据结构FRasterResults中。

Nanite::AddVisualizationPasses,这个是nanite的可视化信息显示。

Nanite::GStreamingManager.SubmitFrameStreamingRequests,这里是提交这一帧的nanite的流数据。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 18:15:32  更:2022-04-18 18:17:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 20:53:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码