.basis ํ ์ค์ฒ์ ๋ํ ์ด๊ธฐ ์ง์์ด https://github.com/mrdoob/three.js/pull/16522์ ์ถ๊ฐ๋์์ต๋๋ค
setMaxWorkers()
๋ฉ์๋ ์ถ๊ฐload()
์์ ๋๊ธฐ์ ์ผ๋ก ํ
์ค์ฒ๋ฅผ ๋ฐํํฉ๋๋ค(์ํ ์์ด?)์์ง ์ฝ๋๋ฅผ ์์ธํ ์ดํด๋ณด์ง๋ ์์์ง๋ง ๋ค๋ฅธ ํ
์ค์ฒ ๋ก๋์ฒ๋ผ ๋๊ธฐ์์ผ๋ก 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 ์ค๋ช ๊ณผ ๋์ผํ ๋ฌธ์
๋๋ ์ด๊ฒ์ ๋๋ฒ๊น ํ๊ณ ์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ๋ฐ์ํฉ๋๋ค.
@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
ํ
์ค์ฒ๋ฅผ ๋ฐ๋งต์ด ํฌํจ๋ ์ด ํ
์ค์ฒ๋ก ๊ต์ฒดํ ์ ์์ด์ผ ํฉ๋๋ค.
ํธ์ง: ์ฃ์กํฉ๋๋ค . 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
...
๊ทธ๋ฆฌ๊ณ ํ์ธํ๊ธฐ ์ํด ๋ฐํ์์ ์ด๋ฌํ ๋ฐ๋งต์ ์์ฑํ ์ ์์ผ๋ฉฐ ๊ด๋ จ๋ ๋ณด๊ฐ ์ ์ฝ ์กฐ๊ฑด๊ณผ ๊ด๋ จ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๊น?
๋ฌผ๋ก ์ ๋๋ค. ๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๊ทธ๋ฆฌ๊ณ ํ์ธํ๊ธฐ ์ํด ๋ฐํ์์ ์ด๋ฌํ ๋ฐ๋งต์ ์์ฑํ ์ ์์ผ๋ฉฐ ๊ด๋ จ๋ ๋ณด๊ฐ ์ ์ฝ ์กฐ๊ฑด๊ณผ ๊ด๋ จ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๊น?
์, ์ ๋ ์์๋์ต๋๋ค. ์์ถ๋ 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()
๊ฐ๋จ ๋ณด์ธ๋ค, ๊ทธ๋ฌ๋ ๋ค์ ์ฃผ์๋ก ์ธ ๊ฐ์ง๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค :
compressedTexImage3D
์ THREE.WebGLState
์กด์ฌํ์ง ์์ผ๋ฉฐ gl.TEXTURE_2D_ARRAY
๋น WebGLRenderingContext.compressedTexImage3D
gl.TEXTURE_2D_ARRAY
๋ํ ์ต์
์ ์ ๋ฌํด์ผ ํฉ๋๋ค.sampler2DArray
์ ๋ฐ์ธ๋ฉํ๋ ค๋ฉด ํ๋์ ํฐ ํ
์ค์ฒ ๋ธ๋กญ์ด ํ์ํฉ๋๊น?CompressedTexture
๋ ์ด๋ฏธ์ง ์ธ๋ฑ์ค๋ณ๋ก ๋ฐ๋งต์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. 200๊ฐ์ ๊น์ ๋ฐฐ์ด ์ด๋ฏธ์ง์ 6๊ฐ์ ๋ฐ๋งต ์์ค์ ๊ฒฝ์ฐ 1200๊ฐ์ ๋ฐ๋งต ํญ๋ชฉ์ด ๋ ๊ฒ์ด๋ฏ๋ก mipmaps
์ CompressedTexture
๋ ์คํธ๋ผ์ด๋ ๋ฐฐ์ด์ด ๋ฉ๋๋ค. ์๋๋ฉด WebGL์ด ๊ทธ ์ธ๋ถ ์ฌํญ์ ์ถ์ํํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?๊ทธ๋ฐ ๋ค์ ๋น๋์ค ํ ์ค์ฒ์ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ตฌํ์ด ํ์ํ ์ ์์ต๋๋ค. ์ผ๊ด์ ์ผ๋ก ํ ๋ฒ์ ํธ๋์ค์ฝ๋ฉํ๋ ๋์ ๊ธฐ๋ณธ ํ์ผ ํธ๋ค์ ์ด์ด ๋๊ณ ๋ค์ ํ๋ ์์ ์์ฒญํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ํด๊ฒฐ ๋ฐฉ๋ฒ(ํธ๋์ค์ฝ๋๋ฅผ ํธ์ถํ๊ธฐ ์ง์ ์์ ์์์)์ด ์ ์๊ฒ ํจ๊ณผ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ๋ฌผ๋ก ํธ๋์ค์ฝ๋์์ ์์ ํด์ผ ํ์ง๋ง JS์์ ์ด๋ฅผ ์ฝ๊ฒ ๊ฒ์ฆํ ์ ์์ต๋๋ค.