https://developer.apple.com/documentation/metal/frame_capture_debugging_tools/enabling_frame_capture
https://docs.unity3d.com/Manual/XcodeFrameDebuggerIntegration.html
启发于:https://forum.unity.com/threads/metal-can-i-edit-unitys-screen-backbuffer-color-depthbuffer-load-storeaction.554449/
- build好项目之后,选择meta模式或者其他
选择meta模式,或者其他,然后运行到某个手机。
- 测试代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class RTTest : MonoBehaviour
{
public MeshFilter m1;
public MeshFilter m2;
public MeshFilter m3;
private RenderTexture m_rt1;
public Material m_mat1;
public Material m_mat2;
public Camera m_camera;
private int m_texID = Shader.PropertyToID("_MainTex");
private void Start()
{
m_rt1 = RenderTexture.GetTemporary(Screen.width, Screen.height, 32);
CommandBuffer cb = new CommandBuffer();
cb.name = "draw";
cb.SetRenderTarget(m_rt1, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store);
cb.ClearRenderTarget(true, true, Color.red);
m_camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, cb);
cb.DrawMesh(m1.mesh, Matrix4x4.identity, m_mat1);
Matrix4x4 m = Matrix4x4.identity;
m.SetTRS(m3.transform.position, Quaternion.identity, Vector3.one);
cb.DrawMesh(m3.mesh, m, m_mat1);
}
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
Graphics.Blit(m_rt1, destination);
}
}
- 抓帧
两个commandbuffer,一个是我们自己定义的,一个是OnRenderImage函数自己创建的。
OnRenderImage所对应的commandbuffer:
此时其load和store都是27.7MB
而如果把我们自定义的commandbuffer改为:
cb.SetRenderTarget(m_rt1, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare);
那么在绘制之后,是不会有store的,所以rt1上也就没有任何的东西。
而OnRenderImage不会有任何的影响,还是load和store各自27.7MB。
总结:
1、在手机上进行测试,才能看到Load和Store的区别,pc上看不到。
2、手机上的RenderBufferLoadAction.DontCare和RenderBufferLoadAction.Load,经过测试没有区别,不知道为啥,可能是因为自己测试有问题。
3、RenderBufferStoreAction.DontCare不会写会rt,造成rt为空;
RenderBufferStoreAction.Store和RenderBufferStoreAction.Resolve以及RenderBufferStoreAction.StoreAndResolve都会写回。
但是Resolve和StoreAndResolve在pc上可能会报错。
所以,在一般情况下,我们的load选择为DontCare,而store选择Store即可。
Resolve模式在rt开启了msaa才会使用,resolve单词为解析的意思,就是从msaa到非msaa有一个解析的过程的意思。