Direct2D (SharpDX) 块压缩位图未在内存中压缩

问题描述

我有一些 (8-10) 大纹理图集(大约 8192x8192 保存为 BC1 DDS),但它们的磁盘空间相当小,只有 32MiB。

问题是,当我使用 WIC 加载这些文件时,它们会丢失块压缩并占用高达 256MiB 的 RAM,根据 sources

这是我加载文件的 C# SharpDX 代码

public Bitmap LoadBitmap(string path) {
    Bitmap m;

    using (BitmapDecoder d = new BitmapDecoder(imagingFactory,$"plugins/HDPatch/{path}",Guid.Empty,SharpDX.IO.NativeFileAccess.Read,DecodeOptions.Cacheondemand)) {
        DdsDecoder decoder = d.QueryInterface<DdsDecoder>();
        decoder.GetFrame(0,out BitmapFrameDecode frame);
        m = SharpDX.Direct2D1.Bitmap.FromWicBitmap(_target,frame);//_target.CreateBitmap(converter,new BitmapProperties());
        decoder.dispose();
        frame.dispose();
    }

    return m;
}

我是否需要更改某些内容,还是应该使用与 WIC 不同的加载方法

我查看了 DdsFrameDecode.CopyBlocks (+ ID2D1Bitmap::CopyFromMemory) 方法,但我不知道它是如何工作的..(我的步幅究竟是什么以及我从哪里获得这些信息)

编辑:

所以 BitmapFrameDecode 给了我一个 32bppPBGRA 的 PixelFormat

如果我从那个 BitmapFrameDecode 查询一个 DDSFrameDecode,我会从 DdsFrameDecode 得到一个 BC1_Unorm 的格式。 DdsDecoder 还报告了一个带有 DdsAlphaModePremultiplied 和 BC1_Unorm 的 dxgiFormat 的纹理。

但是当我在 BitmapProperties 中强制使用 BC1_Unorm 的像素格式时,我收到 D2D 调试错误:“传递给此 API 的像素格式与 IWICBitmapSource 的像素格式不兼容”

编辑2: 我想出了如何使用 copyBlocks

    SharpDX.DataStream stream = new 
    SharpDX.DataStream(test2.FormatInfo.BytesPerBlock * test2.SizeInBlocks.Width * test2.SizeInBlocks.Height,true,true);
    test2.copyBlocks(null,test2.FormatInfo.BytesPerBlock * test2.SizeInBlocks.Width,stream);
    m = new Bitmap(_target,new SharpDX.Size2(decoder.Parameters.Width,decoder.Parameters.Height),stream,test2.FormatInfo.BytesPerBlock * test2.FormatInfo.BlockWidth,new BitmapProperties(new PixelFormat(SharpDX.dxgi.Format.BC1_Unorm,AlphaMode.Premultiplied)));

但是问题依然存在。它可以成功创建Bitmap,但仍然消耗大量内存(250MiB+而不是32MiB的实际块压缩大小)

它可能与渲染目标有关吗? 我使用软件 B8G8R8A8_Unorm DeviceContext 渲染目标

编辑 3:

示例项目:https://drive.google.com/file/d/1hCgQnEV9xcTevgdswAiPJNREk1oDgqDC/view?usp=sharing

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)