在DDS文件中,您可以检测具有0/1 alpha位的纹理吗?

时间:2008-08-21 07:33:11

标签: graphics directx directdraw dds-format

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

是否可以通过标题轻松判断DDS图像是否包含alpha?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我同意接受的答案。使用“挤压”库为您解压缩块可以使您的工作更容易。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

不,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。要进一步验证它,如果它们是11,则需要检查2位对中的下一个32位。如果没有找到,则对每个块继续此操作。