图像后处理
后处理系统允许您在后处理阶段,对场景画面进行美化渲染、二次处理,以生成出更加精美的画面。
- 相关类
| 类 | 说明 |
|---|---|
| NPostFxPass | 后处理对象基类 |
| NMaterial | 渲染材质 |
| NMaterialShader | 材质着色器 |
| NCamera | 相机上存储了后处理的渲染列表 |
NPostFxPass
NPostFxPass类允许您创作自己的后处理方案,您可以在相关接口中使用材质渲染后处理画面,以增强画面结果。
- 变量
m_RenderMaterial:后处理的渲染材质
- 接口
| 接口 | 说明 |
|---|---|
| Init | 后处理初始化函数,初始化成功才会执行后处理渲染 |
| Execute | 后处理执行函数,在函数内重写后处理的渲染方式 |
| OnPostPresentToScreen | 后处理上屏函数,可以将画面直接上屏 |
| Serialize | 后处理序列化函数 |
| LateDeSerialized | 后处理反序列化函数 |
初始化接口
- 接口
virtual bool Init() override;- 返回值
bool:返回值表示是否初始化成功,返回false不会执行execute
- 描述
您可以在Init重载接口中,实现材质的初始化、需要使用的纹理初始化以及渲染纹理的申请。
bool PostProcessClass::Init()
{
if (!m_RenderMaterial)
{
// Initialize the Material for Rendering
// Code here.
}
if (!m_RenderMaterial)
{
// Initialize Failed!
return false;
}
return Super::Init();
}执行接口
- 接口
virtual void Execute(NRenderTexturePtr src, NRenderTexturePtr dest) override;- 参数
| 参数 | 说明 |
|---|---|
| src | 当前后处理的输入,通常为上一个后处理的输出 |
| dest | 当前后处理的输出 |
- 描述 您可以在Execute重载接口中,实现后处理的相关逻辑。 当dest没有写入时,最终输出画面可能是未定义的。 在Execute接口中,您可以通过NGraphics的Blit接口将src通过特定材质渲染到dest上,以渲染自定义后处理。 当Execute接口中没有其他逻辑时,请通过src的BlitToRenderTexture接口将src的画面Blit到dest上,以实现画面的传递。
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);
}上屏接口
- 接口
virtual void OnPostPresentToScreen(NRenderTexturePtr src) override;- 参数
src:当前后处理的输入,通常为上一个后处理的输出
- 描述
您可以在OnPostPresentToScreen重载接口中,实现后处理的上屏逻辑。 由于参数只有输入src,当使用NGraphics的Blit函数时,请将target参数设置为nullptr,以实现画面上屏。
bool PostProcessClass:: OnPostPresentToScreen (NRenderTexturePtr src)
{
NGraphics::Blit(src, nullptr, m_RenderMaterial);
}序列化与反序列化接口
- 接口
virtual void Serialize(Archive& archive) override;
virtual void LateDeSerialized() override;- 参数
archive:序列化对象
- 描述
您可以在Serialize重载接口中,实现后处理的相关参数的序列化。 您可以在LateDeSerialized重载接口中,实现反序列化之后的相关处理逻辑。 序列化与反序列化相关的用法参考标准Component。
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 | 获取相机的后处理列表 |
添加后处理
- 接口
template<class T>
NWeakObjectPtr<T> AppendPostFXPass();- 参数
T:模板函数,T表示后处理类
- 描述
您可以通过NCamera的AppendPostFXPass接口给相机添加后处理,参数使用后处理的类名,引擎会将后处理对象的指针返回给您,请记录好该指针,移除时需要使用该指针。
bool ExampleClass::Start()
{
NCameraPtr camera = NCamera::MainCamera();
Post_TMORef postPass = camera->AppendPostFXPass<Post_TMO>();
}移除后处理
- 接口
void RemovePostFXPass(NPostFXPassRef pass, bool removeAndRelease = true);- 参数
| 参数 | 说明 |
|---|---|
| pass | 要移除的后处理对象 |
| removeAndRelease | 是否立即释放后处理对象 |
- 描述
您可以通过NCamera的RemovePostFXPass接口从相机移除后处理,参数使用添加后处理时得到的指针。 当removeAndRelease参数为true时,会立即释放后处理对象,pass会立刻失效;否则,您可以将其添加到其他的相机上使用。
bool ExampleClass::Start()
{
NCameraPtr camera = NCamera::MainCamera();
Post_TMOPtr postPass = camera->AppendPostFXPass<Post_TMO>();
camera->RemovePostFXPass(postPass, true);
}清空后处理
- 接口
void ClearPostFXPass();- 描述
您可以通过NCamera的ClearPostFXPass接口从相机清空后处理对象。 这个接口会默认使所有后处理对象都立刻释放内存。
bool ExampleClass::Start()
{
NCameraPtr camera = NCamera::MainCamera();
camera-> ClearPostFXPass;
}获取后处理列表
- 接口
std::vector<NPostFXPassRef> GetPostFxPasses() const;- 返回值
std::vector<NPostFXPassRef>后处理对象列表
- 描述
您可以通过NCamera的GetPostFxPasses接口从相机获取所有后处理对象。
bool ExampleClass::Start()
{
NCameraPtr camera = NCamera::MainCamera();
camera->GetPostFxPasses();
}后处理的编辑器操作
您可以通过编辑器选中相机,给相机添加后处理、移除后处理、后处理排序和后处理反射属性更改。
编辑器操作
首先,您需要修改相机允许挂载的后处理个数到需要的数字。
然后,您可以通过展开的Element列表的同心圆符号或者后处理文件拖动,给相机添加后处理。
通过圆锥符号选择后处理 当相机上有多个后处理时,可以通过拖拽实现后处理的排序。
当需要删除后处理时,右键删除后处理。
当需要修改后处理的相关参数时,通过反射面板修改即可。 

