I have checked a few examples of DDS loader implementation. Typically, detecting DXT format looks like this:
if (ddsHeader.ddsPixelFormat.dwFlags & DDSF_FOURCC)
{
switch (ddsHeader.ddsPixelFormat.dwFourCC)
{
case FOURCC_DXT1:
{
format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
break;
}
//etc
Detecting standard RGB format looks this way:
if (ddsHeader.ddsPixelFormat.dwFlags & DDPF_RGB)
{
if (ddsHeader.ddsPixelFormat.dwRGBBitCount == 24 &&
ddsHeader.ddsPixelFormat.dwRBitMask == 0x000000FF &&
ddsHeader.ddsPixelFormat.dwGBitMask == 0x0000FF00 &&
ddsHeader.ddsPixelFormat.dwBBitMask == 0x00FF0000)
{
format = GL_RGB8;
}
//etc
How to detect sRGB formats, for example GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
or GL_SRGB8_EXT
? Does DDS support sRGB formats ?
D3D10 introduced image formats for sRGB images. These formats could be used in an extended version of the DDS format, thereby allowing such files to declare that they contain sRGB data. Including block-compressed versions.
However, this requires both a compressor and a loader that supports DDS-10. You can tell if a loader supports DDS-10 if it checks the FOURCC for "DX10"
and uses the DDS_HEADER_DXT10
header to get a DXGI
format. The testing code you showed does not appear to do so.