UE4 后期处理 PostProcess

https://zhuanlan.zhihu.com/p/32593741

在GDC2014上,UE4就提出了它移动端后期处理管线设计(参考Next_Generation_Mobile_Rendering 文章)

流程大致是

降低分辨率(Smart Reduction)(在各个Pass里处理,没有直接降低RT分辨率)->

景深(Depth of Field) (可有可无) ->

模糊(Bloom)->

光轴(LightShaft)->

混合(Vignette +Bloom + Light Shafts)->

色调映射(Tonemapping)->

抗锯齿(Anti-Aliasing)

移动端后期处理

代码在FPostProcessing::ProcessES2中

先定义了2个上下文

FRenderingCompositePassContext CompositeContext(RHICmdList, View);
FPostprocessContext Context(RHICmdList, CompositeContext.Graph, View);

CompositeContext其实其中有个后期处理Pass列表,把需要做的后期处理全部缓存在其中,然后一起运行(Processs)

FRenderingCompositePass 最基础Pass的基类

virtual const FRenderingCompositeOutputRef* GetInput(EPassInputId InPassInputId) const = 0;
virtual void SetInput(EPassInputId InPassInputId, const FRenderingCompositeOutputRef& InOutputRef) = 0;
virtual void Process(FRenderingCompositePassContext& Context) = 0;

包含Input 对象是个FRenderingCompositeOutputRef
类型,也就是其他Pass 渲染完输出的结果可以作为Input传入,在此基础上绘制

真正的Pass列表是FRenderingCompositionGraph

//注册Pass
template<class T>
T* RegisterPass(T* InPass)
{
check(InPass);
Nodes.Add(InPass);
return InPass;
}
//pass节点列表
TArray<FRenderingCompositePass*> Nodes;
//迭代运行pass
void RecursivelyProcess(const FRenderingCompositeOutputRef& InOutputRef, FRenderingCompositePassContext& Context)const;

最终会执行到RecursivelyProcess方法

后面代码就是加入各种Pass

  • 加入后期自定义材质Pass

AddPostProcessMaterial(Context, BL_BeforeTranslucency, nullptr);
AddPostProcessMaterial(Context, BL_BeforeTonemapping, nullptr);
  • 加入BloomSetUp Pass
FRenderingCompositePass* Pass= Context.Graph.RegisterPass(new(FMemStack::Get()) FRCPassPostProcessBloomSetupES2(FinalOutputViewRect, bViewRectSource));
Pass->SetInput(ePId_Input0, Context.FinalOutput);
PostProcessBloomSetup = FRenderingCompositeOutputRef(Pass);
  • 加入DOF Pass
  • 加入7个Bloom Pass

注意每个Bloom Pass 传入的Input不一样,窗口大小(ViewportSize)也不一样

// Downsample by 2
{
FRenderingCompositePass* Pass = Context.Graph.RegisterPass(new(FMemStack::Get()) FRCPassPostProcessBloomDownES2(PrePostSourceViewportSize/4,DownScale));
Pass->SetInput(ePId_Input0, PostProcessBloomSetup);
PostProcessDownsample2 = FRenderingCompositeOutputRef(Pass);
}// Downsample by 2
{
FRenderingCompositePass* Pass = Context.Graph.RegisterPass(new(FMemStack::Get()) FRCPassPostProcessBloomDownES2(PrePostSourceViewportSize/8, DownScale));
//使用前一个Pass
Pass->SetInput(ePId_Input0, PostProcessDownsample2);
PostProcessDownsample3 = FRenderingCompositeOutputRef(Pass);
}
  • 加入LightShaft Pass
  • 加入separate translucency

如果启用了SeparateTranslucency加入 SeparateTranslucency Pass
if (IsMobileSeparateTranslucencyActive(Context.View))
{
FRCSeparateTranslucensyPassES2* Pass = (FRCSeparateTranslucensyPassES2*)Context.Graph.RegisterPass(new(FMemStack::Get()) FRCSeparateTranslucensyPassES2());
Pass->SetInput(ePId_Input0, Context.FinalOutput);
Context.FinalOutput = FRenderingCompositeOutputRef(Pass);
}
  • 加入Tonemap Pass
  • 加入AA Pass
  • 根据DebugViewShaderMode 类型 加入对应的Pass

  • 最后执行Pass 也就是执行RecursivelyProcess
GRenderTargetPool.CreateUntrackedElement(Desc, Temp, Item);OverrideRenderTarget(Context.FinalOutput, Temp, Desc);CompositeContext.Process(Context.FinalOutput.GetPass(), TEXT("PostProcessingES2"));

Pass降低分辨率方法

通过DrawRectangle设置Dst大小是Src大小 的1/4,通过降低绘制分辨率,提高性能

void FRCPassPostProcessBloomSetupES2::Process(FRenderingCompositePassContext& Context)
{
//目标是PrePostSourceViewportSize大小的一半
uint32 DstX = FMath::Max(1, PrePostSourceViewportSize.X/2);
uint32 DstY = FMath::Max(1, PrePostSourceViewportSize.Y/2);FIntRect DstRect;
DstRect.Min.X = 0;
DstRect.Min.Y = 0;
DstRect.Max.X = DstX;
DstRect.Max.Y = DstY;FIntPoint DstSize = PrePostSourceViewportSize / 2;
FIntPoint SrcSize;
FIntRect SrcRect;
if(bUseViewRectSource)
{
// Mobile with framebuffer fetch uses view rect as source.
const FSceneView& View = Context.View;
SrcSize = InputDesc->Extent;// SrcRect 就是原先大小
SrcRect = PrePostSourceViewportRect;
}
…
//通过DrawRectangle缩放
DrawRectangle(
Context.RHICmdList,
0,
0,
DstX, DstY,
SrcRect.Min.X, SrcRect.Min.Y,
SrcRect.Width(), SrcRect.Height(),
DstSize,
SrcSize,
*VertexShader,
EDRF_UseTriangleOptimization);

UE4 后期处理 PostProcess相关推荐

  1. ue4 后期处理景深_Unreal Engine4 后期处理特效 VOL1

    这次为大家带来的一套教学内容是后期处理的相关内容. 我们知道,不论是在做游戏还是在做VR地产等非游戏领域,甚至是在实施影视合成与调色中,后期处理都是能够为画面带来非常多的加分选项. 后期处理涉及到的内 ...

  2. UE4 后期处理体积 (角色受到伤害场景颜色变淡案例)

    在上一篇博客中(UE4 第一人称角色模板 添加生命值和调试伤害)已经完成了角色生命值减少的功能,本文在此基础上通过后期处理组件来继续增加场景颜色随着生命值减少而变淡的效果. 效果: 在按下p键来减少生 ...

  3. ue4 后期处理景深_【UE4设计师】2-3后期处理效果——使用景深设置电影拍摄

    三.使用景深设置电影拍摄 关于相机的属性  https://www.paragon-press.com/lens/lenchart.htm 我们这个例子讨论的是摄像机上的一些参数配置,以及它们的用途: ...

  4. UE4后期处理材质:扁平化风格描边

    1.利用基础颜色实现扁平化渲染 2.创建多边形描边 3.创建法线描边 4.完善描边效果 后期处理体积:用于应用或修改渲染到屏幕上的视觉效果,自定义后期处理材质通过改动渲染缓冲(在渲染画面上叠加RGB值 ...

  5. UE4后期处理之水下效果

    Unreal的后期处理盒非常易于使用.它们本质上是不可见的应用相机效果的盒,一旦我们的相机进入后期处理盒,效果就会变得可见.在这个教程中,我们将学习如何创建一个非常简单但非常受欢迎的水下效果,当我们的 ...

  6. UE4 后期处理材质

    1 在利用后期处理材质在视口上显示UI参考图标位置 如图操作 2 在后期盒子中添加后期材质

  7. ue4 后期处理景深_珠宝摄影教程——后期修图景深合成(如何完全把珠宝全部拍清晰)...

    知乎珠宝摄影课堂专栏陆陆续续更新了一些文章.不成体系的乱写一通,可以算作是梳理珠宝摄影知识的一个树洞.没有想到的是会有这么多人关注,后台也会收到喜欢珠宝摄影的小伙伴留言,希望我可以更新更多珠宝摄影的知 ...

  8. 【虚幻引擎】UE4/UE5 材质

    一.材质基本节点  基础颜色(BaseColor):材质本身的颜色,例如绿色蓝色等 金属度(Metallic):金属度,材质是否含有金属光泽 粗糙度(Roughness):粗糙或者平滑度,物体表面的粗 ...

  9. GCC 中文手册 - 摘自纯C论坛

    GCC Section: GNU Tools (1) Updated: 2003/12/05 Index Return to Main Contents NAME gcc,g++-GNU工程的C和C+ ...

最新文章

  1. java向上造型的优点_老榆木家具适合什么装修风格?老榆木家具有哪些优点
  2. 在python中、下列代码的输出是什么-python期末考试试题汇总
  3. 优朋普乐大数据_优朋普乐黑维炜:互动电视市场已进入成熟发展期
  4. 不停机上线服务_【必看】10月25日本市增值税发票管理系统停机前,这些事一定要办...
  5. mysql duplicate key与replace into对比
  6. vb.net变量值变化触发事件_Angular变化检测的理解
  7. 2篇word文档比较重复率_论文深耕 | 论文重复率太高怎么办?7个降重技巧收好了!...
  8. flask WTForms
  9. Linux 命令(97)—— info 命令
  10. 算法 博士_Strangecode博士-我如何学会不再担心并喜欢算法
  11. Python编程从入门到实践(第二版)day1
  12. layui的treeTable插件表格树表格行单击点击事件绑定不生效
  13. 前端基础入门课程推荐
  14. php随笔_PHP随笔 - 风清扬-深圳的个人页面 - OSCHINA - 中文开源技术交流社区
  15. 第三单元 用python学习微积分(二十二)功、平均值、概率(下)和 数值积分(1)
  16. python爬取B站网页排行榜数据(进阶版)
  17. 微信网页版二维码扫码过程发生了什么
  18. 《世界上最远的距离》 泰戈尔
  19. 解决virus:win32/ramnit.a病毒
  20. 秒杀Servlce接口设计

热门文章

  1. web前端零基础系统学习路线,每个阶段都需要学什么?
  2. 计算机视觉——相机定位
  3. 全志H616——刷机以及初步配置
  4. 吕泉高维智慧创始人:17年心灵修行与素食·造就冻龄女神
  5. Android中MediaMuxer和MediaCodec用例 - audio+video
  6. 2018秋招历程之28所
  7. prim algorithm
  8. stm32 串口下载(ISP下载)
  9. spring报错ava.lang.NoClassDefFoundError:
  10. java宠物医院,基于SSM框架的JAVA宠物医院管理信息系统,源码分享