问题描述
Unity在图像渲染完成后对图像进行修改,需要对OnRenderImage() 进行重写
解决方法
OnRenderImage在图像渲染完成之后被调用,因此可以用来添加屏幕的后处理效果。
这个方法允许使用基于着色器的滤镜来处理最终的图像。
输入的图片 RenderTextrure source, 输出的图片是 RenderTexture destination.
如果要对这个方法进行重写,必须要要加上 Graphic.Blit方法。
模板:
using UnityEngine;
public class ExampleClass : MonoBehaviour
{
public Material mat;
void OnRenderImage(RenderTexture src, RenderTexture dest)
{
// Copy the source Render Texture to the destination,
// applying the material along the way.
Graphics.Blit(src, dest, mat);
}
}
解释
当我们在脚本中声明此函数后,Unity会把当前渲染得到的图像存储在第一个参数对应的源渲染纹理中,通过函数中的一系列操作后,再把目标渲染纹理,即第二个参数对应的渲染纹理显示到屏幕上。在 OnRenderImg 函数中,我们通常是利用 Graphics.Blit 函数来完成对渲染纹理的处理。
Graphics.Blit 有三种函数声明
public static void Blit(Texture src, RenderTexture dest);
public static void Blit(Texture src, RenderTexture dest, Material mat, int pass = -1);
public static void Blit(Texture src, RenderTexture dest, int pass = -1);
| 参数名 | 解释 |
|---|---|
| src | 对应了源纹理,通常就是当前屏幕的渲染纹理或上一步处理后得到的渲染纹理。 |
| dest | 是目标渲染纹理,如果为null就会直接将结果显示在屏幕上 |
| mat | 是我们使用的材质,这个材质使用的Unity Shader将会进行各种屏幕后处理操作,而 src 纹理将会被传递给Shader 中名为 _MainTex 的纹理属性 |
| pass | 默认为-1, 表示会一次调用Shader中的所有Pass。否则,只会调用给定索引的Pass。 |
ImageEffectOpaque
在默认情况下,OnRenderImage函数会在所有不透明和透明的Pass执行完毕之后被调用,以便对场景中所有游戏对象都产生影响。如果希望在不透明的Pass执行完毕后立即调用 OnRenderImg 函数,可以在 OnRenderImg函数前添加 ImageEffectOpaque 属性来实现。
本文介绍如何在Unity中使用OnRenderImage方法对图像进行后处理,包括添加基于着色器的滤镜效果。详细解释了Graphics.Blit函数的三种声明方式及其参数作用,如材质mat的应用和Pass的选择。

2106

被折叠的 条评论
为什么被折叠?



