问题标签 [dxt]

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 投票
3 回答
4631 浏览

c# - DXT 纹理压缩?

我正在处理需要使用 DXT/S3TC 格式(特别是 DXT5)压缩的多个图像。

有谁知道提供实时压缩的 DXT 压缩实现(最好在 C# 中,或使用 .Net 框架)?我的应用程序将一次压缩 10-20 个 512x512 图像,所以我想要一个相对快速的实现,如果有的话。我搜索了又搜索,但似乎找不到一个,并且由于某种原因,我无法充分了解 DXT5 格式来编写自己的实现。

我知道 XNA 框架支持 DXT 压缩。有人会碰巧知道它是否相当快吗?人们是否需要安装 XNA 才能使用我的应用程序?

谢谢你的帮助。:)

0 投票
2 回答
1376 浏览

python - Python 的 DXT 压缩

我目前正在使用图像,其中一些是 DXT 压缩的,我需要一种简单的方法来使用 Python 解压缩和压缩这些文件。不幸的是,我找不到任何为我做这件事的图书馆。

有谁知道一个好的 Python 的 DXT-Compression 库,或者一个压缩库的接口?

-- dav1d

编辑:

libsquish 是去这里的方式,但不幸的是 Python-Bindings 不起作用,所以这里是解决方案。

在 C++ 中创建一个 squish-Wrapper,它导出内部访问 libsquish 的函数:

创建一个动态库(windows 上的 dll,或者 linux 上的等等,我称之为libsquishc.so)并用ctypes.

我的方法(只导出我需要的功能):

0 投票
1 回答
1196 浏览

c++ - 使用 Directx11 对 DXT 压缩纹理进行运行时更新时出错

背景: 我正在开发一个原生 C++ Unity 5 插件,它读取 DXT 压缩纹理数据并将其上传到 GPU 以在 Unity 中进一步使用。目的是创建一个快速的图像序列播放器,即时更新图像数据。纹理使用离线控制台应用程序进行压缩。Unity 可以使用不同的图形引擎,我的目标是 DirectX11 和 OpenGL 3.3+。

问题: DirectX 运行时纹理更新代码,通过映射的子资源,在不同的图形驱动程序上提供不同的输出。通过这种映射资源更新纹理意味着将指针映射到纹理数据并将数据从 RAM 缓冲区 memcpy'ing 到映射的 GPU 缓冲区。这样做,不同的驱动程序在复制字节时似乎期望不同的行间距值参数。我在测试过的几个 Nvidia GPU 上从来没有遇到过问题,但是 AMD 和 Intel GPU 的行为似乎不同,我得到了如下所示的失真输出。此外,我正在使用 DXT1 像素数据 (0.5bpp) 和 DXT5 数据 (1bpp)。我似乎无法为这些 DXT 纹理获得正确的音高参数。

代码: 以下用于生成 d3d11 纹理并用初始纹理数据填充它的初始化代码 - 例如图像序列的第一帧 - 在所有驱动程序上都能完美运行。播放器指针指向一个自定义类,该类处理所有文件读取并包含当前加载的 DXT 压缩帧的吸气剂,它的尺寸等......

为每个新帧运行的以下更新代码在某处存在错误。请注意包含方法 1 的注释行,该方法使用简单的 memcpy,没有指定任何行间距,这在 NVIDIA 驱动程序上运行良好。
您可以在方法 2 中进一步看到我记录了不同的行间距值。对于 1920x960 帧的实例,缓冲区步幅为 1920,运行时步幅为 2048。这 128 像素的差异可能必须被填充(如下面的示例图片所示),但我不知道如何填充。当我只使用 mappedResource.RowPitch 而不将其除以 4(由位移完成)时,Unity 崩溃。

示例图 1 - 使用 memcpy 复制整个缓冲区而不在 AMD/INTEL 上使用单独的行间距时输出失真(方法 1)

失真输出

示例图片 2 - 在 AMD/INTEL(方法 2)上使用以上带有 mappedResource.RowPitch 的代码时输出更好但仍然错误。蓝色条表示错误区域,需要消失,以便所有像素对齐良好并形成一个图像。

在此处输入图像描述

感谢您的任何指点!最好的,文森特

0 投票
1 回答
347 浏览

opengl - Frostbite PBR:同一纹理的不同纹理通道上的不同压缩

是否有可能,如果是的话,如何在 OpenGL4.x 中的不同通道上创建和读取具有不同压缩算法的 RGBA 纹理:

没有实际意义的示例 A:

  1. RG通道存储以 3Dc 编码的法线贴图
  2. B通道存储高度值,让我们说带有一些编码的镶嵌
  3. 通道存储未压缩的原始 MaterialID

示例 B:

  1. RGB存储用 DXT1 压缩的材质参数
  2. A保存 MaterialID 不压缩

背景:

在第 15 页和第 18 页的基于物理的渲染 PBR (PDF)的 Frostbite 实现中,作者描述了他们如何将材质参数结构化到不同的纹理通道中。他们还提到他们避免在某些通道上进行纹理压缩,而没有详细说明他们指的是哪些通道。

第 15 页

所有基本属性(Normal、BaseColor、Smoothness、MetalMask、Reflectance)都需要可混合以支持延迟贴花。不可混合的属性(例如 MaterialId)存储在 Alpha 通道中。我们还避免了可能影响混合质量的压缩和编码机制。

第 18 页

在这种情况下,我们选择避免​​压缩我们的少数属性并依赖简单的线性插值 alpha 混合。

0 投票
1 回答
240 浏览

c++ - DXT3 (BC2) 压缩格式 alpha 数据

我正在尝试从 dds 文件中读取图像信息。我设法让 DXT1 和 DXT5 格式正常工作,但是我对 DXT3 格式(也称为BC2)的 alpha 数据有疑问。查看压缩BC2 块的布局时,它显示 16 像素块的 alpha 数据存储在数据的前 8 个字节中,每个值占用 4 位。

这是否意味着,由于存储的 alpha 值只能是 0-15,所以实际的 alpha 数据计算如下:

这是正确的,还是我看错了?

0 投票
1 回答
792 浏览

java - 使用 alpha 将字节数组转换为 png 图像

我在这里和整个互联网上经历了很多问题,但还没有取得任何成功。

我有一个字节数组,它表示应该转换为 PNG 图像的原始数据。它有 alpha,所以我的颜色是 RGBA。据我所知,字节数组是原始图像数据本身,没有标头或元数据或某些库或方法可能假定的任何其他内容(此字节数组是从 DXT5 解码的)。

如何将我的原始图像数据字节数组转换为带有 alpha 的 PNG 图像?

编辑:由于我不知道我在这个领域做什么,我可能在这里包含比对问题进行分类所需的更多代码。

这是DXT5解码的东西:

运行自:

PNG部分在这里。这是我搜索工作中的最新版本,也是最接近的版本。文件大小、尺寸、形状等都在那里;只是颜色变了。有很多文物正在发生;不属于图像的颜色。PNG 代码看起来不错(我尝试了几种不同的波段偏移顺序,但它们都产生相同的图像)。也许DXT5解码错误?或者也许 PNG 的东西实际上并不好。就像我说的,我不知道我在这里做什么,因为它在我的领域之外。如前所述,这个 DXT5 解码图像是 RGBA 的形式(每个一个字节)。

0 投票
1 回答
1048 浏览

python - 如何在 python 中使用 S3TC/DXT 算法压缩 PNG 图像?

我试图找到使用 python 库使用任何 S3TC/DXT 算法压缩图像(以 PNG 为例)的方法。

正如我在Pillow(PIL)库 DDS 格式Read-only formats部分中看到的那样。因此 Pillow 不能用于此目的。
在谷歌搜索并没有给出积极的结果。

问题:

可以用python做吗?
有人可以提供具有这种功能的库的链接吗?(在实践中检查)
DDS 格式对我的情况不是强制性的。我只需要压缩文件。

PS:

它是创建纹理以供将来使用所必需的。
库应该支持不同的压缩算法。

0 投票
2 回答
213 浏览

gpu - 在硬件中高效实现 DXT1 纹理解压

DXT1 压缩设计用于在用于纹理采样器的硬件中快速解压缩。维基百科文章说,在某些情况下,您可以计算出插值颜色的系数:

或重新安排:

但是,如果您重新排列上述等式,那么您最终总是不得不将某个值乘以 1/3(或除以 3,同样的交易更昂贵)。对我来说很奇怪,设计为在硬件中快速解压缩的纹理格式需要乘法或除法。我在其上实现 GPU 的 FPGA 只有有限的乘法资源,我想将它们保存在真正需要的地方。

所以我错过了什么吗?有没有一种有效的方法可以避免将颜色通道乘以 1/3?还是我应该只吃乘法的成本?

0 投票
0 回答
32 浏览

c++ - 只有开始的 DXT 纹理加载 openGL

我最近开始学习openGL。在这样做的同时,我开始尝试实现纹理。这在使用外部解压缩库加载 jpeg 纹理时很容易工作,但是我随后尝试加载 DXT 纹理并创建了一些代码来加载 DXT 文件并将其用作纹理。当我尝试使用此纹理时,我尝试纹理化的对象的面如下所示:面部纹理不正确

然而,纹理应该是这样的:尝试使用的纹理 我创建了这个具有 10 个 mipmap 级别的 DXT 文件,从初始分辨率 512 * 512 一直到 1 * 1,我认为这个问题与文件中的所有 mipmap 有关被加载为一种纹理,但我不确定。我用来创建纹理的代码是:

其中 buffer 是包含图像的缓冲区,width 和 height 分别是宽度和高度,level 是 mipmap 级别,offset 是缓冲区中 mipmap 级别的偏移量,format 是图像格式,size 是大小单独的mipmap。其他标志,如纹理包裹和最大和最小过滤器放大功能是稍后设置的,但我认为它们与这个问题无关。

0 投票
1 回答
24 浏览

rendering - Vulkan 中的法线贴图 DXT5 压缩

在 DX10 中,通常的做法是通过将 Y 值放在绿色通道中,将 X 值放在 alpha 中来压缩法线贴图,并应用 DXT5 压缩(然后在着色器中重建 Z 分量)。Vulkan中对应的格式是什么?我能找到的最接近的是 VK_FORMAT_BC5_UNORM_BLOCK,它是带有 DXT5 的无符号 RG 通道。这是等价的吗?如果是这样,您会将其存储为 R: X 和 G: Y 还是相反(是否重要)?还是有更新的压缩格式做得更好?