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