Scene View Extension是引擎提供的一个接口,可以方便地在后处理的某个pass后插入一个pass,相关的接口实现在Engine\Source\Runtime\Engine\Public\SceneViewExtension.h
。
本文将介绍这套工具的使用方法和实现逻辑。
简介
宏观层面,对于这个工具我们应该了解:
- 仅支持deferred shading path,mobile并没有这个特性。
- 支持在四个后处理pass后插入,分别是
- MotionBlur
- Tonemap
- FXAA
- VisualizeDepthOfField
- 这个工具的底层逻辑,是注册一个回调函数,在指定位置调用,该回调函数的签名是:
FUNC_DECLARE_DELEGATE(FAfterPassCallbackDelegate, FScreenPassTexture /*ReturnSceneColor*/, FRDGBuilder& /*GraphBuilder*/, const FSceneView& /*View*/, const FPostProcessMaterialInputs& /*Inputs*/)
即返回值FScreenPassTexture
,输入参数有三个:FRDGBuilder
、FSceneView
和FPostProcessMaterialInputs
。
- 除了回调函数提供的三个参数,还可以间接获得的参数包括
FViewInfo
:可以从FSceneView
转换过来:const FViewInfo* ViewInfo = static_cast<const FViewInfo*>(&View);
。FPostProcessingInputs
:从虚函数PrePostProcessPass_RenderThread
传入。
使用方法
在源码的Engine\Source\Runtime\Engine\Public\SceneViewExtension.h
文件里,Epic在注释里给出了SceneViewExtension的推荐用法。
第一步,创建一个类,继承自FSceneViewExtensionBase
:
class FMyExtension : public FSceneViewExtensionBase
{
public:
FMyExtension( const FAutoRegister& AutoRegister, FYourParam1 Param1, FYourParam2 Param2 )
: FSceneViewExten