Unity OnRenderImage

关于这个话题,网上的资料真的是太少了,主要都是关于在OnRenderImage实现后处理的一些基本的操作。
但是对于其原理方面讲解的很少,可能外网我还没搜到,后面如果找到的话,会再补充更新。

网上的资料:https://gameinstitute.qq.com/community/detail/112744
可以参考,但主要还是看我这篇的实验分析即可。

本文可能有点啰嗦,主要还是多种情况考虑的结果分析。

1、准备一个测试脚本:TestRenderTexture.cs
将其挂在主摄像机上即可,此时脚本里面的内容为空,后面会测试多种情况。
此时在什么都没做的情况下,只是在主摄像机上挂了一个TestRenderTexture脚本,此时我们让摄像机看到一个球体,如下:
在这里插入图片描述
此时打开帧调试器:
在这里插入图片描述
此时,一切都和我们之前一样,没有任何的变化。这里我们不做任何的总结,因为实验还未开始展开,总结是没有任何根据的。ok,我们继续:

2、在TestRenderTexture.cs中,做如下的操作:
2.1)在脚本中重写OnRenderImage方法,看其变化

using UnityEngine;

public class TestRenderTexture : MonoBehaviour
{
    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        // 不做任何操作
    }
}

此时屏幕黑了:
在这里插入图片描述
帧调试器:
在这里插入图片描述
此时有点变化,屏幕黑色这是其一,第二个,摄像机的画面,画到一个临时TempBuffer中去了。
断点情况:
在这里插入图片描述
source为那个临时缓冲区,destination为null。
我们继续。

3、在OnRenderImage方法中,使用Blit方法:
代码变为:

using UnityEngine;

public class TestRenderTexture : MonoBehaviour
{
    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        Graphics.Blit(source, destination);
    }
}

此时结果:
在这里插入图片描述
帧调试器:
在这里插入图片描述
断点情况:
在这里插入图片描述
此时屏幕能看到东西了,原因是我们在OnRenderImage方法中执行了Blit操作。
这blit我们看看,source为临时缓冲,destination为null,也就是将临时缓冲,拷贝到null,我们知道destination为空,则是直接拷贝到屏幕。所以我们看到了屏幕有东西。同时主要到帧调试器中,多了一个ImageEffects的绘制调用,使用内置的BlitCopy着色器,将临时缓冲拷贝到了屏幕上去。
在这里插入图片描述

4、创建要给rt,在start方法中赋值给摄像机

using UnityEngine;

public class TestRenderTexture : MonoBehaviour
{
    public RenderTexture rt;
    public Camera m_camera;

    public void Start()
    {
        rt = new RenderTexture(m_camera.pixelWidth, m_camera.pixelHeight, 16); //16位的深度
        rt.name = "xxx";
        m_camera.targetTexture = rt;
    }
}

此时屏幕:
在这里插入图片描述
屏幕为黑色,并且摄像机的targetTexture为我们创建的rt了。
帧调试器:
在这里插入图片描述
此时,我们将东西绘制到了我们创建的rt上去了,所以屏幕为黑色。

5、在脚本中,添加OnRenderImage方法,但是只是空方法。
在这里插入图片描述
此时,屏幕依然为黑色,输出一个提示,说目标未画任何东西。
帧调试器:

发布了618 篇原创文章 · 获赞 96 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/wodownload2/article/details/104455641