Java 尝试解压缩BC1纹理压缩的置乱块

Java 尝试解压缩BC1纹理压缩的置乱块,java,compression,directx,textures,rgba,Java,Compression,Directx,Textures,Rgba,我一直在尝试用Java实现BC1(DXT1)解压缩算法。一切看起来都非常精确,但我遇到了一些透明块周围的问题。我已经试着解决了几个小时,但没有成功 简言之,解压所有块后,除了透明块周围的块外,其他所有块看起来都很好。在开发过程中,我一直在用C++编写的DistTxTeX(TeXCONV)的结果检查结果。 这是我与DirectXTex one的比较结果: 以下是我正在使用的代码: BufferedImage decompress(byte[] buffer, int width, int hei

我一直在尝试用Java实现BC1(DXT1)解压缩算法。一切看起来都非常精确,但我遇到了一些透明块周围的问题。我已经试着解决了几个小时,但没有成功

简言之,解压所有块后,除了透明块周围的块外,其他所有块看起来都很好。在开发过程中,我一直在用C++编写的DistTxTeX(TeXCONV)的结果检查结果。 这是我与DirectXTex one的比较结果:

以下是我正在使用的代码:

BufferedImage decompress(byte[] buffer, int width, int height)
和执行:

  BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
  int[] scanline = new int[4 * width]; //stores 4 horizontal lines (width/4 blocks)

  RGBA[] blockPalette = new RGBA[4]; //stores RGBA values of current block

  int bufferOffset = 0;

  for (int row = 0; row < height / 4; row++) {
        for (int col = 0; col < width / 4; col++) {

            short rgb0 = Short.reverseBytes(Bytes.getShort(buffer, bufferOffset));
            short rgb1 = Short.reverseBytes(Bytes.getShort(buffer, bufferOffset + 2));
            int bitmap = Integer.reverseBytes(Bytes.getInt(buffer, bufferOffset + 4));
            bufferOffset += 8;

            blockPalette[0] = R5G6B5.decode(rgb0);
            blockPalette[1] = R5G6B5.decode(rgb1);

            if(rgb0 <= rgb1) {
                int c2r = (blockPalette[0].getRed() + blockPalette[1].getRed()) / 2;
                int c2g = (blockPalette[0].getGreen() + blockPalette[1].getGreen()) / 2;
                int c2b = (blockPalette[0].getBlue() + blockPalette[1].getBlue()) / 2;

                 blockPalette[2] = new RGBA(c2r, c2g, c2b, 255);
                 blockPalette[3] = new RGBA(0, 0, 0, 0);

            } else {
                int c2r = (2 * blockPalette[0].getRed() + blockPalette[1].getRed()) / 3;
                int c2g = (2 * blockPalette[0].getGreen() + blockPalette[1].getGreen()) / 3;
                int c2b = (2 * blockPalette[0].getBlue() + blockPalette[1].getBlue()) / 3;

                int c3r = (blockPalette[0].getRed() + 2 * blockPalette[1].getRed()) / 3;
                int c3g = (blockPalette[0].getGreen() + 2 * blockPalette[1].getGreen()) / 3;
                int c3b = (blockPalette[0].getBlue() + 2 * blockPalette[1].getBlue()) / 3;


                blockPalette[2] = new RGBA(c2r, c2g, c2b, 255);
                blockPalette[3] = new RGBA(c3r, c3g, c3b, 255);

            }

            for (int i = 0; i < 16; i++, bitmap >>= 2) {
                int pi = (i / 4) * width + (col * 4 + i % 4);
                int index = bitmap & 3;
                scanline[pi] = A8R8G8B8.encode(blockPalette[index]);
           }
        }
        //copy scanline to buffered image
        result.setRGB(0, row * 4, width, 4, scanline, 0, width);
  }
  return result;
BufferedImage结果=新的BufferedImage(宽度、高度、BufferedImage.TYPE_INT_ARGB);
int[]扫描线=新的int[4*宽度]//存储4条水平线(宽度/4块)
RGBA[]块调色板=新RGBA[4]//存储当前块的RGBA值
int bufferOffset=0;
对于(int row=0;row=2){
整数π=(i/4)*宽度+(列*4+i%4);
int索引=位图&3;
扫描线[pi]=A8R8G8B8.编码(块调色板[index]);
}
}
//将扫描线复制到缓冲图像
结果.setRGB(0,行*4,宽度,4,扫描线,0,宽度);
}
返回结果;

有人知道问题出在哪里吗?我所做的步骤与规范所说的完全相同:

块调色板[2].set(c2r、c2g、c2b)应该是
块调色板[2]。设置(c2r、c2g、c2b、255)?(在两个位置)

对于那些感兴趣的人,我发现问题在于比较短值

我刚刚改变了:

if(rgb0 <= rgb1) {

if(rgb0)感谢您的回复,是的,应该是我忘记了,但不幸的是它没有解决问题。
if(Short.compareUnsigned(rgb0, rgb1) <= 0) {
if((rgb0 & 0xffff) <= (rgb1 & 0xffff)) {