diff --git a/glTF-Toolkit/inc/GLTFTextureCompressionUtils.h b/glTF-Toolkit/inc/GLTFTextureCompressionUtils.h index 2d78924..f3aa939 100644 --- a/glTF-Toolkit/inc/GLTFTextureCompressionUtils.h +++ b/glTF-Toolkit/inc/GLTFTextureCompressionUtils.h @@ -22,6 +22,7 @@ namespace Microsoft::glTF::Toolkit BC3, BC5, BC7, + BC7_SRGB }; /// diff --git a/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp b/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp index e2edd2c..8c226b8 100644 --- a/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp +++ b/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp @@ -110,6 +110,7 @@ GLTFDocument GLTFTextureCompressionUtils::CompressTextureAsDDS(const IStreamRead outputImagePath += "_BC5"; break; case TextureCompression::BC7: + case TextureCompression::BC7_SRGB: outputImagePath += "_BC7"; break; default: @@ -196,8 +197,8 @@ GLTFDocument GLTFTextureCompressionUtils::CompressAllTexturesForWindowsMR(const }; // Compress base and emissive texture as BC7 - compressIfNotEmpty(material.metallicRoughness.baseColorTextureId, TextureCompression::BC7); - compressIfNotEmpty(material.emissiveTextureId, TextureCompression::BC7); + compressIfNotEmpty(material.metallicRoughness.baseColorTextureId, TextureCompression::BC7_SRGB); + compressIfNotEmpty(material.emissiveTextureId, TextureCompression::BC7_SRGB); // Get other textures from the MSFT_packing_occlusionRoughnessMetallic extension if (material.extensions.find(EXTENSION_MSFT_PACKING_ORM) != material.extensions.end()) @@ -237,6 +238,7 @@ void GLTFTextureCompressionUtils::CompressImage(DirectX::ScratchImage& image, Te return; } + DWORD compressionFlags = DirectX::TEX_COMPRESS_DEFAULT; DXGI_FORMAT compressionFormat = DXGI_FORMAT_BC7_UNORM; switch (compression) { @@ -249,6 +251,10 @@ void GLTFTextureCompressionUtils::CompressImage(DirectX::ScratchImage& image, Te case TextureCompression::BC7: compressionFormat = DXGI_FORMAT_BC7_UNORM; break; + case TextureCompression::BC7_SRGB: + compressionFormat = DXGI_FORMAT_BC7_UNORM_SRGB; + compressionFlags |= DirectX::TEX_COMPRESS_SRGB_IN; + break; default: throw std::invalid_argument("Invalid compression specified."); break; @@ -265,7 +271,7 @@ void GLTFTextureCompressionUtils::CompressImage(DirectX::ScratchImage& image, Te if (device != nullptr) { - if (SUCCEEDED(DirectX::Compress(device.Get(), image.GetImages(), image.GetImageCount(), image.GetMetadata(), compressionFormat, DirectX::TEX_COMPRESS_DEFAULT, 0, compressedImage))) + if (SUCCEEDED(DirectX::Compress(device.Get(), image.GetImages(), image.GetImageCount(), image.GetMetadata(), compressionFormat, compressionFlags, 0, compressedImage))) { gpuCompressionSuccessful = true; } @@ -279,7 +285,7 @@ void GLTFTextureCompressionUtils::CompressImage(DirectX::ScratchImage& image, Te if (!gpuCompressionSuccessful) { // Try software compression - if (FAILED(DirectX::Compress(image.GetImages(), image.GetImageCount(), image.GetMetadata(), compressionFormat, DirectX::TEX_COMPRESS_DEFAULT, 0, compressedImage))) + if (FAILED(DirectX::Compress(image.GetImages(), image.GetImageCount(), image.GetMetadata(), compressionFormat, compressionFlags | DirectX::TEX_COMPRESS_PARALLEL, 0, compressedImage))) { throw GLTFException("Failed to compress data using software compression"); }