Skip to content

Commit 96d9e45

Browse files
committed
KTX2Loader: Add support for BC4, BC5
1 parent fb50d9e commit 96d9e45

File tree

5 files changed

+60
-24
lines changed

5 files changed

+60
-24
lines changed

examples/jsm/loaders/KTX2Loader.js

Lines changed: 57 additions & 22 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,
@@ -58,6 +62,8 @@ import {
5862
VK_FORMAT_BC1_RGB_UNORM_BLOCK,
5963
VK_FORMAT_BC3_SRGB_BLOCK,
6064
VK_FORMAT_BC3_UNORM_BLOCK,
65+
VK_FORMAT_BC4_SNORM_BLOCK,
66+
VK_FORMAT_BC4_UNORM_BLOCK,
6167
VK_FORMAT_BC5_SNORM_BLOCK,
6268
VK_FORMAT_BC5_UNORM_BLOCK,
6369
VK_FORMAT_BC7_SRGB_BLOCK,
@@ -931,25 +937,25 @@ const UNCOMPRESSED_FORMATS = new Set( [ RGBAFormat, RGBFormat, RGFormat, RedForm
931937
const FORMAT_MAP = {
932938

933939
[ VK_FORMAT_R32G32B32A32_SFLOAT ]: RGBAFormat,
934-
[ VK_FORMAT_R16G16B16A16_SFLOAT ]: RGBAFormat,
935-
[ VK_FORMAT_R8G8B8A8_UNORM ]: RGBAFormat,
936-
[ VK_FORMAT_R8G8B8A8_SRGB ]: RGBAFormat,
937-
938940
[ VK_FORMAT_R32G32_SFLOAT ]: RGFormat,
939-
[ VK_FORMAT_R16G16_SFLOAT ]: RGFormat,
940-
[ VK_FORMAT_R8G8_UNORM ]: RGFormat,
941-
[ VK_FORMAT_R8G8_SRGB ]: RGFormat,
942-
943941
[ VK_FORMAT_R32_SFLOAT ]: RedFormat,
942+
943+
[ VK_FORMAT_R16G16B16A16_SFLOAT ]: RGBAFormat,
944+
[ VK_FORMAT_R16G16_SFLOAT ]: RGFormat,
944945
[ VK_FORMAT_R16_SFLOAT ]: RedFormat,
946+
947+
[ VK_FORMAT_R8G8B8A8_SRGB ]: RGBAFormat,
948+
[ VK_FORMAT_R8G8B8A8_UNORM ]: RGBAFormat,
949+
[ VK_FORMAT_R8G8_SRGB ]: RGFormat,
950+
[ VK_FORMAT_R8G8_UNORM ]: RGFormat,
945951
[ VK_FORMAT_R8_SRGB ]: RedFormat,
946952
[ VK_FORMAT_R8_UNORM ]: RedFormat,
947953

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

951-
[ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: RGB_ETC2_Format,
952957
[ VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK ]: RGBA_ETC2_EAC_Format,
958+
[ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: RGB_ETC2_Format,
953959

954960
[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: RGBA_ASTC_4x4_Format,
955961
[ VK_FORMAT_ASTC_4x4_SRGB_BLOCK ]: RGBA_ASTC_4x4_Format,
@@ -958,16 +964,19 @@ const FORMAT_MAP = {
958964
[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: RGBA_ASTC_6x6_Format,
959965
[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: RGBA_ASTC_6x6_Format,
960966

961-
[ VK_FORMAT_BC1_RGBA_UNORM_BLOCK ]: RGBA_S3TC_DXT1_Format,
962967
[ VK_FORMAT_BC1_RGBA_SRGB_BLOCK ]: RGBA_S3TC_DXT1_Format,
963-
[ VK_FORMAT_BC1_RGB_UNORM_BLOCK ]: RGB_S3TC_DXT1_Format,
968+
[ VK_FORMAT_BC1_RGBA_UNORM_BLOCK ]: RGBA_S3TC_DXT1_Format,
964969
[ VK_FORMAT_BC1_RGB_SRGB_BLOCK ]: RGB_S3TC_DXT1_Format,
970+
[ VK_FORMAT_BC1_RGB_UNORM_BLOCK ]: RGB_S3TC_DXT1_Format,
965971

966972
[ VK_FORMAT_BC3_SRGB_BLOCK ]: RGBA_S3TC_DXT3_Format,
967973
[ VK_FORMAT_BC3_UNORM_BLOCK ]: RGBA_S3TC_DXT3_Format,
968974

969-
[ VK_FORMAT_BC5_SNORM_BLOCK ]: RGBA_S3TC_DXT5_Format,
970-
[ VK_FORMAT_BC5_UNORM_BLOCK ]: RGBA_S3TC_DXT5_Format,
975+
[ VK_FORMAT_BC4_SNORM_BLOCK ]: SIGNED_RED_RGTC1_Format,
976+
[ VK_FORMAT_BC4_UNORM_BLOCK ]: RED_RGTC1_Format,
977+
978+
[ VK_FORMAT_BC5_SNORM_BLOCK ]: SIGNED_RED_GREEN_RGTC2_Format,
979+
[ VK_FORMAT_BC5_UNORM_BLOCK ]: RED_GREEN_RGTC2_Format,
971980

972981
[ VK_FORMAT_BC7_SRGB_BLOCK ]: RGBA_BPTC_Format,
973982
[ VK_FORMAT_BC7_UNORM_BLOCK ]: RGBA_BPTC_Format,
@@ -977,31 +986,50 @@ const FORMAT_MAP = {
977986
const TYPE_MAP = {
978987

979988
[ VK_FORMAT_R32G32B32A32_SFLOAT ]: FloatType,
980-
[ VK_FORMAT_R16G16B16A16_SFLOAT ]: HalfFloatType,
981-
[ VK_FORMAT_R8G8B8A8_UNORM ]: UnsignedByteType,
982-
[ VK_FORMAT_R8G8B8A8_SRGB ]: UnsignedByteType,
983-
984989
[ VK_FORMAT_R32G32_SFLOAT ]: FloatType,
985-
[ VK_FORMAT_R16G16_SFLOAT ]: HalfFloatType,
986-
[ VK_FORMAT_R8G8_UNORM ]: UnsignedByteType,
987-
[ VK_FORMAT_R8G8_SRGB ]: UnsignedByteType,
988-
989990
[ VK_FORMAT_R32_SFLOAT ]: FloatType,
991+
992+
[ VK_FORMAT_R16G16B16A16_SFLOAT ]: HalfFloatType,
993+
[ VK_FORMAT_R16G16_SFLOAT ]: HalfFloatType,
990994
[ VK_FORMAT_R16_SFLOAT ]: HalfFloatType,
995+
996+
[ VK_FORMAT_R8G8B8A8_SRGB ]: UnsignedByteType,
997+
[ VK_FORMAT_R8G8B8A8_UNORM ]: UnsignedByteType,
998+
[ VK_FORMAT_R8G8_SRGB ]: UnsignedByteType,
999+
[ VK_FORMAT_R8G8_UNORM ]: UnsignedByteType,
9911000
[ VK_FORMAT_R8_SRGB ]: UnsignedByteType,
9921001
[ VK_FORMAT_R8_UNORM ]: UnsignedByteType,
9931002

9941003
[ VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 ]: UnsignedInt5999Type,
9951004
[ VK_FORMAT_B10G11R11_UFLOAT_PACK32 ]: UnsignedInt101111Type,
9961005

997-
[ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: UnsignedByteType,
9981006
[ VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK ]: UnsignedByteType,
1007+
[ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: UnsignedByteType,
9991008

10001009
[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: HalfFloatType,
1010+
[ VK_FORMAT_ASTC_4x4_SRGB_BLOCK ]: UnsignedByteType,
1011+
[ VK_FORMAT_ASTC_4x4_UNORM_BLOCK ]: UnsignedByteType,
10011012
[ VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT ]: HalfFloatType,
10021013
[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: UnsignedByteType,
10031014
[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: UnsignedByteType,
10041015

1016+
[ VK_FORMAT_BC1_RGBA_SRGB_BLOCK ]: UnsignedByteType,
1017+
[ VK_FORMAT_BC1_RGBA_UNORM_BLOCK ]: UnsignedByteType,
1018+
[ VK_FORMAT_BC1_RGB_SRGB_BLOCK ]: UnsignedByteType,
1019+
[ VK_FORMAT_BC1_RGB_UNORM_BLOCK ]: UnsignedByteType,
1020+
1021+
[ VK_FORMAT_BC3_SRGB_BLOCK ]: UnsignedByteType,
1022+
[ VK_FORMAT_BC3_UNORM_BLOCK ]: UnsignedByteType,
1023+
1024+
[ VK_FORMAT_BC4_SNORM_BLOCK ]: UnsignedByteType,
1025+
[ VK_FORMAT_BC4_UNORM_BLOCK ]: UnsignedByteType,
1026+
1027+
[ VK_FORMAT_BC5_SNORM_BLOCK ]: UnsignedByteType,
1028+
[ VK_FORMAT_BC5_UNORM_BLOCK ]: UnsignedByteType,
1029+
1030+
[ VK_FORMAT_BC7_SRGB_BLOCK ]: UnsignedByteType,
1031+
[ VK_FORMAT_BC7_UNORM_BLOCK ]: UnsignedByteType,
1032+
10051033
};
10061034

10071035
async function createRawTexture( container ) {
@@ -1014,6 +1042,13 @@ async function createRawTexture( container ) {
10141042

10151043
}
10161044

1045+
// TODO: Merge the TYPE_MAP warning into the thrown error above, after r190.
1046+
if ( TYPE_MAP[ vkFormat ] === undefined ) {
1047+
1048+
console.warn( 'THREE.KTX2Loader: Missing ".type" for vkFormat: ' + vkFormat );
1049+
1050+
}
1051+
10171052
//
10181053

10191054
let zstd;

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)