问题标签 [dds-format]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
96 浏览

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

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

问题是,当我使用 WIC 加载这些文件时,它们会失去块压缩并占用多达 256MiB 的 RAM,根据消息来源,这不应该发生

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

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

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

编辑:

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

如果我从该 BitmapFrameDecode 查询 DDSFrameDecode,我会从 DdsFrameDecode 中获得 BC1_UNorm 格式。DdsDecoder 还报告带有 DdsAlphaModePremultiplied 的纹理和 BC1_UNorm 的 DxgiFormat。

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

EDIT2:我想出了如何使用 CopyBlocks

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

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

编辑3:

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

0 投票
1 回答
320 浏览

c++ - 如何解压 BC3_UNORM DDS 纹理格式?

我已经阅读了很多文章和代码,但我仍然无法让它工作,我已经读取了纹理中标题的所有 128 字节,它们读取了实际纹理的 65536 字节压缩数据(纹理的分辨率为256x256,每个压缩像素使用 1 个字节)。我试图创建我的解压缩算法但没有成功,我决定使用别人的,所以我在这里找到了这段代码。这是我试图传递给它的参数,以便它解压缩我的 DDS 纹理。BlockDecompressImageDXT5(textureHeader.dwWidth, textureHeader.dwHeight, temp, packedData) 注意:textureHeader 是一个有效的结构,其中加载了 DDS 纹理的标头数据,temp是一个无符号字符数组,包含从 DDS 纹理读取的所有 DDS 数据和packedData是一个无符号长数组,我希望收到最终的解压缩数据。因此,在我链接的代码中,每个像素的 RGBA 通道都打包在PackRGBA函数中,在packedData. 在将数据指向D3D11_SUBRESOURCE_DATApSysMem 中的纹理数据之前,我以这种方式将每个字节从 unsigned long 分配packedData到 4 个不同的 unsigned char m_DDSData

注意:m_DDSData 应该是用于D3D11_SUBRESOURCE_DATA指向纹理数据的最终数据数组,但是当我使用它时,是我得到的结果,只有一个带有随机颜色的帧,而不是我的实际纹理。我也有其他类型纹理的算法,它们可以正常工作,所以我可以保证问题只出在 DDS 压缩格式中。 编辑:另一个例子,这是一个胸部模型,程序应该渲染胸部的纹理:https ://prnt.sc/11b62b6

0 投票
0 回答
68 浏览

python - 在 Python 上的 R32G32B32A32_UINT 中打开并写入一个 .dds 文件

我有一个 128 位 (R32G32B32A32_UINT) 的 .dds 文件。我需要打开它并读取 Python 中每个像素的值。然后,我需要写一个新的。

有没有办法这样做?我搜索了库,但它们似乎不只支持有限类型的 .dds(例如枕头)

谢谢!

0 投票
0 回答
37 浏览

graphics - DDS 和 Photoshop 中的纹理阵列?

我正在尝试复制包含纹理数组的 DDS 格式,但在使用 Photoshop 和 Nvidia 的 Ps 的 DDS 插件时,我无法获得与原始格式相同的格式和文件大小。

我尝试找出要使用的导出格式的基本过程是加载原始 DDS,可能不需要修改,然后在 Ps 中“另存为”,然后从 Nvidia 插件选项中选择并尝试获得完全相同的文件大小(二进制比较匹配)。

我尝试打开带有和不带有 mipmap 的原始 DDS,并在保存时生成 MIPS,但文件大小永远不会匹配。由于这些是纹理数组(从 10 x 10 到 14 x 14 不等),但每个纹理都是 360 x 360 像素。

我很确定格式是正确的“BC7 RGBA 8 bpp 显式 Alpha”,因为我检查过的所有其他资产的反照率也是 BC7。但是我没有运气让我的 Ps 保存的 DDS 文件与原始加载的 DDS 匹配。

我没有在 DDS 文件中找到关于纹理数组的大量信息,因此欢迎提供任何帮助。

这是我使用 Nvidia 插件的 Ps 选项:

ps DDS 导出

0 投票
0 回答
69 浏览

c# - 如何处理 DDS 文件中的 DX10 压缩?

我想将 DDS 文件加载到 C# WPF 应用程序中,因此寻找一个可以加载这些文件并将它们转换为位图的库(特别是 CS:GO 雷达概述)。我找到了一个似乎适用于所有图像的图像——除了一个。

显然,所有其他图像都有 DX1 或 DX5 压缩,其中一个(地图县)有 DX10 FourCC,带有扩展的 20 字节标题。我尝试通过删除标题来修改它,但是图像几乎无法读取,我还应该期待什么?

我在互联网上找到了一些 DirectX 或 SharpDX 的东西,但对我来说很难使用,我无法让它工作,有谁知道如何加载这些文件?或者如果有一个 C# 库也可以加载扩展的 DDS_HEADER_DXT10s?我找不到有关该压缩如何工作或标题中的“NVT3”代表什么的任何信息。