7using System.Collections;
22 #region --Client API--
39 Array.Sort(cameras, (a, b) => (
int) (10 * (a.depth - b.depth)));
42 this.recorder = recorder;
44 this.cameras = cameras;
45 frameDescriptor =
new RenderTextureDescriptor(width, height, RenderTextureFormat.ARGB32, 24);
46 readbackBuffer = SystemInfo.supportsAsyncGPUReadback
48 :
new Texture2D(width, height, TextureFormat.RGBA32,
false,
false);
49 attachment = cameras[0].gameObject.AddComponent<CameraInputAttachment>();
50 pixelBuffer =
new byte[width * height * 4];
52 frameDescriptor.sRGB =
true;
53 attachment.StartCoroutine(OnFrame());
61 Object.Destroy(attachment);
62 Object.Destroy(readbackBuffer);
69 #region --Operations--
72 private readonly
IClock clock;
73 private readonly Camera[] cameras;
74 private readonly RenderTextureDescriptor frameDescriptor;
75 private readonly Texture2D readbackBuffer;
76 private readonly CameraInputAttachment attachment;
77 private byte[] pixelBuffer;
78 private int frameCount;
80 private IEnumerator OnFrame()
82 var endOfFrame =
new WaitForEndOfFrame();
86 yield
return endOfFrame;
90 var frameBuffer = RenderTexture.GetTemporary(frameDescriptor);
91 for (var i = 0; i < cameras.Length; i++)
93 var prevTarget = cameras[i].targetTexture;
94 cameras[i].targetTexture = frameBuffer;
96 cameras[i].targetTexture = prevTarget;
100 var timestamp = clock.timestamp;
101 if (SystemInfo.supportsAsyncGPUReadback)
103 AsyncGPUReadback.Request(frameBuffer, 0, request =>
105 if (pixelBuffer !=
null)
107 request.GetData<
byte>().CopyTo(pixelBuffer);
108 recorder.CommitFrame(pixelBuffer, timestamp);
114 var prevActive = RenderTexture.active;
115 RenderTexture.active = frameBuffer;
116 readbackBuffer.ReadPixels(
new Rect(0, 0, frameBuffer.width, frameBuffer.height), 0, 0,
false);
117 readbackBuffer.GetRawTextureData<
byte>().CopyTo(pixelBuffer);
118 recorder.CommitFrame(pixelBuffer, timestamp);
119 RenderTexture.active = prevActive;
122 RenderTexture.ReleaseTemporary(frameBuffer);
126 private sealed
class CameraInputAttachment : MonoBehaviour
Clock for generating recording timestamps. Clocks are important for synchronizing audio and video tra...