Domanda

I'm trying to convert/compress my textures into a DDS format with DXT compression from original PNGs. I'm on a Mac, so I'm using Graphic Converter (though I've tried other tools as well). But no matter which DXT level I use (DXT1-5), the filesize remains roughly that of the original PNG.

È stato utile?

Soluzione

PNG is a lossless compression format, based on zlib with some specialized filters. It will guarantee to reproduce exactly the same image as the original.

As a consequence, PNG compression ratio is variable. On a complex image, compression will be poor. On a full black image, compression will be extremely good.

In contrast, DXT compression has a fixed compression ratio. This ratio is 8:1 for DXT1, and 4:1 for DXT5 (assuming 32-bits RGBA input). DXT5 advantage is a better alpha channel (for transparency). If you don't need it, don't use it, it's just a waste of bandwidth.

As you can guess, the trade-off is that DXT quality will be variable. DXT quality is merely considered "good enough", but it's far from perfect. On complex parts of the image, there will be some visible artefact/distortions. On simple parts, the reproduction will be almost exact to original.

The way PNG works is by compressing the whole image, as a single byte stream. The way DXT compression works is by cutting the image into little blocks of 4x4 pixels, and compressing them independently to a fixed compression ratio.

This makes for fundamentally different properties : DXT textures are supposed to be decoded directly by the GPU hardware. This is extremely fast, almost free. This is helped by the fact that the texture is cut into small blocks : it is not necessary to decode the whole texture to push a single pixel => just decode the appropriate 4x4 block. This property is key to the decoding process.

In contrast, PNG decode the whole image, and therefore has much more room to improve compression by finding correlations beyond the immediate 4x4 neighborhood. But the trade-off is that it's impossible to just retrieve a small block of pixels : that's the whole image or nothing.

As you can see, selecting one or the other compression method is not a matter of compression ratio. For storage purpose, choose PNG, not least because it is lossless. For fast displaying of lot of textures in real time (typical scenario for 3D games), DXT is the only way to go.

Altri suggerimenti

DDS/DXT textures are not guaranteed to be smalled than PNG. It depends on the contents of the texture and its size. A solid color PNG or mostly solid colors like a png of a cartoon will compress very small where as a photo will generally not compress well. Where as DXT is either 4 to 1 or 6 to 1 compression period depending whether it's DXT1 or DXT3 or DXT5

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top