Skip to content

Commit dd411ce

Browse files
committed
KTX2Loader: Add support for BC4, BC5
1 parent e9f7c8b commit dd411ce

File tree

5 files changed

+61
-25
lines changed

5 files changed

+61
-25
lines changed

examples/jsm/loaders/KTX2Loader.js

Lines changed: 58 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ import {
2828
RGB_ETC2_Format,
2929
RGB_PVRTC_4BPPV1_Format,
3030
RGB_S3TC_DXT1_Format,
31+
SIGNED_RED_GREEN_RGTC2_Format,
32+
SIGNED_RED_RGTC1_Format,
33+
RED_GREEN_RGTC2_Format,
34+
RED_RGTC1_Format,
3135
RGBFormat,
3236
RGFormat,
3337
RedFormat,
@@ -57,6 +61,8 @@ import {
5761
VK_FORMAT_BC1_RGB_UNORM_BLOCK,
5862
VK_FORMAT_BC3_SRGB_BLOCK,
5963
VK_FORMAT_BC3_UNORM_BLOCK,
64+
VK_FORMAT_BC4_SNORM_BLOCK,
65+
VK_FORMAT_BC4_UNORM_BLOCK,
6066
VK_FORMAT_BC5_SNORM_BLOCK,
6167
VK_FORMAT_BC5_UNORM_BLOCK,
6268
VK_FORMAT_BC7_SRGB_BLOCK,
@@ -930,42 +936,45 @@ const UNCOMPRESSED_FORMATS = new Set( [ RGBAFormat, RGBFormat, RGFormat, RedForm
930936
const FORMAT_MAP = {
931937

932938
[ VK_FORMAT_R32G32B32A32_SFLOAT ]: RGBAFormat,
933-
[ VK_FORMAT_R16G16B16A16_SFLOAT ]: RGBAFormat,
934-
[ VK_FORMAT_R8G8B8A8_UNORM ]: RGBAFormat,
935-
[ VK_FORMAT_R8G8B8A8_SRGB ]: RGBAFormat,
936-
937939
[ VK_FORMAT_R32G32_SFLOAT ]: RGFormat,
938-
[ VK_FORMAT_R16G16_SFLOAT ]: RGFormat,
939-
[ VK_FORMAT_R8G8_UNORM ]: RGFormat,
940-
[ VK_FORMAT_R8G8_SRGB ]: RGFormat,
941-
942940
[ VK_FORMAT_R32_SFLOAT ]: RedFormat,
941+
942+
[ VK_FORMAT_R16G16B16A16_SFLOAT ]: RGBAFormat,
943+
[ VK_FORMAT_R16G16_SFLOAT ]: RGFormat,
943944
[ VK_FORMAT_R16_SFLOAT ]: RedFormat,
945+
946+
[ VK_FORMAT_R8G8B8A8_SRGB ]: RGBAFormat,
947+
[ VK_FORMAT_R8G8B8A8_UNORM ]: RGBAFormat,
948+
[ VK_FORMAT_R8G8_SRGB ]: RGFormat,
949+
[ VK_FORMAT_R8G8_UNORM ]: RGFormat,
944950
[ VK_FORMAT_R8_SRGB ]: RedFormat,
945951
[ VK_FORMAT_R8_UNORM ]: RedFormat,
946952

947953
[ VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 ]: RGBFormat,
948954
[ VK_FORMAT_B10G11R11_UFLOAT_PACK32 ]: RGBFormat,
949955

950-
[ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: RGB_ETC2_Format,
951956
[ VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK ]: RGBA_ETC2_EAC_Format,
957+
[ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: RGB_ETC2_Format,
952958

953959
[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: RGBA_ASTC_4x4_Format,
954960
[ VK_FORMAT_ASTC_4x4_SRGB_BLOCK ]: RGBA_ASTC_4x4_Format,
955961
[ VK_FORMAT_ASTC_4x4_UNORM_BLOCK ]: RGBA_ASTC_4x4_Format,
956962
[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: RGBA_ASTC_6x6_Format,
957963
[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: RGBA_ASTC_6x6_Format,
958964

959-
[ VK_FORMAT_BC1_RGBA_UNORM_BLOCK ]: RGBA_S3TC_DXT1_Format,
960965
[ VK_FORMAT_BC1_RGBA_SRGB_BLOCK ]: RGBA_S3TC_DXT1_Format,
961-
[ VK_FORMAT_BC1_RGB_UNORM_BLOCK ]: RGB_S3TC_DXT1_Format,
966+
[ VK_FORMAT_BC1_RGBA_UNORM_BLOCK ]: RGBA_S3TC_DXT1_Format,
962967
[ VK_FORMAT_BC1_RGB_SRGB_BLOCK ]: RGB_S3TC_DXT1_Format,
968+
[ VK_FORMAT_BC1_RGB_UNORM_BLOCK ]: RGB_S3TC_DXT1_Format,
963969

964970
[ VK_FORMAT_BC3_SRGB_BLOCK ]: RGBA_S3TC_DXT3_Format,
965971
[ VK_FORMAT_BC3_UNORM_BLOCK ]: RGBA_S3TC_DXT3_Format,
966972

967-
[ VK_FORMAT_BC5_SNORM_BLOCK ]: RGBA_S3TC_DXT5_Format,
968-
[ VK_FORMAT_BC5_UNORM_BLOCK ]: RGBA_S3TC_DXT5_Format,
973+
[ VK_FORMAT_BC4_SNORM_BLOCK ]: SIGNED_RED_RGTC1_Format,
974+
[ VK_FORMAT_BC4_UNORM_BLOCK ]: RED_RGTC1_Format,
975+
976+
[ VK_FORMAT_BC5_SNORM_BLOCK ]: SIGNED_RED_GREEN_RGTC2_Format,
977+
[ VK_FORMAT_BC5_UNORM_BLOCK ]: RED_GREEN_RGTC2_Format,
969978

970979
[ VK_FORMAT_BC7_SRGB_BLOCK ]: RGBA_BPTC_Format,
971980
[ VK_FORMAT_BC7_UNORM_BLOCK ]: RGBA_BPTC_Format,
@@ -975,30 +984,49 @@ const FORMAT_MAP = {
975984
const TYPE_MAP = {
976985

977986
[ VK_FORMAT_R32G32B32A32_SFLOAT ]: FloatType,
978-
[ VK_FORMAT_R16G16B16A16_SFLOAT ]: HalfFloatType,
979-
[ VK_FORMAT_R8G8B8A8_UNORM ]: UnsignedByteType,
980-
[ VK_FORMAT_R8G8B8A8_SRGB ]: UnsignedByteType,
981-
982987
[ VK_FORMAT_R32G32_SFLOAT ]: FloatType,
983-
[ VK_FORMAT_R16G16_SFLOAT ]: HalfFloatType,
984-
[ VK_FORMAT_R8G8_UNORM ]: UnsignedByteType,
985-
[ VK_FORMAT_R8G8_SRGB ]: UnsignedByteType,
986-
987988
[ VK_FORMAT_R32_SFLOAT ]: FloatType,
989+
990+
[ VK_FORMAT_R16G16B16A16_SFLOAT ]: HalfFloatType,
991+
[ VK_FORMAT_R16G16_SFLOAT ]: HalfFloatType,
988992
[ VK_FORMAT_R16_SFLOAT ]: HalfFloatType,
993+
994+
[ VK_FORMAT_R8G8B8A8_SRGB ]: UnsignedByteType,
995+
[ VK_FORMAT_R8G8B8A8_UNORM ]: UnsignedByteType,
996+
[ VK_FORMAT_R8G8_SRGB ]: UnsignedByteType,
997+
[ VK_FORMAT_R8G8_UNORM ]: UnsignedByteType,
989998
[ VK_FORMAT_R8_SRGB ]: UnsignedByteType,
990999
[ VK_FORMAT_R8_UNORM ]: UnsignedByteType,
9911000

9921001
[ VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 ]: UnsignedInt5999Type,
9931002
[ VK_FORMAT_B10G11R11_UFLOAT_PACK32 ]: UnsignedInt101111Type,
9941003

995-
[ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: UnsignedByteType,
9961004
[ VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK ]: UnsignedByteType,
1005+
[ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: UnsignedByteType,
9971006

9981007
[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: HalfFloatType,
1008+
[ VK_FORMAT_ASTC_4x4_SRGB_BLOCK ]: UnsignedByteType,
1009+
[ VK_FORMAT_ASTC_4x4_UNORM_BLOCK ]: UnsignedByteType,
9991010
[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: UnsignedByteType,
10001011
[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: UnsignedByteType,
10011012

1013+
[ VK_FORMAT_BC1_RGBA_SRGB_BLOCK ]: UnsignedByteType,
1014+
[ VK_FORMAT_BC1_RGBA_UNORM_BLOCK ]: UnsignedByteType,
1015+
[ VK_FORMAT_BC1_RGB_SRGB_BLOCK ]: UnsignedByteType,
1016+
[ VK_FORMAT_BC1_RGB_UNORM_BLOCK ]: UnsignedByteType,
1017+
1018+
[ VK_FORMAT_BC3_SRGB_BLOCK ]: UnsignedByteType,
1019+
[ VK_FORMAT_BC3_UNORM_BLOCK ]: UnsignedByteType,
1020+
1021+
[ VK_FORMAT_BC4_SNORM_BLOCK ]: UnsignedByteType,
1022+
[ VK_FORMAT_BC4_UNORM_BLOCK ]: UnsignedByteType,
1023+
1024+
[ VK_FORMAT_BC5_SNORM_BLOCK ]: UnsignedByteType,
1025+
[ VK_FORMAT_BC5_UNORM_BLOCK ]: UnsignedByteType,
1026+
1027+
[ VK_FORMAT_BC7_SRGB_BLOCK ]: UnsignedByteType,
1028+
[ VK_FORMAT_BC7_UNORM_BLOCK ]: UnsignedByteType,
1029+
10021030
};
10031031

10041032
async function createRawTexture( container ) {
@@ -1007,7 +1035,14 @@ async function createRawTexture( container ) {
10071035

10081036
if ( FORMAT_MAP[ vkFormat ] === undefined ) {
10091037

1010-
throw new Error( 'THREE.KTX2Loader: Unsupported vkFormat.' );
1038+
throw new Error( 'THREE.KTX2Loader: Unsupported vkFormat: ' + vkFormat );
1039+
1040+
}
1041+
1042+
// TODO: Merge the TYPE_MAP warning into the thrown error above, after r190.
1043+
if ( TYPE_MAP[ vkFormat ] === undefined ) {
1044+
1045+
console.warn( 'THREE.KTX2Loader: Missing ".type" for vkFormat: ' + vkFormat );
10111046

10121047
}
10131048

examples/textures/ktx2/2d_bc4.ktx2

1.41 KB
Binary file not shown.

examples/textures/ktx2/2d_bc5.ktx2

0 Bytes
Binary file not shown.

examples/webgl_loader_texture_ktx2.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@
115115
{ path: '2d_etc2.ktx2' },
116116
{ path: '2d_bc1.ktx2' },
117117
{ path: '2d_bc3.ktx2' },
118-
// { path: '2d_bc5.ktx2' },
118+
{ path: '2d_bc4.ktx2' },
119+
{ path: '2d_bc5.ktx2' },
119120
{ path: '2d_bc7.ktx2' },
120121
]
121122
},

src/renderers/webgl/WebGLUtils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ function WebGLUtils( gl, extensions ) {
182182

183183
if ( extension !== null ) {
184184

185-
if ( p === RGBA_BPTC_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;
185+
if ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;
186186
if ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;
187187
if ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;
188188
if ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;

0 commit comments

Comments
 (0)