Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BC1-3 Compressor single color optimization #223

Open
walbourn opened this issue Mar 4, 2021 · 7 comments
Open

BC1-3 Compressor single color optimization #223

walbourn opened this issue Mar 4, 2021 · 7 comments
Assignees

Comments

@walbourn
Copy link
Member

walbourn commented Mar 4, 2021

The libsquish library adds a special-case block compression for DXT when all 16 source pixels in the block are the same color.

For this case, it uses a table-based scheme to pick the optimal encoding.

NVTT adopted the same solution.

@walbourn
Copy link
Member Author

walbourn commented Mar 4, 2021

Algorithm discussed in this blog

@walbourn
Copy link
Member Author

walbourn commented Jun 9, 2021

Q: What do to about dithering with the single-color blocks?

@walbourn walbourn self-assigned this Aug 18, 2021
@walbourn walbourn unpinned this issue Oct 23, 2021
@Hancapo
Copy link

Hancapo commented Aug 12, 2024

Any news about this? I'm trying to batch convert a bunch of images using a C# wrapper of this library but I'm getting the typical green-ish artifacts in every DXT1/DXT5, there's a workaround that can be done through code or something like that?

@walbourn
Copy link
Member Author

This issue is specifically for compressing 4x4 blocks that all contain exactly the same color. BC1-3 (a.k.a. DXT1-5) all use 5:6:5 for RGB so that sometimes can make the result be a little green tinted depending on the input values.

By default the DXT1-5 compressor is using a 'luminance perceptual' weighting for the colors. You could try TEX_COMPRESS_UNIFORM (which for texconv is -bc u switch). It could also be the result of SRGB vs. Linear color space mix ups.

@Hancapo
Copy link

Hancapo commented Aug 13, 2024

Using TEX_COMPRESS_FLAGS.UNIFORM doesn't change anything, getting the same artifacts as always.
I tried using almost every combination of WIC_FLAGS and TEX_COMPRESS_FLAGS
PD: The wrapper is using the March 2024 version of the lib.

ScratchImage image = TexHelper.Instance.LoadFromWICFile("Original.png", WIC_FLAGS.NONE);
ScratchImage compressed = image.Compress(DXGI_FORMAT.BC1_UNORM, TEX_COMPRESS_FLAGS.UNIFORM, 0.5f);
compressed.SaveToDDSFile(DDS_FLAGS.NONE, "Compressed.dds");

@walbourn
Copy link
Member Author

Can you attach the original.png?

@Hancapo
Copy link

Hancapo commented Aug 13, 2024

Sure:
Image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants