unity——OnRenderImage深度解读

之前的一个博客写的不太好,规律没有抓住:
https://blog.csdn.net/wodownload2/article/details/104455641

本篇重新写,规律如下:
1、重载了OnRenderImage,必然导致绘制到一个unity创建好的临时RT上去。除非你明确指定绘制方向。
测试:挂在主相机上

using UnityEngine;

public class SetRenderTarget : MonoBehaviour
{
    void Start()
    {
      
    }

    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        
    }
}

此时绘制到的是一个unity为我们创建的TempBuffer上:
在这里插入图片描述

由于我们在OnRenderImage中没有做任何事情,所以画面是黑的。

2、如果在OnRenderImage中使用:
Graphics.Blit(source, destination);

此时比如造成一个拷贝操作,从source,拷贝到destination,此时source=unity创建处理的临时rt,destination为null,即是屏幕。

此时:
在这里插入图片描述

3、如果我们手动指定rt,重定向。

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

public class SetRenderTarget : MonoBehaviour
{
    private RenderTexture rt;
    private RenderTexture rt2;
    public Camera m_camera;
    public Material mat;
    void Start()
    {
        rt = new RenderTexture(m_camera.pixelWidth, m_camera.pixelHeight, 0); //0表示不用深度
        rt2 = new RenderTexture(m_camera.pixelWidth, m_camera.pixelHeight, 16, RenderTextureFormat.Depth); //用16位深度,类型为depth
        rt.name = "xxx"; //起名字方便在framedebugger中查看
        rt2.name = "yyy";
        m_camera.SetTargetBuffers(rt.colorBuffer, rt2.depthBuffer); //第二个参数只能传递xx.depthBuffer,否则报错
    }

    //次函数必须在主相机上的脚本才生效
    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
  		//什么都不做
    }
}

此是绘制到rt1,上去。在OnRenderImage,中source为null,即是屏幕,destination为ImageEffects Temp。
此时屏幕为黑色的。
在这里插入图片描述

4、如果我们在OnRenderImage做:
Graphics.Blit(source, destination);
此时:
在这里插入图片描述
在这里插入图片描述
5、如果我们在OnRenderImage做:
Graphics.Blit(source, destination, mat);
mat是我们自己定义的材质
在这里插入图片描述此时source为null,即是屏幕,dest为ImageEffects Temp。

经过试验:

1、如果自己重定向了rt,在OnRenderImage,中使用默认的Graphics.Blit(source, destination);
则会触发一个Grab RenderTexture,至于抓取的是哪个,则看此时的RenderTexture.active是哪个。
2、使用默认的Graphics.Blit(source, xx); 将不会导致RenderTexture.active发生变化。
3、有多少次Graphics.Blit(source, destination);就会有多少次Grab RenderTexture。
4、使用Graphics.Blit(source, destination, mat);不会触发Grab RenderTexutre,此时src是null,des为ImageEffects Temp。
5、自己指定了摄像机的RT之后,重写了OnRenderImage,则必然会导致最后的从ImageEffects Temp到屏幕的拷贝操作。这是unity自己帮我们做的。而在OnRenderImage{内部},方法内部,我们可以自己任意的blit操作。这些操作在FrameDebugger中都可以一步一步查看到。从哪里拷贝到哪里,用了哪个shader的哪个pass,等等都非常清晰。
在这里插入图片描述

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值