@@ -110,6 +110,7 @@ GLTFDocument GLTFTextureCompressionUtils::CompressTextureAsDDS(const IStreamRead
110110 outputImagePath += " _BC5" ;
111111 break ;
112112 case TextureCompression::BC7:
113+ case TextureCompression::BC7_SRGB:
113114 outputImagePath += " _BC7" ;
114115 break ;
115116 default :
@@ -196,8 +197,8 @@ GLTFDocument GLTFTextureCompressionUtils::CompressAllTexturesForWindowsMR(const
196197 };
197198
198199 // Compress base and emissive texture as BC7
199- compressIfNotEmpty (material.metallicRoughness .baseColorTextureId , TextureCompression::BC7 );
200- compressIfNotEmpty (material.emissiveTextureId , TextureCompression::BC7 );
200+ compressIfNotEmpty (material.metallicRoughness .baseColorTextureId , TextureCompression::BC7_SRGB );
201+ compressIfNotEmpty (material.emissiveTextureId , TextureCompression::BC7_SRGB );
201202
202203 // Get textures from the MSFT_packing_occlusionRoughnessMetallic extension
203204 if (material.extensions .find (EXTENSION_MSFT_PACKING_ORM) != material.extensions .end ())
@@ -251,6 +252,7 @@ void GLTFTextureCompressionUtils::CompressImage(DirectX::ScratchImage& image, Te
251252 return ;
252253 }
253254
255+ DWORD compressionFlags = DirectX::TEX_COMPRESS_DEFAULT;
254256 DXGI_FORMAT compressionFormat = DXGI_FORMAT_BC7_UNORM;
255257 switch (compression)
256258 {
@@ -263,6 +265,10 @@ void GLTFTextureCompressionUtils::CompressImage(DirectX::ScratchImage& image, Te
263265 case TextureCompression::BC7:
264266 compressionFormat = DXGI_FORMAT_BC7_UNORM;
265267 break ;
268+ case TextureCompression::BC7_SRGB:
269+ compressionFormat = DXGI_FORMAT_BC7_UNORM_SRGB;
270+ compressionFlags |= DirectX::TEX_COMPRESS_SRGB_IN;
271+ break ;
266272 default :
267273 throw std::invalid_argument (" Invalid compression specified." );
268274 break ;
@@ -279,7 +285,7 @@ void GLTFTextureCompressionUtils::CompressImage(DirectX::ScratchImage& image, Te
279285
280286 if (device != nullptr )
281287 {
282- if (SUCCEEDED (DirectX::Compress (device.Get (), image.GetImages (), image.GetImageCount (), image.GetMetadata (), compressionFormat, DirectX::TEX_COMPRESS_DEFAULT , 0 , compressedImage)))
288+ if (SUCCEEDED (DirectX::Compress (device.Get (), image.GetImages (), image.GetImageCount (), image.GetMetadata (), compressionFormat, compressionFlags , 0 , compressedImage)))
283289 {
284290 gpuCompressionSuccessful = true ;
285291 }
@@ -293,7 +299,7 @@ void GLTFTextureCompressionUtils::CompressImage(DirectX::ScratchImage& image, Te
293299 if (!gpuCompressionSuccessful)
294300 {
295301 // Try software compression
296- if (FAILED (DirectX::Compress (image.GetImages (), image.GetImageCount (), image.GetMetadata (), compressionFormat, DirectX::TEX_COMPRESS_DEFAULT , 0 , compressedImage)))
302+ if (FAILED (DirectX::Compress (image.GetImages (), image.GetImageCount (), image.GetMetadata (), compressionFormat, compressionFlags | DirectX::TEX_COMPRESS_PARALLEL , 0 , compressedImage)))
297303 {
298304 throw GLTFException (" Failed to compress data using software compression" );
299305 }
0 commit comments