Example #1
0
        // TODO@: expose now that Download necesarrily goes via the gpu (compute/pixel) ?
        private float[] TextureToTensorDataCache(TensorShape shape)
        {
            float[] tensorDataCache = new float[shape.length];
            bool    flipY           = flip == Flip.Y;

            int batchOffset   = 0;
            int channelOffset = 0;

            foreach (var tex in textures)
            {
                var channelWriteMask = TextureFormatUtils.FormatToChannelMask(tex, interpretPixelAsChannels);
                var channelReadMap   = TextureFormatUtils.FormatToChannelReadMap(tex, interpretPixelAsChannels);

                FillCacheFromTexture(tensorDataCache, tex, batchOffset, channelOffset, channelWriteMask, channelReadMap,
                                     flipY, scale, bias, shape);

                if (interpretDepthAs == InterpretDepthAs.Batch)
                {
                    batchOffset += 1;
                }
                else if (interpretDepthAs == InterpretDepthAs.Channels)
                {
                    channelOffset += interpretPixelAsChannels;
                }
            }

            return(tensorDataCache);
        }
Example #2
0
        // ---------------------------------------------------------------------------------

        internal ITensorData TextureToTensorData(TextureAsTensorData texData, string name)
        {
            var tensorData = new TextureTensorData(texData.shape, name, false);

            Material material = new Material(PixelShaderSingleton.Instance.FindShader("Barracuda/TextureToTensor"));

            material.SetVector("OdeclShape", new Vector4(texData.shape.batch, texData.shape.height, texData.shape.width, texData.shape.channels));

            material.SetInt("_FlipY", texData.flip == TextureAsTensorData.Flip.Y ? 1 : 0);
            material.SetVector("_Scale", texData.scale);
            material.SetVector("_Bias", texData.bias);

            Vector4 offsets = Vector4.zero;

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

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

                material.SetTexture("Xtex2D", tex);
                material.SetVector("_Pool", new Vector2(tex.width, tex.height));
                material.SetVector("_Pad", offsets);

                var channelWriteMask = TextureFormatUtils.FormatToChannelMask(tex, texData.interpretPixelAsChannels);
                var channelReadMap   = TextureFormatUtils.FormatToChannelReadMap(tex, texData.interpretPixelAsChannels);
                material.SetVector("_ChannelWriteMask", new Vector4(channelWriteMask[0], channelWriteMask[1], channelWriteMask[2], channelWriteMask[3]));
                material.SetVector("_ChannelReadMap", new Vector4(channelReadMap[0], channelReadMap[1], channelReadMap[2], channelReadMap[3]));

                Graphics.Blit(null, tensorData.bufferAsTexture, material);

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

            return(tensorData);
        }