public static unsafe Texture LoadTexture( GraphicsDevice gd, ResourceFactory factory, Stream assetStream, PixelFormat format) { KtxFile ktxTex2D = Load(assetStream, false); uint width = ktxTex2D.Header.PixelWidth; uint height = ktxTex2D.Header.PixelHeight; if (height == 0) { height = width; } uint arrayLayers = Math.Max(1, ktxTex2D.Header.NumberOfArrayElements); uint mipLevels = Math.Max(1, ktxTex2D.Header.NumberOfMipmapLevels); Texture ret = factory.CreateTexture(TextureDescription.Texture2D( width, height, mipLevels, arrayLayers, format, TextureUsage.Sampled)); Texture stagingTex = factory.CreateTexture(TextureDescription.Texture2D( width, height, mipLevels, arrayLayers, format, TextureUsage.Staging)); // Copy texture data into staging buffer for (uint level = 0; level < mipLevels; level++) { KtxMipmapLevel mipmap = ktxTex2D.Mipmaps[level]; for (uint layer = 0; layer < arrayLayers; layer++) { KtxArrayElement ktxLayer = mipmap.ArrayElements[layer]; Debug.Assert(ktxLayer.Faces.Length == 1); byte[] pixelData = ktxLayer.Faces[0].Data; fixed(byte *pixelDataPtr = &pixelData[0]) { gd.UpdateTexture(stagingTex, (IntPtr)pixelDataPtr, (uint)pixelData.Length, 0, 0, 0, mipmap.Width, mipmap.Height, 1, level, layer); } } } CommandList copyCL = factory.CreateCommandList(); copyCL.Begin(); for (uint level = 0; level < mipLevels; level++) { KtxMipmapLevel mipLevel = ktxTex2D.Mipmaps[level]; for (uint layer = 0; layer < arrayLayers; layer++) { copyCL.CopyTexture( stagingTex, 0, 0, 0, level, layer, ret, 0, 0, 0, level, layer, mipLevel.Width, mipLevel.Height, mipLevel.Depth, 1); } } copyCL.End(); gd.SubmitCommands(copyCL); gd.DisposeWhenIdle(copyCL); gd.DisposeWhenIdle(stagingTex); return(ret); }
public static unsafe Texture LoadTexture( GraphicsDevice gd, ResourceFactory factory, string assetPath, PixelFormat format) { KtxFile tex2D; using (FileStream fs = File.OpenRead(assetPath)) { tex2D = KtxFile.Load(fs, false); } uint width = tex2D.Header.PixelWidth; uint height = tex2D.Header.PixelHeight; if (height == 0) { height = width; } uint mipLevels = tex2D.Header.NumberOfMipmapLevels; Texture ret = factory.CreateTexture(TextureDescription.Texture2D( width, height, mipLevels, 1, format, TextureUsage.Sampled)); Texture stagingTex = factory.CreateTexture(TextureDescription.Texture2D( width, height, mipLevels, 1, format, TextureUsage.Staging)); // Copy texture data into staging buffer for (uint level = 0; level < mipLevels; level++) { KtxMipmap mipmap = tex2D.Faces[0].Mipmaps[level]; byte[] pixelData = mipmap.Data; fixed(byte *pixelDataPtr = &pixelData[0]) { gd.UpdateTexture(stagingTex, (IntPtr)pixelDataPtr, (uint)pixelData.Length, 0, 0, 0, mipmap.Width, mipmap.Height, 1, level, 0); } } CommandList copyCL = factory.CreateCommandList(); copyCL.Begin(); for (uint level = 0; level < mipLevels; level++) { uint levelWidth = tex2D.Faces[0].Mipmaps[level].Width; uint levelHeight = tex2D.Faces[0].Mipmaps[level].Height; copyCL.CopyTexture(stagingTex, 0, 0, 0, level, 0, ret, 0, 0, 0, level, 0, levelWidth, levelHeight, 1, 1); } copyCL.End(); gd.SubmitCommands(copyCL); gd.DisposeWhenIdle(copyCL); gd.DisposeWhenIdle(stagingTex); return(ret); }