Skip to content

Commit d4a02b7

Browse files
committed
update transcoder to 78790b5, fix some bugs with KTX2 (ECT1S) mipmaps
[ci skip]
1 parent 008e5ef commit d4a02b7

File tree

4 files changed

+54
-40
lines changed

4 files changed

+54
-40
lines changed

Source/Core/loadKTX2.js

+35-36
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ var supportedTranscoderFormats;
2121
var transcoderModule;
2222
var transcoderPromise;
2323

24+
var ImageInfo;
25+
var BasisLzEtc1sImageTranscoder;
26+
2427
loadKTX2.setKTX2SupportedFormats = function (etc1, s3tc, pvrtc) {
2528
supportedTranscoderFormats = {
2629
etc1: etc1,
@@ -91,6 +94,11 @@ function loadKTX2(resourceOrUrlOrBuffer) {
9194
// eslint-disable-next-line new-cap
9295
MSC_TRANSCODER().then(function (basisModule) {
9396
transcoderModule = basisModule;
97+
basisModule.initTranscoders();
98+
99+
ImageInfo = basisModule.ImageInfo;
100+
BasisLzEtc1sImageTranscoder = basisModule.BasisLzEtc1sImageTranscoder;
101+
94102
deferred.resolve();
95103
});
96104
}
@@ -297,10 +305,8 @@ function parseKTX2(data) {
297305
parseUncompressed(data, header, levelIndex, result);
298306
} else if (header.vkFormat === 0x0 && dfd.colorModel === colorModelETC1S) {
299307
// Compressed, initialize transcoder module
300-
var BasisTranscoder = transcoderModule.BasisTranscoder;
301-
BasisTranscoder.init();
302-
var transcoder = new BasisTranscoder();
303-
parseCompressed(
308+
var transcoder = new BasisLzEtc1sImageTranscoder();
309+
transcodeEtc1s(
304310
data,
305311
view,
306312
header,
@@ -375,7 +381,7 @@ function parseUncompressed(data, header, levelIndex, result) {
375381
}
376382
}
377383

378-
function parseCompressed(
384+
function transcodeEtc1s(
379385
data,
380386
view,
381387
header,
@@ -411,8 +417,8 @@ function parseCompressed(
411417
alphaSliceByteOffset: view.getUint32((byteOffset += sizeOfUint32), true),
412418
alphaSliceByteLength: view.getUint32((byteOffset += sizeOfUint32), true),
413419
});
420+
byteOffset += sizeOfUint32;
414421
}
415-
byteOffset += sizeOfUint32;
416422

417423
var hasAlphaSlices = imageDescs[0].alphaSliceByteLength > 0;
418424

@@ -441,7 +447,7 @@ function parseCompressed(
441447
}
442448

443449
var dataBuffer = defined(data.buffer) ? data.buffer : data;
444-
var endpoints = new Uint8Array(dataBuffer, byteOffset, selectorsByteLength);
450+
var endpoints = new Uint8Array(dataBuffer, byteOffset, endpointsByteLength);
445451
byteOffset += endpointsByteLength;
446452
var selectors = new Uint8Array(dataBuffer, byteOffset, selectorsByteLength);
447453
byteOffset += selectorsByteLength;
@@ -457,49 +463,42 @@ function parseCompressed(
457463
for (var i = 0; i < levelIndex.length; ++i) {
458464
var level = (result[i] = {});
459465
var levelInfo = levelIndex[i];
460-
var imageInfo = imageDescs[i];
461-
462-
// BasisU blocks are 4x4: https://github.com/BinomialLLC/basis_universal/wiki/.basis-File-Format-and-ETC1S-Texture-Video-Specification
463-
var blockWidth = 4;
464-
var blockHeight = 4;
465-
466-
// NumBlocks formula: http://github.khronos.org/KTX-Specification/#_supercompression_global_data
467-
var numBlocksX = Math.ceil(header.pixelWidth / blockWidth);
468-
var numBlocksY = Math.max(1, Math.ceil(header.pixelHeight / blockHeight));
466+
var imageDesc = imageDescs[i];
469467

470468
for (var j = 0; j < header.faceCount; ++j) {
471469
var width = header.pixelWidth >> i;
472470
var height = header.pixelWidth >> i;
473471
var levelOffset = ktx2Offset + levelInfo.byteOffset;
474472

475-
var transcoded;
476-
var rgbData = new Uint8Array(
473+
var levelData = new Uint8Array(
477474
dataBuffer,
478-
levelOffset + imageInfo.rgbSliceByteOffset,
479-
imageInfo.rgbSliceByteLength
480-
);
481-
var alphaData = new Uint8Array(
482-
dataBuffer,
483-
levelOffset + imageInfo.alphaSliceByteOffset,
484-
imageInfo.alphaSliceByteLength
475+
levelOffset + imageDesc.rgbSliceByteOffset,
476+
imageDesc.rgbSliceByteLength + imageDesc.alphaSliceByteLength
485477
);
486478

487-
transcoded = transcoder.transcodeImage(
488-
imageInfo.imageFlags,
489-
rgbData,
490-
alphaData,
491-
transcoderFormat,
492-
i,
479+
var imageInfo = new ImageInfo(
480+
transcoderModule.TextureFormat.ETC1S,
493481
width,
494482
height,
495-
numBlocksX,
496-
numBlocksY,
497-
isVideo,
498-
false
483+
i
484+
);
485+
imageInfo.flags = imageDesc.imageFlags;
486+
imageInfo.rgbByteOffset = 0;
487+
imageInfo.rgbByteLength = imageDesc.rgbSliceByteLength;
488+
imageInfo.alphaByteOffset =
489+
imageDesc.alphaSliceByteOffset > 0 ? imageDesc.rgbSliceByteLength : 0;
490+
imageInfo.alphaByteLength = imageDesc.alphaSliceByteLength;
491+
492+
var transcoded = transcoder.transcodeImage(
493+
transcoderFormat,
494+
levelData,
495+
imageInfo,
496+
0,
497+
isVideo
499498
);
500499

501500
// Check Error Here
502-
if (transcoded.error) {
501+
if (transcoded.transcodedImage === undefined) {
503502
throw new RuntimeError("Error transcoding Image");
504503
}
505504

Source/Scene/Model.js

+12
Original file line numberDiff line numberDiff line change
@@ -1907,13 +1907,24 @@ function imageLoad(model, textureId) {
19071907
return function (image) {
19081908
var loadResources = model._loadResources;
19091909
--loadResources.pendingTextureLoads;
1910+
1911+
// Images transcoded from KTX2 can contain multiple mip levels:
1912+
// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu
1913+
var mipLevels;
1914+
if (Array.isArray(image)) {
1915+
// hightest detail mip should be level 0
1916+
mipLevels = image.slice(1, image.length);
1917+
image = image[0];
1918+
}
1919+
19101920
loadResources.texturesToCreate.enqueue({
19111921
id: textureId,
19121922
image: image,
19131923
bufferView: image.bufferView,
19141924
width: image.width,
19151925
height: image.height,
19161926
internalFormat: image.internalFormat,
1927+
mipLevels: mipLevels,
19171928
});
19181929
};
19191930
}
@@ -2875,6 +2886,7 @@ function createTexture(gltfTexture, model, context) {
28752886
height: gltfTexture.height,
28762887
pixelFormat: internalFormat,
28772888
sampler: sampler,
2889+
mipLevels: gltfTexture.mipLevels,
28782890
});
28792891
} else if (defined(source)) {
28802892
var npot =

Source/ThirdParty/msc_basis_transcoder.js

+7-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Source/ThirdParty/msc_basis_transcoder.wasm

100644100755
184 KB
Binary file not shown.

0 commit comments

Comments
 (0)