找回密码
 立即注册
查看: 209|回复: 0

Unreal如何使用 SceneViewExtension 扩展渲染系统?

[复制链接]
发表于 2022-7-15 20:49 | 显示全部楼层 |阅读模式
我们经常收到关于如何将新的渲染通道引入引擎的指导请求,特别是如何在不直接修改引擎代码的情况下实现这一点。我们一直在考虑如何改进渲染系统的模块化,以允许通过项目和插件注入通道和其他代码。
将代码注入帧中某些执行点的一种方法是利用 SceneViewExtension 系统。对于扩展的概述,我们建议首先阅读 SceneViewExtension.h 中的文档,其中解释了扩展以及如何实例化它,以及一些其他功能。本文的目的是通过强调一个特定的用例来深入研究如何开始。
我们已经在一些 Epic 创建的引擎插件中有几个用例。如果您在引擎中搜索“FSceneViewExtensionBase”的用法,您应该能够找到一些现有的示例。例如,FColorCorrectRegionsSceneViewExtension,它是Color Correct Regions 插件的一部分:


如果您首先查找文本“FColorCorrectRegionsSceneViewExtension”的实例,您应该能够找到在 UColorCorrectRegionsSubsystem 插件模块初始化期间注册的扩展:


此调用将使用 GEngine 的已知视图扩展的内部列表注册新创建的扩展。这意味着,在整个帧的某些点,可以引用这些注册的视图扩展,然后在这些特定时间调用它们的覆盖函数。
例如,在 ColorCorrectRegions 扩展中,FColorCorrectRegionsSceneViewExtension::PrePostProcessPass_RenderThread 已经覆盖了父 PrePostProcessPass_RenderThread 调用。在引擎函数 FDeferredShadingSceneRenderer::Render 内部,在执行“AddPostProcessingPasses”之前执行了以下代码,这意味着在帧中的此时正在调用新扩展的 PrePostProcessPass_RenderThread 函数。


同样,您可以查找在 SceneViewExtension.h 中声明的其他潜在函数及其执行点,以查看该扩展中引擎的其他一些可访问区域(例如,SetupViewPoint 在帧的早期执行,在 ULocalPlayer::GetViewPoint 中)。
通过上述所有设置,这意味着您现在可以根据需要设计自己的插件 PrePostProcessPass_RenderThread。我们将在此处继续使用 ColorCorrectRegions 实现作为示例。您可能已经注意到 PrePostProcessPass_RenderThread 的完整声明是:
void FColorCorrectRegionsSceneViewExtension::PrePostProcessPass_RenderThread(FRDGBuilder& GraphBuilder, const FSceneView& View, const FPostProcessingInputs& Inputs)其中三个输入变量是自定义代码的基本构建块。作为一个快速概述:

  • “const FSceneView& View”允许访问玩家相机的信息和 ViewUniformBuffer 资源(以及其他内容)。例如,在 ColorCorrectRegions 代码中,通过将 FSceneView 视图对象转换为 FViewInfo 对象并检索视图矩形来检索主视图矩形:


“const FPostProcessingInputs& Inputs”包含对所有已由先前帧传递(基本传递、照明等都在此时执行)解决的场景纹理(例如,包含在 FSceneTextureUniformParameters 中的 GBuffer 纹理)的访问。对于 ColorCorrectRegions,场景颜色纹理被专门提取,以便在它到达后处理通道之前在这个新通道中作为渲染目标使用+修改:


“FRDGBuilder&GraphBuilder” 是Rendering Dependency Graph的一部分,其中多个渲染通道按顺序排队然后执行。它从 FDeferredShadingSceneRenderer::Render 传入,其中许多其他渲染通道(例如所有后处理通道)被添加到 GraphBuilder 的长队列中。即 PrePostProcessPass_RenderThread 现在能够在 FDeferredShadingSceneRenderer::Render 管道中的“AddPostProcessingPasses”之前设置自己的绘图通道到 GraphBuilder 的队列系统中。
如果您查看 FColorCorrectRegionsSceneViewExtension::PrePostProcessPass_RenderThread 中的代码,您应该能够看到 ColorCorrectRegion 的自定义材质着色器执行的所有设置。创建自己的着色器的指南超出了本文的范围,但引擎中的一些更简单的示例是给定的 FColorCorrectRegionMaterialVS+PS 着色器、FGenerateMipsCS 和ShadersInPlugins 教程。
PrePostProcessPass_RenderThread 然后使用 GraphBuilder 的“AddPass”函数将绘制通道物理添加到代码中,以及所需的所有依赖项:


值得一提的是,并非所有 SceneViewExtension 函数都可以访问提供给 PrePostProcessPass_RenderThread 的相同输入。例如在 PostRenderBasePass_RenderThread 中,它在基本通道之后但在光照通道之前执行等,在 FDeferredShadingSceneRenderer::RenderBasePass 的末尾,你有:


这表明 ViewExtension 函数不接收 GraphBuilder 本身,而是接收当前 RHI 命令列表,因此可以直接从 RHI 层将附加功能添加到命令列表中,而不是设置新的 GraphBuilder 通道,或者您可以创建一个新的 GraphBuilder 并在新函数结束时执行它,然后返回到全局 GraphBuilder。这是一个细微的差别,但在设计任何新的自定义渲染功能时,需要牢记帧中的执行位置。
通常还有其他方法可以检索类似数据。PostRenderBasePass_RenderThread 缺少 FPostProcessingInputs 参数,因此从表面上看,似乎不能提供对 SceneTextures 的访问。但是,在这种情况下,您也可以使用调用“const FSceneTextures& SceneTextures = FSceneTextures::Get(GraphBuilder);” 检索场景纹理。
我们目前仅限于引擎中给出的示例,但是这个系统有很大的灵活性。如果您无法找到检索代码所需资源的方法,或者需要有关从何处开始自定义抽奖通行证的任何进一步建议,请通过 UDN 与我们联系,我们将尽最大努力帮助您正确的轨道。
重要提示:

Unreal软件电脑配置的要求是比较高的,特别是实时渲染,前期的硬件成本是比较高的,这里有一个简单的节省硬件成本的方法,使用呆猫云桌面,即使本地普通的电脑也能运行Unreal软件,且普通电脑也能享受行业最高端的CPU和GPU,极大提高制作效率和使用体验,且使用方便快捷,全面支持3D应用软件插件运行,随时调用百余款软件插件,高效作业。
呆猫云桌面可以利用云计算、虚拟化技术,为企业提供的云上虚拟Windows桌面及应用服务,提供VDI的云桌面交付方式,满足不同场景的需求,多终端接入,企业员工可随时随地访问桌面,提高企业办公效率,提升企业信息安全,保护企业数据资产,降低运维、设备成本。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-13 00:24 , Processed in 0.088542 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表