ITensorData CustomTextureToTensorData(TextureAsTensorData texData, string name)
    {
        //By default Barracuda work on Tensor containing value in linear color space.
        //Here we handle custom tensor Pin from texture when tensor is to contain data in sRGB color space.
        //This is important for this demo as network was trained with data is sRGB color space.
        //Direct support for this will be added in a latter revision of Barracuda.
        var fn         = new CustomComputeKernel(tensorToTextureSRGB, "TextureToTensor");
        var tensorData = new ComputeTensorData(texData.shape, name, ComputeInfo.channelsOrder, false);

        fn.SetTensor("O", texData.shape, tensorData.buffer);
        fn.shader.SetBool("_FlipY", texData.flip == TextureAsTensorData.Flip.Y);

        var offsets = new int[] { 0, 0, 0, 0 };

        foreach (var tex in texData.textures)
        {
            var texArr = tex as Texture2DArray;
            var tex3D  = tex as Texture3D;
            var rt     = tex as RenderTexture;

            var texDepth = 1;
            if (texArr)
            {
                texDepth = texArr.depth;
            }
            else if (tex3D)
            {
                texDepth = tex3D.depth;
            }
            else if (rt)
            {
                texDepth = rt.volumeDepth;
            }

            //var srcChannelMask = TextureFormatUtils.FormatToChannelMask(tex, texData.interpretPixelAsChannels);
            Color srcChannelMask = Color.white;

            fn.shader.SetTexture(fn.kernelIndex, "Xtex2D", tex);
            fn.shader.SetInts("_Pool", new int [] { tex.width, tex.height });
            fn.shader.SetInts("_Pad", offsets);
            fn.shader.SetInts("_ChannelWriteMask", new [] { (int)srcChannelMask[0], (int)srcChannelMask[1], (int)srcChannelMask[2], (int)srcChannelMask[3] });

            fn.Dispatch(texData.shape.width, texData.shape.height, texDepth);

            if (texData.interpretDepthAs == TextureAsTensorData.InterpretDepthAs.Batch)
            {
                offsets[0] += texDepth;
            }
            else if (texData.interpretDepthAs == TextureAsTensorData.InterpretDepthAs.Channels)
            {
                offsets[3] += texDepth * texData.interpretPixelAsChannels;
            }
        }

        return(tensorData);
    }
Exemplo n.º 2
0
        /// <summary>
        /// Create a Tensor from multiple texture, shape is [srcTextures.length, texture.height, texture.width, `channels=3`]
        /// All textures must be of the same size and dimension.
        /// </summary>
        public Tensor(UnityEngine.Texture[] srcTextures, int channels = 3, string n = "")
        {
            name = n;
            var tensorData = new TextureAsTensorData(srcTextures, channels);

            //;;UnityEngine.Debug.Log("Tensor::Tensor " + n + " " + tensorData.shape + " [TEX] " + srcTextures);
            shape = tensorData.shape;
            Assert.IsTrue(tensorData.GetMaxCount() >= length);
            m_TensorOnDevice  = tensorData;
            m_TensorAllocator = null;
            m_Cache           = null;
            m_CacheIsDirty    = false;
        }