1

在我的引擎中,我需要能够检测具有 0 alpha 纹素的 DXT1 纹理(例如,窗口框架的切口)。这对于我自己压缩的纹理很容易,但我不确定已经压缩的纹理。

有没有一种简单的方法可以从标题中判断 DDS 图像是否包含 alpha?

4

4 回答 4

2

据我所知,没有办法从标题中分辨出来。有一个 DDPF_ALPHAPIXELS 标志,但我认为不会根据像素数据中的内容进行设置。您需要解析 DXT1 块,并查找其中包含 0 alpha 的颜色(我想,请务必检查该块中是否实际使用了该颜色)。

于 2008-08-21T08:46:47.303 回答
1

不,DDS 标头仅对未压缩图像使用 alpha 标志。我也有类似的需要弄清楚 DXT1 图像是否使用 1 位 alpha,经过长时间的搜索后,我在这里找到了这个参考:https ://msdn.microsoft.com/en-us/library/windows/desktop/ bb147243(v=vs.85).aspx

基本上如果 color_0 <= color_1 那么纹理有可能具有 1 位 alpha。要进一步验证它,您需要检查 2 位对中的下一个 32 位是否为 11。如果未找到,则对每个块继续此操作。

于 2017-01-31T13:04:57.457 回答
0

我同意接受的答案。通过使用“squish”库为您解压缩块,您的工作可能会变得更容易一些。

http://www.sjbrown.co.uk/?code=squish

于 2008-08-25T20:13:55.887 回答
0

DDS 是 DXT(或 BTC)数据的非常差的包装器。标题不会帮助你。普通的原始 DXT1 没有任何 alpha。我相信现在的 d3d 实际上确实用 alpha 解码了 DXT1。每个 DXT1 块看起来像这样:颜色 1(16 位)颜色 2(16 位)索引(32 位)。如果 16 位 color1 值小于 color2(只是一个 uint16 比较,没什么特别的!)该块没有 alpha。否则它会。所以回答你的问题:跳过标题,读取 16 位 a,读取 16 位 b,如果 a>b 则存在 alpha。否则跳过 32 位并重复直到 eof。其他 DXT 格式(如 DXT5)始终具有 alpha。人们很少依赖 DXT1 alpha 技巧,因为某些硬件(英特尔..)不能可靠地支持它。

于 2012-05-22T08:30:08.343 回答