Unity Shader屏幕特效基础OnRenderImage()函数

前言: 

unity shader中的pass是会顺序执行的,但是由于在图像处理中我们常常需要使用一个pass的处理结果作为另一个pass的输入,这个时候就需要用到OnRenderImage()函数了。

一、函数介绍

MonoBehaviour.OnRenderImage(RenderTexture source,RenderTexture destination)

官方描述Description

OnRenderImage is called after all rendering is complete to render image.,该函数在所有的渲染完成后由monobehavior自动调用。

官方解释:该函数允许我们使用着色器滤波操作来修改最终的图像,输入原图像source,输出的图像放在desitination里。

二、Graphics.Blit()函数

Unity Shader屏幕特效基础OnRenderImage()函数_第1张图片

该函数的作用就是通过一个shader将原图的像素放置到destionation中。

三、示例

我们可以随便写一个shader,比如写一个让图片变为灰度图,然后创建一个材质。

接下来我们把脚本拖动到主相机下,然后将材质赋予相应变量即可。

注意在示例中,我们用到了Material::SetTexture()函数,这是给材质赋值的,我们这里把原图的值赋值给_MainTex,然后shader处理的时候采样的图片就是相机得到的场景图片了,这里可以设置所有类型的值,你也可以尝试自己写一个滑动条,然后动态设置图片的灰度级别。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExecuteInEditMode]
public class Luminance : MonoBehaviour {

    public Material mat;

    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        RenderTexture src0=RenderTexture.GetTemporary(source.width,source.height);
        mat.SetTexture("_MainTex", source);
        Graphics.Blit(source,src0,mat,0);
        Graphics.Blit(src0,destination);

        RenderTexture.ReleaseTemporary(src0);
    }
}

四、更多资源

1.OnRenderImage()官方文档

2.屏幕后处理效果之碎屏特效

 

你可能感兴趣的:(unity,shader编程,unity游戏开发)