public TextureArray2D(ImageLoader.Image image) { Size = image.GetSize(0); Debug.Assert(Size.Depth == 1); NumMipmaps = image.NumMipmaps; NumLayers = image.NumLayers; Format = image.Format.DxgiFormat; var data = new DataRectangle[NumLayers * NumMipmaps]; for (int curLayer = 0; curLayer < NumLayers; ++curLayer) { for (int curMipmap = 0; curMipmap < NumMipmaps; ++curMipmap) { var mip = image.Layers[curLayer].Mipmaps[curMipmap]; var idx = GetSubresourceIndex(curLayer, curMipmap); data[idx].DataPointer = mip.Bytes; // The distance (in bytes) from the beginning of one line of a texture to the next line. data[idx].Pitch = (int)(mip.Size / mip.Height); } } handle = new Texture2D(Device.Get().Handle, CreateTextureDescription(false), data); CreateTextureViews(false); }
public ImageData(ImageLoader.Image image) { this.TextureArray = new TextureArray2D(image); NumMipmaps = image.NumMipmaps; NumLayers = image.NumLayers; IsGrayscale = image.IsGrayscale(); HasAlpha = image.HasAlpha(); IsHdr = image.IsHdr(); Filename = image.Filename; FormatName = image.Format.ToString(); }
/// <summary> /// create texture form an existing image /// </summary> /// <param name="image"></param> public TextureArray2D(ImageLoader.Image image) { id = GL.GenTexture(); this.nMipmaps = image.NumMipmaps; this.nLayer = image.Layers.Count; this.internalFormat = image.Format.InternalFormat; this.IsSrgb = image.Format.IsSrgb; this.width = image.GetWidth(0); this.height = image.GetHeight(0); GL.BindTexture(TextureTarget.Texture2DArray, id); // create storage GL.TexStorage3D(TextureTarget3d.Texture2DArray, image.NumMipmaps, internalFormat, image.GetWidth(0), image.GetHeight(0), image.Layers.Count); if (image.Format.IsCompressed) { for (int face = 0; face < image.Layers.Count; ++face) { for (int level = 0; level < image.NumMipmaps; ++level) { GL.CompressedTexSubImage3D(TextureTarget.Texture2DArray, level, 0, 0, face, image.GetWidth(level), image.GetHeight(level), 1, image.Format.Format, (int)image.Layers[face].Mipmaps[level].Size, image.Layers[face].Mipmaps[level].Bytes); } } } else { for (int face = 0; face < image.Layers.Count; ++face) { for (int level = 0; level < image.NumMipmaps; ++level) { GL.TexSubImage3D(TextureTarget.Texture2DArray, level, 0, 0, face, image.GetWidth(level), image.GetHeight(level), 1, image.Format.Format, image.Format.Type, image.Layers[face].Mipmaps[level].Bytes); } } } CreateTexture2DViews(); }
public Texture3D(ImageLoader.Image image, int layer = 0) { Size = image.GetSize(0); LayerMipmap = image.LayerMipmap; Format = image.Format.DxgiFormat; var data = new DataBox[LayerMipmap.Mipmaps]; for (int curMipmap = 0; curMipmap < LayerMipmap.Mipmaps; ++curMipmap) { var mip = image.Layers[layer].Mipmaps[curMipmap]; var idx = curMipmap; data[idx].DataPointer = mip.Bytes; data[idx].SlicePitch = (int)(mip.Size / mip.Depth); data[idx].RowPitch = data[idx].SlicePitch / mip.Height; } handle = new SharpDX.Direct3D11.Texture3D(Device.Get().Handle, CreateTextureDescription(false, true), data); CreateTextureViews(false, true); }
public TextureArray2D(ImageLoader.Image image) { Size = image.GetSize(0); Debug.Assert(Size.Depth == 1); LayerMipmap = image.LayerMipmap; Format = image.Format.DxgiFormat; var data = new DataRectangle[LayerMipmap.Layers * LayerMipmap.Mipmaps]; foreach (var lm in LayerMipmap.Range) { var mip = image.Layers[lm.Layer].Mipmaps[lm.Mipmap]; var idx = GetSubresourceIndex(lm); data[idx].DataPointer = mip.Bytes; // The distance (in bytes) from the beginning of one line of a texture to the next line. data[idx].Pitch = (int)(mip.Size / mip.Height); } handle = new Texture2D(Device.Get().Handle, CreateTextureDescription(false), data); CreateTextureViews(false); }