Three.js: BasisTextureLoader: ๋‹ค์Œ ๋‹จ๊ณ„

์— ๋งŒ๋“  2019๋…„ 05์›” 22์ผ  ยท  60์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

.basis ํ…์Šค์ฒ˜์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ์ง€์›์ด https://github.com/mrdoob/three.js/pull/16522์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค

  • [x] ์ฝ”๋“œ์— ๋‚จ์•„ ์žˆ๋Š” TODO ์ •๋ฆฌ
  • [x] eslint ์ˆ˜์ • ์‚ฌํ•ญ ์ ์šฉ
  • [x] ๋ฌธ์„œ ์ถ”๊ฐ€
  • [x] ์˜ˆ์‹œ ์ถ”๊ฐ€
  • [x] setMaxWorkers() ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€
  • [x] ๋ฐ‰๋งต ์ง€์›
  • [ ] iOS์—์„œ ๋ฐ‰๋งต ์ง€์› ์ˆ˜์ •
  • [ ] @austinEng๊ฐ€ ์ œ์•ˆํ•œ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์œผ๋กœ Basis ํŠธ๋žœ์Šค์ฝ”๋” ์žฌ์ปดํŒŒ์ผ
  • [ ] load() ์—์„œ ๋™๊ธฐ์ ์œผ๋กœ ํ…์Šค์ฒ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(์•ŒํŒŒ ์—†์ด?)
  • [ ] ์•ŒํŒŒ ์ง€์›
  • [ ] ์‚ฌ์šฉ์ž ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ํŠธ๋žœ์Šค์ฝ”๋“œ ์ถœ๋ ฅ ํ˜•์‹ ์ง€์›
  • [x] ES ๋ชจ๋“ˆ ์ถ”๊ฐ€
Enhancement Loaders

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•(ํŠธ๋žœ์Šค์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ง์ „ ์ž‘์—…์ž์—์„œ)์ด ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌผ๋ก  ํŠธ๋žœ์Šค์ฝ”๋”์—์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ JS์—์„œ ์ด๋ฅผ ์‰ฝ๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var mipWidth = basisFile.getImageWidth( 0, mip );
var mipHeight = basisFile.getImageHeight( 0, mip );
var mipSize = basisFile.getImageTranscodedSizeInBytes( 0, mip, config.format );

if ( config.pvrtcSupported ) {

    // Basis incorrectly computes mip sizes for PVRTC, let's fix them up using the spec:
    // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt
    mipSize = Math.floor((Math.max(mipWidth, 8) * Math.max(mipHeight, 8) * 4 + 7) / 8);

}

var dst = new Uint8Array( mipSize );

๋ชจ๋“  60 ๋Œ“๊ธ€

์•„์ง ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ…์Šค์ฒ˜ ๋กœ๋”์ฒ˜๋Ÿผ ๋™๊ธฐ์‹์œผ๋กœ texture from load ์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊พธ์ค€ํ•จ์ด ์ข‹์€ ๊ฒƒ ๊ฐ™์•„์š”. ๊ทธ๋ฆฌ๊ณ  ํ…์Šค์ฒ˜๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ฝœ๋ฐฑ์—์„œ material.needsUpdate = true ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด๋ฏธ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฃจํ”„๊ฐ€ ์‹œ์ž‘๋œ ๊ฒฝ์šฐ).

var material = new XXXMaterial();
textureLoader.load(..., function (texture) {
  material.map = texture;
   // .map is from null to non-null.
   // User needs to call material.needsUpdate = true here if already started animation loop
   // because whether material.map is null or not affects the final shader code.
  material.needsUpdate = true;
});

THREE.CompressedTexture ์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์•„์ง ํ™•์ธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๊ฒƒ์ด ์ตœ์„ ์ผ ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘

๊ธฐํƒ€ ์ •๋ฆฌ: ํ…์Šค์ฒ˜์— ํ• ๋‹น๋œ ์†์„ฑ์€ flipY=false ์™€ ๊ฐ™์ด ์•ฝ๊ฐ„ ์ž„์˜์ ์ž…๋‹ˆ๋‹ค(Basis ๋ฐ๋ชจ์—์„œ ๋‚จ์Œ). ๊ทธ๋ฆฌ๊ณ  ์ž‘์—…์ž์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ startTime ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งž๋‹ค๋ฉด ๋ฐ‰๋งต์ด ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์Šค์ฝ”๋”๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋กœ๋”๊ฐ€ ์•„์ง ๋ฐ‰๋งต ์ง€์›์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?

.basis ํŒŒ์ผ์—๋Š” ์—ฌ๋Ÿฌ ๋ฐ‰๋งต ์ˆ˜์ค€์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์Šค์ฝ”๋”๊ฐ€ ์ด๋ฏธ ์ง€์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. BasisTextureLoader๋Š” ์•„์ง ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŠธ๋žœ์Šค์ฝ”๋”์˜ ์ƒˆ/์ž‘์€ ๋ฒ„์ „๋„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://github.com/BinomialLLC/basis_universal/pull/7~~ ์™„๋ฃŒ.

์˜ˆ, ํŠธ๋žœ์Šค์ฝ”๋”๊ฐ€ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. levelIndex to transcodeImage ๋กœ ๋ฐ‰ ๋ ˆ๋ฒจ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
https://github.com/BinomialLLC/basis_universal/blob/master/webgl/transcoder/basis_wrappers.cpp#L197

์„ค๋ช…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋กœ๋”๊ฐ€ ์•„์ง ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ ํŠธ๋žœ์Šค์ฝ”๋”๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋ฉด TODO ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ๊ตฌํ˜„์„ ๋„์™€๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋ณ‘ํ•ฉ๋˜๋ฉด ํ–ฅ์ƒ/๊ต์ฒดํ•˜์‹ญ์‹œ์˜ค.

ํŠธ๋žœ์Šค์ฝ”๋”์—๋Š” ์žˆ์ง€๋งŒ THREE.BasisTextureLoader์—๋Š” ์—†๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์—์„œ ์ฃผ์š” ์ฐจ์ด์ ์€ ํŠธ๋žœ์Šค์ฝ”๋”๊ฐ€ ๋งŽ์€ ์ถ”๊ฐ€ ํ˜•์‹์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/blob/dev/examples/js/loaders/BasisTextureLoader.js#L264 -L273

์†”์งํžˆ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋•Œ๋•Œ๋กœ ๊ทธ๊ฒƒ์„ ์ œ์–ดํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๊ณ , ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ๋กœ๋”(์˜ˆ: GLTFLoader)๊ฐ€ ํ…์Šค์ฒ˜์˜ ๋ชฉ์ ์— ๋”ฐ๋ผ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด material.map (๊ธฐ๋ณธ ์ƒ‰์ƒ)์— ๋Œ€ํ•ด material.aoMap (์ฃผ๋ณ€ ํ์ƒ‰)์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์••์ถ• ํ˜•์‹์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์€ detectSupport( renderer ) ๋Œ€์•ˆ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// Let loader decide, based on device capabilities:
loader.detectSupport( renderer );

// Or, choose a particular format:
loader.setFormat( THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC4 );

์—ฌ๊ธฐ์—๋Š” ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ…์Šค์ฒ˜๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ํ…์Šค์ฒ˜๋ฅผ ๋™์ผํ•œ ํ˜•์‹์œผ๋กœ ํŠธ๋žœ์Šค์ฝ”๋”ฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋กœ๋”๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ์กด ์›น ์ž‘์—…์ž๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค(์ค‘์š”ํ•จ). load() ๋ฉ”์„œ๋“œ์— ํ˜•์‹์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ TextureLoader์™€ ์—ญํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค...

loader.setFormat( THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC4 );
var fooTex = loader.load( 'foo.basis' );

loader.setFormat( THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC1 );
var barTex = loader.load( 'bar.basis' );

... ๋””์ฝ”๋”ฉ์ด ๋น„๋™๊ธฐ์‹์ผ์ง€๋ผ๋„ ํ•ญ์ƒ ๊ฐ ํ…์Šค์ฒ˜์— ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ฐธ๊ณ  ์‚ฌํ•ญ์€ ์ด๊ฒƒ์„ ์–ด๋”˜๊ฐ€์— ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. examples/js/libs/basis ์˜ JS ๋ž˜ํผ์—๋Š” Basis ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋ฒ„์ „์—์„œ ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์„ ์–ธ( var Module )์€ ์›น ์›Œ์ปค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ง€์—ฐ ์ดˆ๊ธฐํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด Module ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ํ”Œ๋ž˜๊ทธ๋กœ ํŠธ๋žœ์Šค์ฝ”๋”๋ฅผ ์ปดํŒŒ์ผํ•˜๊ฑฐ๋‚˜ https://github.com/BinomialLLC/basis_universal/issues/21์„ ํ†ตํ•ด ๋‹ค๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

BasisTextureLoader๊ฐ€ glTF์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ˆ˜๋™์œผ๋กœ ํ…์Šค์ฒ˜๋ฅผ .basis ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ณ  BasisTextureLoader๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋กœ๋”๋กœ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

var basisLoader = new THREE.BasisTextureLoader();
basisLoader.setTranscoderPath( 'basis/' );
basisLoader.detectSupport( renderer );

THREE.Loader.Handlers.add( /\.basis$/i, basisLoader );

๊ทธ๋Ÿฌ๋‚˜ ํ…์Šค์ฒ˜๊ฐ€ ์ œ๋Œ€๋กœ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๊ณ  ์ฝ˜์†”์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

[.WebGL-000002B68031CEF0]RENDER WARNING: texture bound to texture unit 1 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering.

@zeux ์„ค๋ช…๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋””๋ฒ„๊น…ํ–ˆ๊ณ  ์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  1. glTF ๋กœ๋”๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ mag ํ•„ํ„ฐ๋ง์„ LinearMipMapLinearFilter๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. BasisTextureLoader๋Š” ๋ฐ‰๋งต์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. webGL์€ mip ์ฒด์ธ์ด ์™„๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค :-/

@zeux ๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š์Œ โ€“ ํ•ต์‹ฌ glTF ์‚ฌ์–‘์€ JPEG ๋ฐ PNG ํ…์Šค์ฒ˜๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Basis์˜ ํ™•์žฅ(KTX2 ๋ž˜ํผ๋ฅผ ํ†ตํ•ด)์€ ์••์ถ•๋œ ํ…์Šค์ฒ˜ ์ง€์›์„ ํ˜•์‹์— ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ดˆ์•ˆ ํ™•์žฅ์— ๋Œ€ํ•ด์„œ๋Š” https://github.com/KhronosGroup/glTF/pull/1612 ๋ฅผ ์ฐธ์กฐ

์ฆ‰, BasisTextureLoader์—์„œ ๋ฐ‰๋งต ์ง€์›์ด ๋ถ€์กฑํ•œ ๊ฒƒ์€ ์ˆœ์ „ํžˆ ์•„์ง ์ง€์›ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ํŠธ๋žœ์Šค์ฝ”๋” ์ž์ฒด๊ฐ€ ์ด๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

mipmap ์ง€์›์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ œ์ถœ๋œ PR - -mipmap ์˜ต์…˜์œผ๋กœ ํ…์Šค์ฒ˜๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ํ•œ glTF ๋กœ๋”๋Š” ์œ„์— ๋‚˜์—ด๋œ ๋กœ๋”๋ฅผ ์ตœ์†Œํ•œ ๋ฐ์Šคํฌํƒ‘์—์„œ ์ถ”๊ฐ€ํ•˜๋Š” ํ•œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ(iPhone ๋˜๋Š” Android)์—์„œ๋Š” ์‹คํ–‰ํ•  ์ˆ˜ ์—†์—ˆ์ง€๋งŒ ํšŒ์ „ํ•˜๋Š” ํ๋ธŒ๊ฐ€ ์žˆ๋Š” threejs.org ์˜ˆ์ œ๋Š” iPhone์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ณ„๋„์˜ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ(iPhone ๋˜๋Š” Android)์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์ดˆ ๋ฌธ์„œ์—์„œ โ€“

์˜ˆ๋ฅผ ๋“ค์–ด iOS์—์„œ๋Š” PVRTC1์— ๋Œ€ํ•ด ํ…์Šค์ฒ˜ ์น˜์ˆ˜ 2์˜ ์ œ๊ณฑ์Šน๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ˜„์žฌ Basis๊ฐ€ ์ด ์ œํ•œ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” ๋” ์ž‘์€ non-pow2 ํ…์Šค์ฒ˜๋ฅผ 2 PVRTC1 ํ…์Šค์ฒ˜์˜ ๋” ํฐ ๊ฑฐ๋“ญ์ œ๊ณฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ณง ์ง€์›ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.)

์ด ๋ฐ๋ชจ์—์„œ๋Š” 512x768 ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ ํ•ด๋‹น ์ œ์•ฝ ์กฐ๊ฑด์— ๋งž๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. FWIW ๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธํ•œ Android ์ „ํ™”์—๋Š” Basis ํ…์Šค์ฒ˜ ๊ด€๋ จ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ WebGL ๋ฐ๋ชจ์™€ ๊ด€๋ จ๋œ ์ „์ฒด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ Android ์ „ํ™”๋Š” ์ž˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋„ค, iOS์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ ์ œํ•œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

BasisTextureLoader์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ https://github.com/mrdoob/three.js/pull/16675์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์•ŒํŒŒ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค... Basis ๋ฌธ์„œ๋Š” ์˜ต์…˜์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(https://github.com/BinomialLLC/basis_universal/#how-to-use-the-system). ์—ฌ๊ธฐ์—๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์Šค์ฝ”๋”ฉ ์ถœ๋ ฅ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ETC1 ์ „์šฉ ์žฅ์น˜/API: ๋‘ ๊ฐœ์˜ ETC1 ํ…์Šค์ฒ˜๋กœ ํŠธ๋žœ์Šค์ฝ”๋”ฉํ•˜๊ณ  ์…ฐ์ด๋”์—์„œ ์ƒ˜ํ”Œ๋งํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฐฐ ๋†’์€ ํ•˜๋‚˜์˜ ETC1 ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ETC1 ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ API๋Š” TextureLoader ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ .basis ํ…์Šค์ฒ˜์—์„œ ์—ฌ๋Ÿฌ ํŠธ๋žœ์Šค์ฝ”๋”ฉ๋œ ์ถœ๋ ฅ ๋ฐ˜ํ™˜์„ ์ง€์›ํ•˜๋ ค๋ฉด ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” ๋Œ€์ฒด API๊ฐ€ ์žˆ์–ด์•ผ ํ•จ).

https://github.com/mrdoob/three.js/pull/16686 ์—์„œ ์ •์‚ฌ๊ฐํ˜• 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ ํ…์Šค์ฒ˜๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด iOS์˜ ๋ฐ๋ชจ๊ฐ€ ์ˆ˜์ •๋˜์ง€๋งŒ ๋ฐ‰๋งต์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

INVALID_VALUE:compressedTexImage2D: ArrayBufferView์˜ ๊ธธ์ด๊ฐ€ ์น˜์ˆ˜์— ๋Œ€ํ•ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

PVRTC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ‰๋งต์— ๋Œ€ํ•ด ํŠน๋ณ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋งˆ์ง€๋ง‰ ๋ช‡ ๋ฐ‰ ์ค‘ ํ•˜๋‚˜์—์„œ ๊ทธ๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

์–ด๋–ค ๋ฐ‰์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋””๋ฒ„๊ทธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ์„ธ ๋ฒˆ ์ธ์‡„๋˜๊ณ  ๋งˆ์ง€๋ง‰ ์„ธ ๊ฐœ์˜ ๋ฒ„ํผ ํฌ๊ธฐ๋Š” ๋ชจ๋‘ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿค”

Basis๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ช‡ ๋ฐ‰์˜ ํฌ๊ธฐ(๋ฐ”์ดํŠธ)๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. PVRTC1 4bpp์˜ ๊ฒฝ์šฐ ๋ธ”๋ก์˜ ์น˜์ˆ˜๋Š” 8๋กœ ๋ฐ˜์˜ฌ๋ฆผ๋˜๋ฏ€๋กœ 4x4, 2x2 ๋ฐ 1x1์€ 8x8๊ณผ ๊ฐ™์€ ํฌ๊ธฐ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. Basis ํŠธ๋žœ์Šค์ฝ”๋”๋Š” 4x4๋กœ ๋ฐ˜์˜ฌ๋ฆผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 8x8, 4x4, 2x2, 1x1 ํฌ๊ธฐ์˜ ๋ชจ๋“  ์ด๋ฏธ์ง€๋Š” 32๋ฐ”์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 4x4 ์ดํ•˜์˜ ๊ฒฝ์šฐ Basis๋Š” 8๋ฐ”์ดํŠธ์ธ 1๊ฐœ์˜ 4x4 ๋ธ”๋ก์œผ๋กœ ๊ฐ€์ •ํ•˜๊ณ  32 ๋Œ€์‹  8๋ฐ”์ดํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. @richgel999

์ด๋ฏธ์ง€ ํฌ๊ธฐ ๊ณ„์‚ฐ ๊ณต์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt :

   For PVRTC 4BPP formats the imageSize is calculated as:
     ( max(width, 8) * max(height, 8) * 4 + 7) / 8

์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•(ํŠธ๋žœ์Šค์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ง์ „ ์ž‘์—…์ž์—์„œ)์ด ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌผ๋ก  ํŠธ๋žœ์Šค์ฝ”๋”์—์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ JS์—์„œ ์ด๋ฅผ ์‰ฝ๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var mipWidth = basisFile.getImageWidth( 0, mip );
var mipHeight = basisFile.getImageHeight( 0, mip );
var mipSize = basisFile.getImageTranscodedSizeInBytes( 0, mip, config.format );

if ( config.pvrtcSupported ) {

    // Basis incorrectly computes mip sizes for PVRTC, let's fix them up using the spec:
    // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt
    mipSize = Math.floor((Math.max(mipWidth, 8) * Math.max(mipHeight, 8) * 4 + 7) / 8);

}

var dst = new Uint8Array( mipSize );

๊ฐ์‚ฌ ํ•ด์š”! ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

PVRTC1 ๋ฐ‰๋งต ํฌ๊ธฐ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์€(8ํ”ฝ์…€ ๋„ˆ๋น„/๋†’์ด ๋ฏธ๋งŒ) ๋ฐ‰์—์„œ ์ถ”๊ฐ€ ๋ฐ”์ดํŠธ๋ฅผ ์ง€์šฐ๋„๋ก ํŠธ๋žœ์Šค์ฝ”๋”๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ž˜ํผ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@donmccurdy ํ•  ์ผ ๋ชฉ๋ก์— " load ๋ฉ”์„œ๋“œ์—์„œ ๋™๊ธฐ์ ์œผ๋กœ texture ๋ฐ˜ํ™˜"์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (takahirox๊ฐ€ ์œ„์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ)

@Ben-Mack์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•ŒํŒŒ ์ฑ„๋„์ด ์žˆ๋Š” ํ…์Šค์ฒ˜๋Š” ์—ฌ๋Ÿฌ ํ…์Šค์ฒ˜๋กœ ํŠธ๋žœ์Šค์ฝ”๋”ฉ๋  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ API๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@richgel999 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! https://github.com/BinomialLLC/basis_universal/commit/ab722fa2e18536f9a1d5f33814f3088232446d52 webgl/transcoder/basis_wrappers.cpp ๋งŒ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์œผ๋ฏ€๋กœ WASM ํŠธ๋žœ์Šค์ฝ”๋”๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. macOS์—์„œ ์ปดํŒŒ์ผ:

$ emcmake cmake ../
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/donmccurdy/Documents/Projects/basis_universal/webgl/transcoder/build

$ make
[ 33%] Linking CXX executable basis_transcoder.js
Traceback (most recent call last):
  File "/Users/donmccurdy/Documents/Projects/emsdk/emscripten/1.37.22/em++", line 16, in <module>
    emcc.run()
  File "/Users/donmccurdy/Documents/Projects/emsdk/emscripten/1.37.22/emcc.py", line 882, in run
    exec 'shared.Settings.' + key + ' = ' + value in globals(), locals()
  File "<string>", line 1, in <module>
NameError: name 'emmalloc' is not defined
make[2]: *** [basis_transcoder.js] Error 1
make[1]: *** [CMakeFiles/basis_transcoder.js.dir/all] Error 2
make: *** [all] Error 2

์ด๋ก ์ƒ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ํŠธ๋žœ์Šค์ฝ”๋” ๋ฅผ PavingStones.basis ํ…์Šค์ฒ˜๋ฅผ ๋ฐ‰๋งต์ด ํฌํ•จ๋œ ์ด ํ…์Šค์ฒ˜๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

PavingStones.basis.zip

ํŽธ์ง‘: ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค . https://github.com/BinomialLLC/basis_universal/pull/27 ๊ณผ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

@donmccurdy ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ณ‘ํ•ฉ๋˜๊ธฐ ์œ„ํ•ด https://github.com/BinomialLLC/basis_universal/pull/27 ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ณง ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ท€ํ•˜์˜ emscripten ๋ฒ„์ „์€ emmalloc์˜ ์กด์žฌ ์ด์ „์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ three.js์˜ ์ผ๋ถ€์ธ ํŒŒ์ผ์€ 1.38.31๋กœ ๋นŒ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋Š” ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ธฐ๋ณธ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋™์•ˆ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Uncaught (in promise) DOMException: Failed to execute 'postMessage' on 'Worker': ArrayBuffer at index 0 is already neutered.

์žฌํ˜„ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด load ๋ฉ”์„œ๋“œ๋ฅผ 2๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

loader.load( 'textures/compressed/PavingStones.basis');
loader.load( 'textures/compressed/PavingStones.basis');

@Ben-Mack ์—ฌ์ „ํžˆ ์ˆ˜์ •ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ ๊ทธ ์˜ค๋ฅ˜๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•œ ํ…์Šค์ฒ˜๋ฅผ ๋‘ ๋ฒˆ ๋กœ๋“œํ•˜๊ณ  ๋กœ๋”๊ฐ€ ๋™์‹œ์— ๋‘ ์ž‘์—…์ž์—๊ฒŒ ์ „์†กํ•  ์ˆ˜ ์—†๋Š” ArrayBuffer๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋‘ ๋ฒˆ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹  ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

loader.load( 'textures/compressed/PavingStones.basis?v=1' );
loader.load( 'textures/compressed/PavingStones.basis?v=2' );

@donmccurdy ์•ŒํŒŒ ์ง€์›์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์€

load(...) // as usual
//then :  
loader.getRGBTexture() //return by the load function as usual
loader.getAlphaTexture() //can be use as alphaMap

์•ŒํŒŒ๋ฅผ ์ง€์›ํ•˜๋Š” ์˜ต์…˜์ด ๋ฐ‰๋งต ๋ชจ๋ธ์— ์ถ”๊ฐ€๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
loader.generateAlpha = true //default

@Makio64 ๊ทธ๋Ÿฐ๊ฑฐ ! ๋Œ€๋ถ€๋ถ„์˜ threejs ๋กœ๋”๋Š” ์ƒํƒœ ์ €์žฅ์ด ์•„๋‹ˆ๋ฏ€๋กœ(๋‹จ์ผ ๋กœ๋”๊ฐ€ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ) ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const [ map ]           = loader.loadRGB( 'foo.basis', { ...options } );
const [ map, alphaMap ] = loader.loadRGBA( 'bar.basis', { ...options } );

^๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘, ํŠนํžˆ ์•ŒํŒŒ์—์„œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ผ๋ถ€ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์ถฉ๋ถ„ํ•œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ๋Œ€์‹  ์ƒˆ ๋ฉ”์„œ๋“œ์—์„œ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

loader.loadRGBA( 'bar.basis', { ...options }, ( map, alphaMap ) => {
  // ...
} );

๋น„๋™๊ธฐ ์†”๋ฃจ์…˜์€ ์ž‘์—…์ž์™€ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•˜๊ณ  ๋‹ค๋ฅธ threejs์˜ ๋กœ๋”์™€ ์ •๋ ฌํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ•ด์ƒ๋„๊ฐ€ 768 x 512 ๋˜๋Š” 384 x 256์ธ ํ…์Šค์ฒ˜๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•ด์ƒ๋„๋Š” Three.js ๋ฐ BasisTextureLoader์™€ ํ•จ๊ป˜ ๋‹ค์Œ ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜ ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
"ํ…์Šค์ฒ˜ ์œ ๋‹› 0์— ๋ฐ”์ธ๋”ฉ๋œ ํ…์Šค์ฒ˜๋Š” ๋ Œ๋”๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ์ด ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ…์Šค์ฒ˜ ํ•„ํ„ฐ๋ง์ด ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."

@mozg4D ๋Š” Basis ๋ฌธ์„œ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ํŠนํžˆ iOS์—์„œ๋Š” 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ ํ…์Šค์ฒ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๋™์ž‘๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ•˜์„ธ์š”. ์„ ํƒํ•œ ํ…์Šค์ฒ˜ ํ•„ํ„ฐ๋ง์ด ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ๋ฐ๋ชจ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ฒ„๊ทธ๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

@donmccurdy Basis ์•ŒํŒŒ ์ง€์›์ด ๊ณง ์ถœ์‹œ๋˜๋‚˜์š”?

๋ฒ„๊ทธ๋ฅผ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. iOS์—์„œ๋งŒ ํ…์Šค์ฒ˜ ํ˜•์ƒ ๊ฐ€์žฅ์ž๋ฆฌ์— ์ด์ƒํ•œ "ํ…์Šค์ฒ˜ ๋น›๋‚˜๋Š”" ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. #17597

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์„ ๊ฒช์—ˆ์Šต๋‹ˆ๊นŒ?

iOS์—์„œ๋Š” PVRTC๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ „ ๋ฒ„์ „(r108)์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?
https://github.com/BinomialLLC/basis_universal ์—์„œ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•  ์ˆ˜

์ด๊ฒƒ์€ ์ด์ „ ๋ฒ„์ „(r108)์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ œ์ถœํ•œ ๋ฒ„๊ทธ๋Š” r108์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://github.com/BinomialLLC/basis_universal ์—์„œ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•  ์ˆ˜

๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ณผ์ •์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค: https://github.com/BinomialLLC/basis_universal/issues/78

๋ฒ„๊ทธ๋ฅผ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. iOS์—์„œ๋งŒ ํ…์Šค์ฒ˜ ํ˜•์ƒ ๊ฐ€์žฅ์ž๋ฆฌ์— ์ด์ƒํ•œ "ํ…์Šค์ฒ˜ ๋น›๋‚˜๋Š”" ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. #17597

๋‚˜๋Š” based_universal github์— ๋‹ต์žฅํ–ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ…์Šค์ฒ˜๋ฅผ ์žก๊ณ  ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋žฉ/ํด๋žจํ”„ ์ฃผ์†Œ ๋ณ€ํ™˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜์ง€ ์•Š์€ ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ์•„ํ‹ฐํŒฉํŠธ์ด๊ฑฐ๋‚˜ ์‹ค์‹œ๊ฐ„ PVRTC1 ์ธ์ฝ”๋”๋กœ ์ธํ•œ ์•„ํ‹ฐํŒฉํŠธ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋” ๋งŽ์€ ํŠธ๋žœ์Šค์ฝ”๋”ฉ CPU ์‹œ๊ฐ„/๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํฌ์ƒํ•˜์—ฌ PVRTC1 ํ’ˆ์งˆ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/BinomialLLC/basis_universal/issues/78#issuecomment -536159690์— ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค -- ์Šคํฌ๋ฆฐ์ƒท์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํšŒ์ „ํ•˜์ง€ ์•Š๋Š” ํ๋ธŒ์˜ ๋žฉ ์–ด๋ผ์šด๋“œ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ (๋Œ€๋ถ€๋ถ„ ๋ฌด๊ด€ํ•˜์ง€๋งŒ) ๋˜ ๋‹ค๋ฅธ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌ : https://github.com/mrdoob/three.js/pull/17546#commitcomment -35275564

๋‹ค๋ฅธ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๊ด€๋ จ์ด ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ): #17546(๋Œ“๊ธ€)

#17622์—์„œ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ‰๋งต๊ณผ ๊ด€๋ จํ•˜์—ฌ .basis ํŒŒ์ผ์— ๋ฐ‰๋งต์„ ํฌํ•จํ•˜์ง€ ์•Š๊ณ ๋„ ๊ธฐ๋ณธ ํ…์Šค์ฒ˜ ํŒŒ์ผ(.gltf ํŒŒ์ผ ๋‚ด๋ถ€ ์ฐธ์กฐ)์„ ์ ์ ˆํ•˜๊ฒŒ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

-mipmap ์‚ฌ์šฉํ•˜์—ฌ .basis ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ์ œ๋Œ€๋กœ ๋กœ๋“œ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด .basis ํŒŒ์ผ์— ๋งŽ์€ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ถ”๊ฐ€๋˜์ง€๋งŒ -mipmap ์—†์ด .basis ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ์˜ต์…˜์„ ์„ ํƒํ•˜๋ฉด threejs๊ฐ€ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹จ์ˆœํžˆ ๊ฒ€์€์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ฐ‰๋งต๊ณผ ๊ด€๋ จํ•˜์—ฌ .basis ํŒŒ์ผ์— ๋ฐ‰๋งต์„ ํฌํ•จํ•˜์ง€ ์•Š๊ณ ๋„ ๊ธฐ๋ณธ ํ…์Šค์ฒ˜ ํŒŒ์ผ(.gltf ํŒŒ์ผ ๋‚ด๋ถ€ ์ฐธ์กฐ)์„ ์ ์ ˆํ•˜๊ฒŒ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

-mipmap ์‚ฌ์šฉํ•˜์—ฌ .basis ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ์ œ๋Œ€๋กœ ๋กœ๋“œ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด .basis ํŒŒ์ผ์— ๋งŽ์€ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ถ”๊ฐ€๋˜์ง€๋งŒ -mipmap ์—†์ด .basis ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ์˜ต์…˜์„ ์„ ํƒํ•˜๋ฉด threejs๊ฐ€ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹จ์ˆœํžˆ ๊ฒ€์€์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๋ฐ‰๋งต์„ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ํ…์Šค์ฒ˜๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://discourse.threejs.org/t/compressed-texture-workflow-gltf-basis/10039/12?u=johannesdeml
https://github.com/JohannesDeml/three.js/commit/909d9cc6dc9192f398df7455f52b7e71e3bf61e2

๋ฌผ๋ก  ๋ฐ‰๋งต์€ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ ํ…์Šค์ฒ˜๋งŒ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋ผ๋ฉด ์‰ฌ์šด ์†”๋ฃจ์…˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ์ด์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ์ด์ œ BasisTextureLoader์—๋„ ์œ ์‚ฌํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(min/magFilter = LinearFilter ์„ค์ •). ๋‹จ 1๊ฐœ์˜ ๋ฐ‰๋งต๋งŒ ๊ฐ์ง€๋  ๋•Œ(https://github.com/mrdoob/three.js) /blob/e66e86901abd84ffc260fea9665170631a2b0493/examples/js/loaders/BasisTextureLoader.js#L170-L171) - -mipmap ์˜ต์…˜ ์—†์ด ์ƒ์„ฑ๋˜๋Š” basisu ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๊ฒ€์ •์ƒ‰์ž…๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ๊ทธ๊ฒƒ์˜ ๊ธฐ์ดˆ ์žˆ์—ˆ์ง€๋งŒ ๋‚˜๋Š” ์ง€๋‚œ ์ฃผ์ฒ˜๋Ÿผ ์ตœ๊ทผ์—์ด ์ผ์„ํ–ˆ๋‹ค .ktx2 ๋ณด๋‹ค๋Š” ์šฉ๊ธฐ๋ฅผ .basis ...

๊ทธ๋ฆฌ๊ณ  ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„์— ์ด๋Ÿฌํ•œ ๋ฐ‰๋งต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ด€๋ จ๋œ ๋ณด๊ฐ„ ์ œ์•ฝ ์กฐ๊ฑด๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ๋ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

body_green.basis.zip

๊ทธ๋ฆฌ๊ณ  ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„์— ์ด๋Ÿฌํ•œ ๋ฐ‰๋งต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ด€๋ จ๋œ ๋ณด๊ฐ„ ์ œ์•ฝ ์กฐ๊ฑด๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์ €๋„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค. ์••์ถ•๋œ jpg์— ๋น„ํ•ด .basis์˜ ๋” ๋‚ฎ์€ ํŒŒ์ผ ํฌ๊ธฐ์—์„œ ๋ณธ ์ด๋“์˜ ๋Œ€๋ถ€๋ถ„์ด ์†์‹ค๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ๋ถ€๋„๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค. GPU ๋ฉ”๋ชจ๋ฆฌ ์ด๋“์ด ์—ฌ์ „ํžˆ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ํ…์Šค์ฒ˜์˜ ๋‹ค์šด๋กœ๋“œ/์ „์†ก ํฌ๊ธฐ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„์— ์ด๋Ÿฌํ•œ ๋ฐ‰๋งต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ด€๋ จ๋œ ๋ณด๊ฐ„ ์ œ์•ฝ ์กฐ๊ฑด๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

jpg/png ๋Œ€์‹  ๊ธฐ์ดˆ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•ญ์ƒ ๊ทธ๋Ÿฐ๊ฐ€์š”?

README์—์„œ ์ง€์›/์–ธ๊ธ‰ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ํ๋ธŒ ๋งต์— ๋Œ€ํ•œ facelist๋กœ 6๊ฐœ์˜ ํ…์Šค์ฒ˜๋ฅผ ๋‹จ์ผ ๊ธฐ๋ณธ ํŒŒ์ผ๋กœ ํŒจํ‚นํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? PMREM ์ƒ์„ฑ๊ธฐ๋Š” ์—ฌ๊ธฐ์„œ ์“ธ๋ชจ๊ฐ€ ์—†์œผ๋ฉฐ ๊ธฐ๋ณธ ํŒŒ์ผ์—๋Š” ์ƒ์„ฑ๋œ ๊ฐ ํ…์Šค์ฒ˜์— ๋Œ€ํ•œ ๋ฐ‰๋งต์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

ThreeJS์—์„œ ํ๋ธŒ๋งต์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด ์••์ถ•๋œ ํ…์Šค์ฒ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ ๊ฐœ๋ณ„ ํ…์Šค์ฒ˜์— ๋Œ€ํ•ด ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๊นŒ? (์—ฌ๋Ÿฌ ํ…์Šค์ฒ˜๊ฐ€ ์žˆ๋Š” ๊ธฐ๋ณธ ํŒŒ์ผ์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด ํ…์Šค์ฒ˜ ๋กœ๋” ์ง€์›์„ ์•„์ง ์กฐ์‚ฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.) ํ๋ธŒ๋งต์œผ๋กœ ์‚ฌ์šฉํ•  ํŽ˜์ด์Šค๋ฆฌ์ŠคํŠธ ํŒฉ ๊ธฐ๋ณธ ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋” ์ ํ•ฉํ•œ KTX2๋ฅผ ํ†ตํ•œ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•ŒํŒŒ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ๋•Œ ์ด ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ์งˆ๋ฌธ์€ ์ด๋Ÿฌํ•œ ํ…์Šค์ฒ˜๋ฅผ RGBE ๋˜๋Š” RGBM์œผ๋กœ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ThreeJS๋Š” M7 ๋ฐ M16์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค). ๋ฒ ์ด์Šค๋กœ ์–ผ๋งˆ๋‚˜ ์ž˜ ์••์ถ•๋˜๋Š”์ง€ ์กฐ์‚ฌํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ๋…ธ๋ฉ€ ๋งต๊ณผ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ŒํŒŒ ์ฑ„๋„ ๋ฐ์ดํ„ฐ๋Š” ๊ฑฐ๊ธฐ์—์„œ ์ง€์›ํ•˜๋Š” ๋ฐ ์ƒ๋‹นํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์••์ถ• ํ…์Šค์ฒ˜ ํ˜•์‹์œผ๋กœ ํŠธ๋žœ์Šค์ฝ”๋”ฉ๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ์•„๋ž˜ ๋งํฌ๋œ ๊ธฐ์‚ฌ์—์„œ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฝค ์ข‹์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ARM์€ ์˜ˆ๋ฅผ ๋“ค์–ด ASTC ๋ฐ RGBM ๊ด€๋ จ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค . ๊ธฐ์‚ฌ์—์„œ ์–ธ๊ธ‰ํ•œ Unity ์—”์ง„์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ ์ ˆํ•œ HDR ๋ฒ”์œ„๋ฅผ ์ปค๋ฒ„ํ•ด์•ผ ํ•˜๋Š” RGBM5๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฒ”์œ„ ์ œํ•œ ๋‚ด์— ๋งž๋Š” ๊ฒฝ์šฐ ๋‚ฎ์€ ์Šน์ˆ˜๋Š” ๋” ๋†’์€ ์Šน์ˆ˜ ์ƒ์ˆ˜๋ณด๋‹ค ์••์ถ• ํ’ˆ์งˆ ๋ฌธ์ œ๋ฅผ ๋œ ์ƒ์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Basis Universal ๋˜๋Š” KTX GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์šด์ด ๋” ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. KTX2๊ฐ€ Basis ํŽ˜์ด๋กœ๋“œ๋กœ ํ๋ธŒ๋งต์„ ์ง€์›ํ•˜๋„๋ก ์„ค๊ณ„๋œ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋˜๋Š” ThreeJS ์ง€์›์„ ์‚ฌ์šฉํ•˜๋Š” ๊ด€๋ จ ์‚ฌ๋ก€์ฒ˜๋Ÿผ ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Basis๋Š” ๋‹จ์ผ ๊ธฐ๋ฐ˜ ํŒŒ์ผ์— ํ๋ธŒ๋งต์— ๋Œ€ํ•œ 6๊ฐœ์˜ ํ…์Šค์ฒ˜๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Basis๋ฅผ ์ง€์›ํ•˜๋Š” KTX2๋Š” ํ…์Šค์ฒ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ด์ง€๋งŒ ํŒŒ์ผ์ด ํ•˜๋‚˜์ธ ํ๋ธŒ๋งต์„ ๋” ์ž˜ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ThreeJS๊ฐ€ ๋ฏธ๋ž˜์— ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„์ง€๋Š” ๋ถˆํ™•์‹คํ•ฉ๋‹ˆ๋‹ค. 6๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋ณธ ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ๋กœ๋” ์ง€์›์œผ๋กœ KTX2๋ฅผ ํš๋“ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

RGBM5๋Š” ๋ณ„๋„์˜ PR์ด ํ•„์š”ํ•˜๋ฉฐ ํ˜„์žฌ ์กด์žฌํ•˜๋Š” RGBM7 ๋˜๋Š” RGBM16์ด๊ฑฐ๋‚˜ ์Šน์ˆ˜ ๊ฐ’์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์œ ๋‹ˆํผ์„ ์ทจํ•˜๋Š” ๋ณ€ํ˜•์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์•ŒํŒŒ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์••์ถ•ํ•˜์—ฌ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ์˜ ์•ž๋ถ€๋ถ„์—์„œ ๋…ผ์˜ํ•œ ๋Œ€๋กœ ์•ŒํŒŒ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋…ธ๋ฉ€ ๋งต ๋ฐ ์„ ํ˜•/ ์••์ถ• ์ง€์›์— ๋”ฐ๋ผ ํ˜•์‹์ด ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ํ…์Šค์ฒ˜(๊ธฐ๋ณธ ํŒŒ์ผ์˜ X์˜ ๊ฒฝ์šฐ ๋‹จ์ผ ์ƒ‰์ƒ RGB ๋ฐ Y์˜ ๊ฒฝ์šฐ ์•ŒํŒŒ)๋กœ ๋ถ„ํ• ๋  ์ˆ˜ ์žˆ๋Š” ๋น„์ƒ‰์ƒ ์ธ์ฝ”๋”ฉ.

Three.js๋Š” ํ˜„์žฌ Basis Universal์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ์ฃผ ์ „์— ์ƒˆ๋กœ์šด Basis ํ˜•์‹์ธ UASTC๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์ „์—๋Š” Basis๊ฐ€ ๋‹จ์ผ ํŒŒ์ผ์—์„œ ํ๋ธŒ๋งต์„ ์ง€์›ํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

KTX2 ๋กœ๋”๋Š” https://github.com/mrdoob/three.js/pull/18490 ์œผ๋กœ ์ง„ํ–‰ ์ค‘

Basis์šฉ README์˜ ์ด์ „ ๋ฒ„์ „ (UASTC ์ด์ „์ด์ง€๋งŒ ํ˜„์žฌ README์—๋Š” ์—ฌ์ „ํžˆ ์กด์žฌ)์€ ๋‹จ์ผ ๊ธฐ๋ฐ˜ ํŒŒ์ผ ๊ธฐ๋Šฅ์œผ๋กœ ๋‹ค์ค‘ ํ…์Šค์ฒ˜ ํŒจํ‚น์— ๋Œ€ํ•œ ์–ธ๊ธ‰์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Basis ํŒŒ์ผ์€ ๋น„๊ท ์ผ ํ…์Šค์ฒ˜ ๋ฐฐ์—ด์„ ์ง€์›ํ•˜๋ฏ€๋กœ ํ๋ธŒ๋งต, ๋ณผ๋ฅจ ํ…์Šค์ฒ˜, ํ…์Šค์ฒ˜ ๋ฐฐ์—ด, ๋ฐ‰๋งต ๋ ˆ๋ฒจ, ๋น„๋””์˜ค ์‹œํ€€์Šค ๋˜๋Š” ์ž„์˜์˜ ํ…์Šค์ฒ˜ "ํƒ€์ผ"์„ ๋‹จ์ผ ํŒŒ์ผ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์••์ถ•๊ธฐ๋Š” ์ „์ฒด ํŒŒ์ผ์—์„œ ์ƒ‰์ƒ ๋ฐ ํŒจํ„ด ์ƒ๊ด€ ๊ด€๊ณ„๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ‰๋งต์ด ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ๋‹จ์ผ ํŒŒ์ผ์— ๋งค์šฐ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๊ณ , ํ˜„์žฌ ์—ฌ๊ฐ€ ์‹œ๊ฐ„๋„ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด ๋ฌธ์ œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰๋˜๊ณ  KTX2 ๋กœ๋”๊ฐ€ ์ค€๋น„๋˜๋ฉด ์••์ถ•/ํŒฉ ํ๋ธŒ๋งต โ€‹โ€‹์ง€์›์ด ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€ ์—ฌ์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด PR์— ์ฐธ์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. :)

์•ˆ๋…•ํ•˜์„ธ์š”, iOS์—์„œ ๊ฐ„ํ—์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(aawww maaaan!)
๊ธฐ๋ณธ์ ์œผ๋กœ ํ…์Šค์ฒ˜๊ฐ€ ์ž˜ ๋กœ๋“œ๋  ๋•Œ๋„ ์žˆ๊ณ  ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฝ˜์†”์— ์˜ค๋ฅ˜๊ฐ€ ์—†๊ณ  ๋กœ๋“œ ์ง„ํ–‰๋ฅ ์ด 100%์ด๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
๊ณต์‹ ์˜ˆ์ œ(https://threejs.org/examples/?q=basis#webgl_loader_texture_basis)์™€ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋‘ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด iPhone X, Safari์—์„œ ํ…์Šค์ฒ˜๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
iPhone 6, Safari์—์„œ๋Š” ์ ˆ๋Œ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚˜๋จธ์ง€๋Š” ๋‹ค ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.
๋ญ๊ฐ€ ๋ ์ˆ˜ ์žˆ์—ˆ๋Š”์ง€?

[ํŽธ์ง‘] Mac OS์˜ Safari์—์„œ ์—ฌ์ „ํžˆ ๊ฐ„ํ—์ ์ธ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

@igghera ํŠนํžˆ ๊ณต์‹ ์˜ˆ์ œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๋ฒ„๊ทธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ƒˆ ํ˜ธ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”!

BasisTextureLoader ์— 2D ๋ฐฐ์—ด ํ…์Šค์ฒ˜์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์„ ์กฐ๊ธˆ ์กฐ์‚ฌํ–ˆ์ง€๋งŒ ์ง„ํ–‰ ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ณ€ํ™”ํ•˜๋Š” transcode ๊ฐœ์ˆ˜์˜ ์ด๋ฏธ์ง€๋ฅผ ํ†ตํ•ด ๋ฃจํ”„ ๊ธฐ๋Šฅ์— ์˜ํ•ด ๋ฐ˜ํ™˜ basisFile.getNumImages() ๊ฐ„๋‹จ ๋ณด์ธ๋‹ค, ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ ์ฃผ์†Œ๋กœ ์„ธ ๊ฐ€์ง€๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :

  1. compressedTexImage3D ์€ THREE.WebGLState ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ gl.TEXTURE_2D_ARRAY ๋‹น WebGLRenderingContext.compressedTexImage3D gl.TEXTURE_2D_ARRAY ๋Œ€ํ•œ ์˜ต์…˜์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. Basis์˜ API๋Š” ์ด๋ฏธ์ง€ ์ธ๋ฑ์Šค๋‹น ๊ฐœ๋ณ„ ๋ฐ‰๋งต์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ sampler2DArray ์— ๋ฐ”์ธ๋”ฉํ•˜๋ ค๋ฉด ํ•˜๋‚˜์˜ ํฐ ํ…์Šค์ฒ˜ ๋ธ”๋กญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?
  3. CompressedTexture ๋Š” ์ด๋ฏธ์ง€ ์ธ๋ฑ์Šค๋ณ„๋กœ ๋ฐ‰๋งต์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 200๊ฐœ์˜ ๊นŠ์€ ๋ฐฐ์—ด ์ด๋ฏธ์ง€์™€ 6๊ฐœ์˜ ๋ฐ‰๋งต ์ˆ˜์ค€์˜ ๊ฒฝ์šฐ 1200๊ฐœ์˜ ๋ฐ‰๋งต ํ•ญ๋ชฉ์ด ๋  ๊ฒƒ์ด๋ฏ€๋กœ mipmaps ์˜ CompressedTexture ๋Š” ์ŠคํŠธ๋ผ์ด๋“œ ๋ฐฐ์—ด์ด ๋ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด WebGL์ด ๊ทธ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ถ”์ƒํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋น„๋””์˜ค ํ…์Šค์ฒ˜์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๊ตฌํ˜„์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๊ด„์ ์œผ๋กœ ํ•œ ๋ฒˆ์— ํŠธ๋žœ์Šค์ฝ”๋”ฉํ•˜๋Š” ๋Œ€์‹  ๊ธฐ๋ณธ ํŒŒ์ผ ํ•ธ๋“ค์„ ์—ด์–ด ๋‘๊ณ  ๋‹ค์Œ ํ”„๋ ˆ์ž„์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰