之前的一个博客写的不太好,规律没有抓住:
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,等等都非常清晰。