Unity 使用OnRenderImage()对渲染完成的图像进行修改

本文介绍如何在Unity中使用OnRenderImage方法对图像进行后处理,包括添加基于着色器的滤镜效果。详细解释了Graphics.Blit函数的三种声明方式及其参数作用,如材质mat的应用和Pass的选择。

问题描述

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 属性来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值