Skip to content

图像后处理

后处理系统允许您在后处理阶段,对场景画面进行美化渲染、二次处理,以生成出更加精美的画面。

  • 相关类
说明
NPostFxPass后处理对象基类
NMaterial渲染材质
NMaterialShader材质着色器
NCamera相机上存储了后处理的渲染列表

NPostFxPass

NPostFxPass类允许您创作自己的后处理方案,您可以在相关接口中使用材质渲染后处理画面,以增强画面结果。

  • 变量

m_RenderMaterial:后处理的渲染材质

  • 接口
接口说明
Init后处理初始化函数,初始化成功才会执行后处理渲染
Execute后处理执行函数,在函数内重写后处理的渲染方式
OnPostPresentToScreen后处理上屏函数,可以将画面直接上屏
Serialize后处理序列化函数
LateDeSerialized后处理反序列化函数

初始化接口

  • 接口
cpp
virtual bool Init() override;
  • 返回值

bool:返回值表示是否初始化成功,返回false不会执行execute

  • 描述

您可以在Init重载接口中,实现材质的初始化、需要使用的纹理初始化以及渲染纹理的申请。

cpp
bool PostProcessClass::Init()
{
    if (!m_RenderMaterial)
    {
        // Initialize the Material for Rendering
        // Code here.
    }
    if (!m_RenderMaterial)
    {
        // Initialize Failed!
        return false;
    }
    return Super::Init();
}

执行接口

  • 接口
cpp
virtual void Execute(NRenderTexturePtr src, NRenderTexturePtr dest) override;
  • 参数
参数说明
src当前后处理的输入,通常为上一个后处理的输出
dest当前后处理的输出
  • 描述 您可以在Execute重载接口中,实现后处理的相关逻辑。 当dest没有写入时,最终输出画面可能是未定义的。 在Execute接口中,您可以通过NGraphics的Blit接口将src通过特定材质渲染到dest上,以渲染自定义后处理。 当Execute接口中没有其他逻辑时,请通过src的BlitToRenderTexture接口将src的画面Blit到dest上,以实现画面的传递。
cpp
bool PostProcessClass::Execute(NRenderTexturePtr src, NRenderTexturePtr dest)
{
    if (!m_InitSuccess && !Init())
	{
	     // If initialize Failed and try again Failed, Blit src to dest.
	     src->BlitToRenderTexture(dest);
	     return;
	}
	/*
	m_RenderMaterial->SetShaderProperty("mainTexture", src, ESurfaceInRenderTexture::ColorSurface);

	m_RenderMaterial->SetShaderProperty("colorTexture", NGraphics::GetSceneRenderTexture(), ESurfaceInRenderTexture::ColorSurface);

	m_RenderMaterial->SetShaderProperty("depthTexture", NGraphics::GetSceneRenderTexture(), ESurfaceInRenderTexture::DepthSurface);
	*/
	NGraphics::Blit(src, dest, m_RenderMaterial);
}

上屏接口

  • 接口
cpp
virtual void OnPostPresentToScreen(NRenderTexturePtr src) override;
  • 参数

src:当前后处理的输入,通常为上一个后处理的输出

  • 描述

您可以在OnPostPresentToScreen重载接口中,实现后处理的上屏逻辑。 由于参数只有输入src,当使用NGraphics的Blit函数时,请将target参数设置为nullptr,以实现画面上屏。

cpp
bool PostProcessClass:: OnPostPresentToScreen (NRenderTexturePtr src)
{
	NGraphics::Blit(src, nullptr, m_RenderMaterial);
}

序列化与反序列化接口

  • 接口
cpp
virtual void Serialize(Archive& archive) override;
virtual void LateDeSerialized() override;
  • 参数

archive:序列化对象

  • 描述

您可以在Serialize重载接口中,实现后处理的相关参数的序列化。 您可以在LateDeSerialized重载接口中,实现反序列化之后的相关处理逻辑。 序列化与反序列化相关的用法参考标准Component。

cpp
void PostProcessClass::Serialize(Archive& ar)
{
    Super::Serialize(ar);
    // SERIALIZE(m_EnableRotate);
}
void PostProcessClass::LateDeSerialized()
{
    // After all Serialize are executed
    Super::LateDeSerialized();
}

后处理与NCamera

您可以通过NCamera类,在运行时动态增删查改后处理对象。

  • 接口
接口说明
AppendPostFXPass添加后处理
RemovePostFXPass移除后处理
ClearPostFXPass清空相机的后处理列表
GetPostFxPasses获取相机的后处理列表

添加后处理

  • 接口
cpp
template<class T>
NWeakObjectPtr<T> AppendPostFXPass();
  • 参数

T:模板函数,T表示后处理类

  • 描述

您可以通过NCamera的AppendPostFXPass接口给相机添加后处理,参数使用后处理的类名,引擎会将后处理对象的指针返回给您,请记录好该指针,移除时需要使用该指针。

cpp
bool ExampleClass::Start()
{
	NCameraPtr camera = NCamera::MainCamera();
	Post_TMORef postPass = camera->AppendPostFXPass<Post_TMO>();
}

移除后处理

  • 接口
cpp
void RemovePostFXPass(NPostFXPassRef pass, bool removeAndRelease = true);
  • 参数
参数说明
pass要移除的后处理对象
removeAndRelease是否立即释放后处理对象
  • 描述

您可以通过NCamera的RemovePostFXPass接口从相机移除后处理,参数使用添加后处理时得到的指针。 当removeAndRelease参数为true时,会立即释放后处理对象,pass会立刻失效;否则,您可以将其添加到其他的相机上使用。

cpp
bool ExampleClass::Start()
{
	NCameraPtr camera = NCamera::MainCamera();
	Post_TMOPtr postPass = camera->AppendPostFXPass<Post_TMO>();
	camera->RemovePostFXPass(postPass, true);
}

清空后处理

  • 接口
cpp
void ClearPostFXPass();
  • 描述

您可以通过NCamera的ClearPostFXPass接口从相机清空后处理对象。 这个接口会默认使所有后处理对象都立刻释放内存。

cpp
bool ExampleClass::Start()
{
	NCameraPtr camera = NCamera::MainCamera();
	camera-> ClearPostFXPass;
}

获取后处理列表

  • 接口
cpp
std::vector&lt;NPostFXPassRef> GetPostFxPasses() const;
  • 返回值

std::vector<NPostFXPassRef>后处理对象列表

  • 描述

您可以通过NCamera的GetPostFxPasses接口从相机获取所有后处理对象。

cpp
bool ExampleClass::Start()
{
	NCameraPtr camera = NCamera::MainCamera();
	camera->GetPostFxPasses();
}

后处理的编辑器操作

您可以通过编辑器选中相机,给相机添加后处理、移除后处理、后处理排序和后处理反射属性更改。

编辑器操作

首先,您需要修改相机允许挂载的后处理个数到需要的数字。 alt text 然后,您可以通过展开的Element列表的同心圆符号或者后处理文件拖动,给相机添加后处理。 alt text 通过圆锥符号选择后处理 当相机上有多个后处理时,可以通过拖拽实现后处理的排序。 alt text 当需要删除后处理时,右键删除后处理。 alt text 当需要修改后处理的相关参数时,通过反射面板修改即可。 alt text