Fixing DXT Green Tint Compression

From Valve Developer Community
Jump to: navigation, search
Original texture (left) versus a re-converted, untreated copy (right), demonstrating the effects of DXT compression.

In the Source Engine, textures are stored using the Valve Texture Format (VTF), which can store image data in a great variety of formats. The most common and standard ones are the lossy and compression-based DXT1 (used for textures with no alpha channel) and DXT5 (used for textures with an alpha channel). Due to the technical nature of these format’s sampling methods, a slightly green-tinted output is generated whenever sampling colors from these formats. Usually, this altered result would merit no tampering. However, if a project requires both a texture and a modified version to be side by side, differences will inevitably become evident, calling for a workaround to be implemented.

A natural solution would be to store the texture using a different format, such as an uncompressed and, therefore, lossless one, like BGR888 or BGRA888. However, these formats will considerably increase file size, demanding for yet another workaround to be implemented.

Steps

  1. Open the original texture in the image editor of your choice.
  2. Create a blank layer with alpha channel support on top of the original texture.
  3. Bucket-fill the new layer with RGB 7 3 7 (HTML notation #070307).
  4. Copy the original texture and paste it into the alpha channel of the new layer.
  5. Set the layer mode to Legacy Addition (GIMP),[1] Linear Dodge (Add) (Photoshop) or the equivalent addition-based blend mode of your editor.
  6. Flatten the image if the texture has no transparency. Otherwise, merge all visible layers.
  7. Export as TGA and convert to VTF using VTFEdit. For the image data format, use either DXT1 or DXT5, depending on your source material.

Footnotes

  1. For GIMP 2.10, the entire program was ported to the GEGL image processing library, which is based around linear RGB color space as opposed to gamma-corrected (perceptual) RGB color space, which modifies the behaviour of several blending modes. This is why switching blending modes from Normal to Legacy is required; for pre-2.10 backwards compatibility.