5๊ฐ ์ฌ์ง part3 - ํ ์ค์ณ
map ์์ฑ
- ํ ์ค์ณ ๊ฐ์ฒด๋ฅผ ์ง์ ํ๋ฉด ์ง์ค๋ฉํธ๋ฆฌ์ ํ๋ฉด์ ์ง์ ๋ ํ ์ค์ณ์ ์ด๋ฏธ์ง๊ฐ ์ท์ฒ๋ผ ์ ํ์ง
- ๋ฉ์ฌ์ ๋ชจ๋ material์ ์ ์ฉํ ์ ์๋ค
ํ ์ค์ณ ๊ฐ์ฒด
- ์ด๋ฏธ์ง๋ ๋์์ ๋ฑ์ ํตํด ์์ฑ๋๋ค
- TextureLoader๋ฅผ ํตํด ๋ณํํ ์ ์๋ค
UV ์ขํ
ํ ์ค์ณ ๋งตํ์ ์ง์ค๋ฉํธ๋ฆฌ์ UV ์ขํ๋ก ๋งตํ๋์ด ์๋ค.
- 0๊ณผ 1 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๋ค.
- U: ์ํ ๋ฐฉํฅ์ ๋ํ ์ถ, V: ์์ง ๋ฐฉํฅ์ ๋ํ ์ถ
- three.js์ uv ์ขํ (0,0)์ ์ข์ธก ํ๋จ์ด๊ณ , (1,1)์ ์ฐ์ธก ์๋จ์ด๋ค.
PRACTICE: MeshStandardMaterial์ ํ ์ค์ณ ์ ์ฉํ๊ธฐ
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ MeshStandardMaterial์ ์ ์ฉํด ๋ณด์
- ์ด๋ฏธ์ง๋ก ํ
์ค์ณ ๊ฐ์ฒด ์์ฑํ๊ธฐ
- ์ด๋ฏธ์ง๊ฐ ๋คํธ์ํฌ์์ ์ฑ๊ณต์ ์ผ๋ก ๋ค์ด๋ก๋๋๊ณ ํ ์ค์ณ ์์ฑ์ด ์๋ฃ๋๋ฉด ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋๋ค.
const textureLoader = new THREE.TextureLoader();
const map = textureLoader.load( '/assets/uv_grid_opengl.jpg', texture => {} )- material์ map ์์ฑ์ ์ด ๊ฐ์ฒด๋ฅผ ์ง์ ํด ์ค๋ค.
const material = new THREE.MeshStandardMaterial({ map });
- ํ ์ค์ณ์ ์์ฑ์ ์ง์ ํ๋ค. textureLoader.load์ ์ฝ๋ฐฑ ํจ์์์ ๊ตฌํํด ์ค๋ค.
const map = textureLoader.load(
'/assets/uv_grid_opengl.jpg',
texture => {
// texture์ ๋ฐ๋ณต์
texture.repeat.x = 1
texture.repeat.y = 1
// texture๋ฅผ ์ด๋ป๊ฒ ๋ฐ๋ณตํ ๊ฒ์ธ์ง ์ง์
texture.wrapS = THREE.RepeatWrapping texture.wrapT = THREE.RepeatWrapping
})- ํ ์ค์ณ์ ์์ฑ์ ํ ์ค์ณ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ์ดํ์ ์ค์ ๋์ด์ผ ํจ
texture์ wrapS, wrapT ์์ฑ
texture.repeat ์์ฑ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, texture๋ฅผ ์ด๋ป๊ฒ ๋ฐ๋ณตํ ๊ฒ์ธ์ง ์ง์
RepeatWrapping
: ์ดํ ๋ฐ๋ณต์ ๊ฐ์ ์ด๋ฏธ์ง๋ก ์ฑ์ClampToEdgeWrapping
: ์ดํ ๋ฐ๋ณต์ ์ด๋ฏธ์ง์ ๋๋จ ํฝ์ ๋ก๋ง ๋๋จธ์ง ์์ญ์ ์ฑ์MirroredRepeatWrapping
: ์ง์๋ฒ์งธ ๋ฐ๋ณต์์ ์ด๋ฏธ์ง๊ฐ ๋ค์งํ ๋ชจ์์ผ๋ก ๋งตํ
texture์ magFilter, minFilter ์์ฑ
ํ ์ค์ณ ์ด๋ฏธ์ง์ ์๋ ํฌ๊ธฐ๋ณด๋ค ํ๋ ๋๋ ์ถ์๋์ด ๋ ๋๋ง ๋ ๋ ์ฌ์ฉํ๋ ํํฐ
magFilter
LinearFilter
: ๊ฐ์ฅ ๊ฐ๊น์ด 4๊ฐ์ ํฝ์ ์์์ ์ป์ด์ ์ ํ ๋ณต๊ฐํ ๊ฐ์ ์ฌ์ฉNearestFilter
: ๊ฐ์ฅ ๊ฐ๊น์ด ํ๋์ ํฝ์ ์์์ ๊ฐ์ ธ์์ ์ฌ์ฉ → ์ด๋ฏธ์ง๋ฅผ ํ๋ํ ์๋ก ๊ณ๋จ ํ์์ด ๋ฐ์ (๊ธฐ๋ณธ๊ฐ)
minFilter
** mipMap: ์๋์ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ ๋ฐ์ผ๋ก ์ค์ฌ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ ์ด๋ฏธ์ง ์
NearestFilter
: mipMap์ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ์ฅ ๊ฐ๊น์ด ํฝ์ ํ๋๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉLinearFilter
: mipMap์ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ์ฅ ๊ฐ๊น์ด 4๊ฐ์ ํฝ์ ์์์ ์ป์ด์ ์ ํ ๋ณด๊ฐํ ๊ฐ์ ์ฌ์ฉNearestMipmapNearestFilter
: ๋ ๋๋ง ํ ํฌ๊ธฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด mipMap ์ด๋ฏธ์ง 1๊ฐ๋ฅผ ์ ํํ ํ ๊ฐ์ฅ ๊ฐ๊น์ด ํฝ์ 1๊ฐ๋ฅผ ์ฌ์ฉLinearMipmapNearestFilter
: ๋ ๋๋ง ํ ํฌ๊ธฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด mipMap ์ด๋ฏธ์ง 1๊ฐ๋ฅผ ์ ํํ ํ ๊ฐ์ฅ ๊ฐ๊น์ด 4๊ฐ์ ํฝ์ ์์์ ์ป์ด์ ์ ํ ๋ณด๊ฐํ ๊ฐ์ ์ฌ์ฉLinearMipmapLinearFilter
: ๋ ๋๋ง ํ ํฌ๊ธฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด MipMap ์ด๋ฏธ์ง 2๊ฐ๋ฅผ ์ ํํ ํ ๊ฐ์ฅ ๊ฐ๊น์ด ํฝ์ 4๊ฐ๋ฅผ ์ป๋๋ค. ์ด๋ฅผ ์ ํ ๋ณด๊ฐํ์ฌ 2๊ฐ์ ์์๊ฐ์ ์ป๊ณ ์ด๋ฅผ ๋ค์ ๊ฐ์ค์น ํ๊ท ํ ๊ฐ์ ์ฌ์ฉNearestMipmapLinearFilter
: ๋ ๋๋งํ ํฌ๊ธฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด mipMap ์ด๋ฏธ์ง 2๊ฐ๋ฅผ ์ ํํ ํ ๊ฐ์ฅ ๊ฐ๊น์ด ํฝ์ ์ 1๊ฐ์ฉ ์ป๋๋ค. ์ด 2๊ฐ์ ํฝ์ ์ ๊ฐ์ค์น ํ๊ท ๊ฐ์ ์ฌ์ฉํ๋ค.
minFilter๋ก mipMap์ ์ฌ์ฉํ๋ ๊ฒ์ด ํญ์ ์ณ์๊น?
์ฅ์
- ํ์ง์ด ์ข๋ค
๋จ์
- mipMap ์์ฑ์ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํฌ๋ค
- ๋ ๋๋ง ์ ํ๋์ ํฝ์ ๊ฐ์ ๊ฒฐ์ ํ๊ธฐ ์ํ ์ฐ์ฐ๋์ด ๋ชจ๋ ๋ค๋ฅด๋ค
ํ ์ค์ณ ๋งตํ์ ํฌ๊ธฐ ๋ฑ์ ๊ณ ๋ คํ์ฌ ์ ์ ํ minFilter ๊ฐ์ ์ง์ ํด์ผ ํ๋ค
๋ง๋ฌด๋ฆฌ
ํ์ง์ ๋ํ ๋งค์ฐ ์ธ๋ฐํ ์กฐ์ ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด ๋๋ผ์ ๋ค.
๋งค์ฐ ๊ณ ๋ํ๋ 3D ๊ทธ๋ํฝ์ ๊ตฌํํ๋ค๋ฉด mipMap์ ์ ํ์ฉํ์ฌ ํ์ง์ ๋์ด๋ ์์ ์ด ํ์ ํ ๊ฒ ๊ฐ๋ค.
ํ์ง๋ง ๋ ๊ทธ๋ ๋ฏ ํ์ง๊ณผ ์ต์ ํ ์ฌ์ด์ ํธ๋ ์ด๋ ์คํ๋ ์กด์ฌํ๋ฏ๋ก ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ํ๋จ์ ๋ด๋ ค์ผ ํ ๊ฒ์ด๋ค.
'๐ฟ ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[three.js] Material ์ฌ๋ฌ๊ฐ์ง map์ ์ ์ฉํด ๋์ฑ ์ฌ์ค์ ์ธ ํ ์ค์ณ๋ฅผ ๋ง๋ค์ด๋ณด์ (0) | 2023.06.15 |
---|---|
[ํด๋ฆฐ์ฝ๋] 4์ฅ ์ฃผ์ (with Typescript) (0) | 2023.06.13 |
[three.js] Material - ์ค๋ธ์ ํธ์ ์ฌ์ง์ ๋ค์ํ๊ฒ ์ค์ ํด๋ณด์ (0) | 2023.06.09 |
[three.js] Scene Graph๋ฅผ ์ด์ฉํ ๊ณต๊ฐ๊ตฌ์ฑ (0) | 2023.06.08 |
[ํด๋ฆฐ์ฝ๋] 3์ฅ ํจ์ with Typescript (0) | 2023.06.03 |