代码之家  ›  专栏  ›  技术社区  ›  Andrew Grant

在DDS文件中,你能用0/1个字母位检测纹理吗?

  •  1
  • Andrew Grant  · 技术社区  · 16 年前

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

    有没有一个简单的方法从头部判断一个DDS图像是否包含alpha?

    4 回复  |  直到 8 年前
        1
  •  2
  •   James Sutherland    16 年前

    据我所知,没有办法从头条看出。有一个ddpf_Alphapixels标志,但我不认为它会基于像素数据中的内容进行设置。您需要解析dxt1块,并查找其中包含0 alpha的颜色(我想,一定要检查颜色是否也在块中使用)。

        2
  •  0
  •   Chris Blackwell    16 年前

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

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

        3
  •  0
  •   starmole    12 年前

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

        4
  •  0
  •   Alundaio    8 年前

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