AsyncRequest <CaptureCamera.CaptureState> CaptureDataForChannel(Camera camera, Channel channel, GraphicsFormat colorFormat, GraphicsFormat depthFormat, GraphicsFormat motionFormat) { Func <AsyncRequest <CaptureCamera.CaptureState>, AsyncRequest <CaptureCamera.CaptureState> .Result> functor = r => { return(AsyncRequest.Result.Completed); }; return(CaptureCamera.Capture ( camera, channel == Channel.Color ? functor : null, colorFormat, channel == Channel.Depth ? functor : null, depthFormat, channel == Channel.Motion ? functor : null, motionFormat, forceFlip: ForceFlip.None )); }
public IEnumerator CaptureTestsRedux_Parametric(bool async, bool batched, bool useRT, Channel channel, int depthBits = 32) { Debug.Assert(depthBits == 16 || depthBits == 32); CaptureOptions.useAsyncReadbackIfSupported = async; #if UNITY_2019_3_OR_NEWER CaptureOptions.useBatchReadback = batched; if (batched) { BatchReadback.Instance.BatchSize = 1; } #endif var scene = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("Capture.Test.Scene")); var block1 = scene.transform.Find("Top Cube").gameObject; Debug.Assert(block1 != null); var unlitRed = new Material(Shader.Find("Hidden/DataCaptureTestsUnlitShader")); unlitRed.color = Color.red; block1.GetComponent <MeshRenderer>().sharedMaterial = unlitRed; var block2 = scene.transform.Find("Bottom Cube").gameObject; Debug.Assert(block2 != null); var unlitBlack = new Material(Shader.Find("Hidden/DataCaptureTestsUnlitShader")); unlitBlack.color = Color.black; block2.GetComponent <MeshRenderer>().sharedMaterial = unlitBlack; var camera = Camera.main; Debug.Assert(camera != null); camera.depthTextureMode = DepthTextureMode.Depth | DepthTextureMode.DepthNormals | DepthTextureMode.MotionVectors; var delay = 20; while (delay-- > 0) { yield return(null); } var colorFormat = GraphicsFormat.R8G8B8A8_UNorm; var depthFormat = depthBits == 16 ? GraphicsFormat.R16_UNorm : GraphicsFormat.R32_SFloat; var motionFormat = GraphicsFormat.R8G8B8A8_UNorm; var label = $"CaptureTestRedux_{(async?"Async":"Slow")}{(batched?"Batched":"")}{(useRT?"RT":"")}_{channel.ToString()}_Orientation{(channel == Channel.Depth ? $"_Depth{depthBits}" : "")}"; var path = Path.Combine(Application.persistentDataPath, label); var request = CaptureDataForChannel(camera, channel, colorFormat, depthFormat, motionFormat); var count = 20; while (!request.completed && count-- > 0) { yield return(null); } Assert.False(request.error); switch (channel) { case Channel.Color: Assert.NotNull(request.data.colorBuffer); Assert.True(BufferNotEmpty((byte[])request.data.colorBuffer, ArrayUtilities.Count <byte>((byte[])request.data.colorBuffer))); Test_Color_Orientation(request.data.camera, colorFormat, (byte[])request.data.colorBuffer, label, path); break; case Channel.Depth: Assert.NotNull(request.data.depthBuffer); switch (depthFormat) { case GraphicsFormat.R32_SFloat: Assert.True(BufferNotEmpty(ArrayUtilities.Cast <float>((Array)request.data.depthBuffer), ArrayUtilities.Count((byte[])request.data.depthBuffer))); Test_Depth_Orientation_float(request.data.camera, depthFormat, (byte[])request.data.depthBuffer, label, path); break; case GraphicsFormat.R16_UNorm: Assert.True(BufferNotEmpty(ArrayUtilities.Cast <ushort>((Array)request.data.depthBuffer), ArrayUtilities.Count((byte[])request.data.depthBuffer))); Test_Depth_Orientation_ushort(request.data.camera, depthFormat, (byte[])request.data.depthBuffer, label, path); break; default: throw new InvalidOperationException("Invalid depth format"); } break; case Channel.Motion: Assert.Ignore(); break; } var rt = camera.targetTexture; if (rt != null) { rt.Release(); camera.targetTexture = null; } UnityEngine.Object.DestroyImmediate(scene); scene = null; }