Skip to content

Commit fd0bc67

Browse files
erikdahlstromrobertos
authored andcommitted
Set BC7 sRGB flag for the relevant textures, and compress in parallel if no GPU (#19)
* Compress textures in parallel if no GPU available, with TEX_COMPRESS_PARALLEL. * Add and use BC7_SRGB compression format, for Oasis. * Use BC7_SRGB compression format for emissive textures too.
1 parent c091bb7 commit fd0bc67

2 files changed

Lines changed: 11 additions & 4 deletions

File tree

glTF-Toolkit/inc/GLTFTextureCompressionUtils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ namespace Microsoft::glTF::Toolkit
2222
BC3,
2323
BC5,
2424
BC7,
25+
BC7_SRGB
2526
};
2627

2728
/// <summary>

glTF-Toolkit/src/GLTFTextureCompressionUtils.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)