关于这个话题,网上的资料真的是太少了,主要都是关于在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方法,但是只是空方法。
此时,屏幕依然为黑色,输出一个提示,说目标未画任何东西。
帧调试器: