// --------------------------------------------------------------------------------- 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); }
/// <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; }