From bbc7b5a6dc27ee2d9519bd2a0b78dff69a0f0fd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Dahlstr=C3=B6m?= Date: Mon, 26 Feb 2018 16:22:07 +0100 Subject: [PATCH 1/3] Compress textures in parallel if no GPU available, with TEX_COMPRESS_PARALLEL. --- glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp b/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp index e2edd2c..3b7f0fe 100644 --- a/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp +++ b/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp @@ -279,7 +279,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, DirectX::TEX_COMPRESS_PARALLEL, 0, compressedImage))) { throw GLTFException("Failed to compress data using software compression"); } From 679ab98fb1ddd6211bcd6063e175432329f14ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Dahlstr=C3=B6m?= Date: Tue, 27 Feb 2018 10:33:19 +0100 Subject: [PATCH 2/3] Add and use BC7_SRGB compression format, for Oasis. --- glTF-Toolkit/inc/GLTFTextureCompressionUtils.h | 1 + glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) 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 3b7f0fe..257e127 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,7 +197,7 @@ GLTFDocument GLTFTextureCompressionUtils::CompressAllTexturesForWindowsMR(const }; // Compress base and emissive texture as BC7 - compressIfNotEmpty(material.metallicRoughness.baseColorTextureId, TextureCompression::BC7); + compressIfNotEmpty(material.metallicRoughness.baseColorTextureId, TextureCompression::BC7_SRGB); compressIfNotEmpty(material.emissiveTextureId, TextureCompression::BC7); // Get other textures from the MSFT_packing_occlusionRoughnessMetallic extension @@ -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_PARALLEL, 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"); } From eda03affc0d34b73fd8d9474aff5e608427d3e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Dahlstr=C3=B6m?= Date: Tue, 27 Feb 2018 16:37:54 +0100 Subject: [PATCH 3/3] Use BC7_SRGB compression format for emissive textures too. --- glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp b/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp index 257e127..8c226b8 100644 --- a/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp +++ b/glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp @@ -198,7 +198,7 @@ GLTFDocument GLTFTextureCompressionUtils::CompressAllTexturesForWindowsMR(const // Compress base and emissive texture as BC7 compressIfNotEmpty(material.metallicRoughness.baseColorTextureId, TextureCompression::BC7_SRGB); - compressIfNotEmpty(material.emissiveTextureId, TextureCompression::BC7); + 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())