Unreal|UDN精选(第二期)

文摘   2024-10-31 21:49   广东  



Hello . 大家好

今天是UDN第二期


1
Overlay材质和LOD


Q:
正在使用Overlay材质来做一些简单的效果,但是将叠加材质应用于ISM/SM并将最大绘制距离设置为任何值时,网格会自动切换到最低的LOD级别,从而效果错误。此问题在编辑器和目标设备(PS4/PS5)上均会出现。这是预期行为吗?如果是这样,是否有办法在同时使用LOD和绘制距离时显示叠加材质?或者我必须将绘制距离设置为0?

A:这是一个带有叠加绘制距离的错误,已经将修复程序递交到Main中,应该会合并到5.6版本中          
https://github.com/EpicGames/UnrealEngine/commit/4f5b2cff03226f9ea5b6803be6b18c78d7bae8a2


2
将碰撞体渲染到RT


Q:对于我们的游戏,我们需要整个关卡的高度图(地形+一些actor)。最快的方法应该是使用USceneCaptureComponent2D自上而下地捕获关卡,相机设置为正交+捕获SceneDepth到R通道。这些都是在加载过程中完成的,因此捕获和回读RT值的性能对于我们的游戏来说是可以接受的。
问题是我们需要捕获碰撞体而不是actor,因此我们需要它与使用普通碰撞测试的游戏逻辑保持一致。
是否可以切换场景捕获以捕获actor以外的任何内容?

A:
我们支持使用ViewFamily.EngineShowFlags.CollisionPawn 1.0 在引擎中可视化碰撞几何体。因此,你可以在创建scene capture component2D 时添加此设置。你可以将此变量添加到 SceneCaptureDetails.cpp。启用捕获碰撞几何体,例如:ShowFlagsToAllowForCaptures.Add(FEngineShowFlags:EShowFlag:SF_CollisionPawn);   
然后,你就可以将后处理材质分配给输出深度,或者在R通道中使用SceneDepth或DeviceDepth来可视化正确性。

Q:
感谢回复,我还没有注意到这些flags。在我们的项目中,我们从代码中控制捕获组件,因此它实际上就像在CaptureScene调用之前设置标志一样简单。
CaptureComponent->ShowFlags.SetCollisionPawn(true);
这样子是可行的,但仅在开发/调试版本中,在发布时它又去捕获actor了。我猜这与此标志在shipping包(SHOWFLAG_FIXED_IN_SHIPPING) 中被固定为 0 有关。我尝试把它改成accessible但是还是没有变化。
深入了解了一下我猜这可能与STATICMESH_ENABLE_DEBUG_RENDERING宏有关,这个宏在发布中被禁用了(例如在 FStaticMeshSceneProxy:GetDynamicMeshElements 中)。另外我猜测在shipping包中启用STATICMESH_ENABLE_DEBUG_RENDERING 不是一个好主意,但是我没有进一步探索所以可能错过了一些其他的方法。
这是一个限制还是说有其他的办法可以让他在shipping中被使用呢?

A:
是的,这个已经在shipping中被删除了,因为它需要额外的资源,可能会降低性能。为了在包体中实现相同的效果,一种解决方案是尝试调整一些代码并将其移动到外部,以尽可能减少对性能的影响。
比如,你可以创建碰撞组件(比如UCapsuleComponent),并在FDrawCylinderSceneProxy:GetDynamicMeshElements() 中实现自定义渲染代码,以根据您的逻辑渲染碰撞几何体。


3
后处理材质中获得无抖动SceneDepth


Q:
在使用TSR或TAA时,如何从设置为Replacing the Tonemapper的后处理材质中获得无抖动的SceneDepth值?   
我们有一个后处理材质,blendable location设置为 Replacing the tonemapper(替换色调映射器)。我们想对此材质中的场景深度进行采样。
问题在于,当使用 TAA 或 TSR 时,SceneDepth 上的抖动不会像场景颜色那样被过滤。所以我们不能使用场景深度,因为它会非常抖动,尤其是在降低屏幕百分比时。
我注意到,可以在禁用 TAA 抖动的情况下进行自定义深度通道。但是,对于我们的用例,这意味着我们需要渲染整个第二个深度缓冲区,这是非常浪费的。
我还注意到,后期处理材质中的 View Property (查看属性) 节点公开了与时间样本相关的数据,这些数据是:
Temporal Sample Count、Index 和 Offset 的 Offset。我查看了引擎源代码,看看这些数据可以做什么,希望能找到与抵消 UV 抖动相关的内容,以消除抖动,我找到了等效的做法:


这确实有助于解决抖动的某些地方,但是也无法完全消除抖动,所以我在想是否可以对这些数据做些什么来消除抖动?

A:
首先是无法获得完全无抖动的深度。
原因是,取消抖动偏移,这不会改变输入保持锯齿的问题,并且根据抖动偏移,你正在栅格化的几何图形边缘上的锯齿仍将沿着边缘移动。它沿边缘移动的程度取决于几何边缘与像素网格的角度。
使用r.TemporalAA.Upsampling=1 或其他第三方temporal upscaler时,情况会更加严重,因为随着Screenpercentage的降低,锯齿的大小会变大。   
如果你在TAA之后读取自定义模板,我建议你在项目设置中禁用Custom Depth Stencil 的抖动,因为在 TAA 之前对自定义深度模板进行采样时,此选项会更具体地提供。
建议的另外一种方法是尝试考虑你做的效果是否可以在TAA之前的后处理材质中实现。

Q:
我们的游戏在后处理阶段有大量基于深度/蒙版/法线的边缘检测和类似的效果。如果我们把它们放在 TSR 之前,泛光效果会严重影响原始图像。
因此,我们在全分辨率 RT 上绘制几何体信息,类似于虚幻编辑器中的 MainTemporalUpsampleEditorDepthPS,然后对其进行合成。我们已经将此通道移植到 runtime。
我仔细研究了 MainTemporalUpsampleEditorDepthPS 的算法,它似乎依赖于 x2/x4 分辨率的 History Depth Buffer 来存储超分辨率信息,并通过查找 2x2/3x3 内的最大值和最小值来解决抖动问题。此算法无法解决使用 x1 分辨率 History Depth Buffer 时的抖动问题。
我还尝试了其他算法,例如 mix history depth buffer/store multi history depth buffer,但没有找到好的解决方案。现在我只有让它抖动了。

  

- End -



   

ABOUT US

 
关于我们



微信群

公众号

知识店铺



喜欢Thepoly的可以通过三种方式与我们建立联系。分别是公众号、微信群以及QQ群。公众号是我们最为官方的窗口,更多内容都必须关注公众号后才能获取。另外现已开通网站:www.thepoly.cn更多精彩请关注我们。

         

 

   

Thepoly
关注我。为大家提供更多CG行业动态和资讯,分享CG大拿制作经验,和大家一起学习进步。立志通过这个公共号让大家能得到更大的提升。
 最新文章