OnRenderImage:渲染后处理的关键时机

本文介绍了Unity中OnRenderImage函数的调用机制及Graphics.Blit方法的作用。OnRenderImage是Unity在相机完成场景渲染后自动调用的特殊函数,用于在画面输出到屏幕前进行后处理。开发者通过Graphics.Blit方法实现全屏特效处理,该方法将渲染完成的画面通过指定shader进行二次处理,可实现模糊、灰度等效果。整个流程依次为:相机渲染场景→写入临时RenderTexture→调用OnRenderImage→通过Blit处理画面→输出最终结果。这两个功能共同构成了Unity强大的后处理系统,为画面表现提供了灵活扩展能力。


1. OnRenderImage函数调用时机以及由谁调用?

调用时机:

OnRenderImage是Unity中属于MonoBehaviour的一个特殊渲染流程事件函数。当它被挂载在相机(Camera)对象上的脚本中时,会在该相机完成“所有场景内容渲染”,即把需要渲染的所有对象绘制到一张临时的RenderTexture上之后、最终将画面输出到屏幕(或目标RenderTexture)之前被Unity自动调用。

具体流程:

  • Unity首先按正常流程渲染场景到一张临时RT(RenderTexture)。
  • 场景内容全部渲染结束后,如果该相机挂载的脚本实现了OnRenderImage,Unity引擎会自动调用此函数,并把刚渲染完的RT传入src参数。
  • 在OnRenderImage内你可以对src做屏幕后处理,然后输出到dest(目标RT或者屏幕帧缓冲)。

由谁调用:

OnRenderImage并不是你显式调用的,而是由Unity的渲染主循环驱动——准确来说,是Unity的渲染管线检测到当前激活的Camera的相关脚本中包含该函数时,在合适的渲染阶段自动调用。你只需将脚本挂在摄像机上即可。


2. 调用Blit方法会带来什么?

作用描述:

Graphics.Blit(src, dest, mat)的本质是使用一个全屏幕的简单四边形,将src纹理“投影”到dest,但在投影过程中,会用你自己传入的材质(mat)中的shader对每个像素做任意图像处理。

在执行过程中,Unity会自动把src作为_MainTex属性注入到你写的shader里。你可以在shader中采样此贴图,处理它,并把新颜色写进dest。
最终,你可以实现如模糊、灰度、对比度、泛色等各种复杂特效。

带来的结果(效果):

可以对整幅渲染完成的画面进行二次处理,在屏幕输出前加各种后处理特效。

使你能灵活扩展渲染流程,插入各种视觉风格和效果,提升画面表现力。

Blit的处理结果会全部填充到dest,对于最终渲染到屏幕的内容有决定性影响。

简单总结:

OnRenderImage:相机每帧渲染结束后、输出到屏幕前,由Unity引擎自动调用。

调用Blit:将场景画面通过指定shader处理一遍,效果就是“后处理”,可做各种全屏特效。


补充:具体执行流程顺序

1. 摄像机开始一帧的渲染。

2. 所有正常物体渲染→写入临时RenderTexture。

3. Unity检测到有OnRenderImage函数,自动调用并传入src(刚渲染好的RT)和dest(最终目标RT或者屏幕)。

4. 在OnRenderImage中,开发者通常调用Graphics.Blit。

5. Blit用自定义shader处理src内容,并输出到dest。

6. dest最终被显示在屏幕或用于后续处理。


版权声明:本文为CSDN博主「你一身傲骨怎能输」的原创文章,
遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33060405/article/details/150998090

最新文章