Esempio n. 1
0
    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
               ));
    }
Esempio n. 2
0
    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;
    }