undefined

5๊ฐ• ์žฌ์งˆ (part1 ~ 2)

Material์€ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์™€ ํ•จ๊ป˜ Object3D ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์š”์†Œ

Object์˜ ์„ธ ๊ฐ€์ง€ ํŒŒ์ƒ ํด๋ž˜์Šค (Mesh, Line, Points) ๊ฐ๊ฐ์„ ์œ„ํ•œ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฅ˜๋˜์–ด ์ œ๊ณต๋œ๋‹ค

 

Material

๋ชจ๋“  material ํŒŒ์ƒ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์ธ Material์˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

const material = new THREE.MeshBasicMaterial({
  // Material์˜ ์†์„ฑ๊ฐ’ (๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •)
  visible: true,
  transparent: true,
  opacity: 1,
  depthTest: true,
  depthWrite: true,
  side: THREE.FrontSide,

  // MeshBasicMaterial์˜ ์†์„ฑ๊ฐ’
  color: 0xffffff,
  wireframe: false,
});
  • visible: ๋ Œ๋”๋ง ์‹œ mesh๊ฐ€ ๋ณด์ผ์ง€ ์•ˆ๋ณด์ผ ์ง€
  • transparent: ๋ถˆํˆฌ๋ช…๋„(opacity)๋ฅผ ์‚ฌ์šฉํ•  ์ง€ ์—ฌ๋ถ€
  • opacity: ์žฌ์งˆ์˜ ๋ถˆํˆฌ๋ช…๋„๋ฅผ ์ง€์ • (0~1 ์‚ฌ์ด์˜ ๊ฐ’) 0์€ ์™„์ „ ํˆฌ๋ช…, 1์€ ์™„์ „ ๋ถˆํˆฌ๋ช…
  • depthTest: ๋ Œ๋”๋ง ๋˜๊ณ  ์žˆ๋Š” Mesh์˜ ํ”ฝ์…€ ์œ„์น˜์˜ z๊ฐ’์„ depth buffer ๊ฐ’์„ ์ด์šฉํ•ด ๊ฒ€์‚ฌํ•  ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€
  • depthWrite: ๋ Œ๋”๋ง๋˜๊ณ  ์žˆ๋Š” Mesh์˜ ํ”ฝ์…€์— ๋Œ€ํ•œ z๊ฐ’์„ depth buffer์— ๊ธฐ๋กํ• ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€
  • side: mesh๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์‚ผ๊ฐํ˜• ๋ฉด์— ๋Œ€ํ•ด ์•ž ๋ฉด๋งŒ ๋ Œ๋”๋งํ•  ๊ฒƒ์ธ์ง€, ๋’ท ๋ฉด๋งŒ ๋ Œ๋”๋ง ํ•  ๊ฒƒ์ธ์ง€, ๋ชจ๋‘ ๋ Œ๋”๋ง ํ•  ๊ฒƒ์ธ์ง€ ์ง€์ • (๊ด‘์›์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ์žฌ์งˆ(MeshBasicMaterial ๋“ฑ)์—์„œ๋Š” ์ฐจ์ด๋ฅผ ์ž˜ ํŒŒ์•…ํ•  ์ˆ˜ ์—†์Œ)

Mesh์˜ side

์‚ผ๊ฐํ˜• ๋ฉด์ด ์•ž๋ฉด์ธ์ง€๋Š” ์‚ผ๊ฐํ˜•์„ ๊ตฌ์„ฑํ•˜๋Š” ์ขŒํ‘œ๊ฐ€ ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ๋Š” ์ง€๋กœ ๊ฒฐ์ •ํ•œ๋‹ค

Depth Buffer

๊นŠ์ด ๋ฒ„ํผ ๋˜๋Š” z ๋ฒ„ํผ๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค

3์ฐจ์› ๊ฐ์ฒด๋ฅผ ์นด๋ฉ”๋ผ๋ฅผ ํ†ตํ•ด ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜์‹œ์ผœ ํ™”๋ฉด์ƒ์— ๋ Œ๋”๋ง ๋  ๋•Œ, ํ•ด๋‹น 3์ฐจ์› ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ ํ”ฝ์…€์— ๋Œ€ํ•œ z ์ขŒํ‘œ๊ฐ’์„ 0~1๋กœ ์ •๊ทœํ™”์‹œํ‚จ๋‹ค. ์ด ์ •๊ทœํ™”๋œ z๊ฐ’์ด ์ €์žฅ๋œ ๋ฒ„ํผ๊ฐ€ z ๋ฒ„ํผ.

  • ์ด ๊ฐ’์ด ์ž‘์„์ˆ˜๋ก ์นด๋ฉ”๋ผ์—์„œ ๊ฐ€๊นŒ์šด 3์ฐจ์› ๊ฐ์ฒด์˜ ํ”ฝ์…€์ด๋‹ค.
  • ์ฃผ๋กœ ๋” ๋ฉ€๋ฆฌ ์žˆ๋Š” 3์ฐจ์› ๊ฐ์ฒด๊ฐ€ ๊ฐ€๊นŒ์šด ๊ฐ์ฒด๋ฅผ ๋ฎ์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 


 

Points ํƒ€์ž…์˜ Object3D Material

PointsMaterial

const material = new THREE.PointsMaterial({
  color: 0xff0000,
  size: 1,
  sizeAttenuation: false
})

sizeAttenuation: ํฌ์ธํŠธ๊ฐ€ ์นด๋ฉ”๋ผ์˜ ๊ฑฐ๋ฆฌ์— ๋”ฐ๋ผ ํฌ๊ธฐ๊ฐ€ ๊ฐ์‡„๋˜๋„๋ก ํ•จ. (๊ธฐ๋ณธ๊ฐ’์€ true)

์™ผ: sizeAttenuation === true ์˜ค: sizeAttenuation === false

  • sizeAttenuation === true: ์นด๋ฉ”๋ผ์™€ ๊ฐ€๊นŒ์šด ํฌ์ธํŠธ์™€ ๋จผ ํฌ์ธํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค
  • sizeAttenuation === false: ๊ฑฐ๋ฆฌ์— ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ๊ฐ™์€ ํฌ๊ธฐ์˜ ํฌ์ธํŠธ๋กœ ๋ Œ๋”๋ง๋œ๋‹ค

 

point ๋ชจ์–‘ ๋ณ€๊ฒฝํ•˜๊ธฐ

์ž‘์€ ์› ์ด๋ฏธ์ง€๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ์–‘์„ ๋ณ€๊ฒฝํ•ด๋ณด์ž

const sprite = new THREE.TextureLoader().load("/assets/disc.png")
const material = new THREE.PointsMaterial({
  map: sprite,
  alphaTest: 0.5,
  color: 0xff0000,
  size: 0.1,
  sizeAttenuation: true
})
  • TextureLoader๋ฅผ ์ด์šฉํ•˜๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•ด์„œ texture ๊ฐ์ฒด๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค
  • alphaTest: ์ด๋ฏธ์ง€์˜ ํ”ฝ์…€ ๊ฐ’ ์ค‘ ์•ŒํŒŒ๊ฐ’์ด ์ด ๊ฐ’๋ณด๋‹ค ํด ๋•Œ๋งŒ ํ”ฝ์…€์ด ๋ Œ๋”๋ง๋œ๋‹ค.

๊ฒฐ๊ณผ

disc texture๊ฐ€ ์ ์šฉ๋œ ๊ฒฐ๊ณผ

 


 

Line ํƒ€์ž…์˜ Object3D Material

๋ผ์ธ ๋ Œ๋”๋ง ๋ฐฉ์‹

Line ํƒ€์ž…์˜ Object3D๋Š” vertices์˜ ๊ตฌ์„ฑ ์ขŒํ‘œ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์—ฐ๊ฒฐ ๋˜์–ด ๋ผ์ธ์œผ๋กœ ๋ Œ๋”๋ง๋œ๋‹ค.

vertices๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๋•Œ ๊ฐ Line ํƒ€์ž…๋ณ„๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ Œ๋”๋ง๋œ๋‹ค.

const vertices = [
  -1, 1, 0, 
  1, 1, 0, 
  -1, -1, 0, 
  1, -1, 0
];

๋ผ์ธ ๋ Œ๋”๋ง ๋ฐฉ์‹

  • Line: vertices์˜ ์ˆœ์„œ๋Œ€๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค
  • LineSegments: vertices๋ฅผ 2๊ฐœ์”ฉ ์ง์ง€์–ด์„œ ํ•˜๋‚˜์˜ ์„ ์œผ๋กœ ๋ Œ๋”๋งํ•œ๋‹ค
  • LineLoop: Line๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋ง ๋˜๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰ ์ขŒํ‘œ์™€ ์ฒซ ๋ฒˆ์งธ ์ขŒํ‘œ๋ฅผ ์—ฐ๊ฒฐ์‹œํ‚จ๋‹ค.

 

LineBasicMaterial

color ์†์„ฑ์œผ๋กœ ์„ ์˜ ์ƒ‰์ƒ๊ฐ’๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. (๊ตต๊ธฐ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ)

const material = new THREE.LineBasicMaterial({
  color: 0xffff00
})

 

LineDashedMaterial

์„ ์˜ ๊ธธ์ด๋ฅผ ์ฐธ์กฐํ•ด์„œ ์žฌ์งˆ์ด ์ ์šฉ๋˜๋ฏ€๋กœ ์„ ์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. line.computeLineDistances()

const material = new THREE.LineDashedMaterial({
  color: 0xffff00,
  dashSize: 0.2,
  gapSize: 0.1,
  scale:1
});

const line = new THREE.LineLoop(geometry, material);
line.computeLineDistances()

 


 

Mesh ํƒ€์ž…์˜ Object3D Material

MeshBasicMaterial

  • color: ์ƒ‰์ƒ
  • wireframe: mesh๋ฅผ ์„  ํ˜•ํƒœ๋กœ ๋ Œ๋”๋งํ• ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€

 

MeshLambertMaterial

mesh๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ •์ ์—์„œ ๊ด‘์›์˜ ์˜ํ–ฅ์„ ๊ณ„์‚ฐํ•˜๋Š” ์žฌ์งˆ

const material = new THREE.MeshPhongtMaterial({
  color: 0xff0000,
  emissive: 0x555500,
  wireframe: false,
});
  • emissive: ๋‹ค๋ฅธ ๊ด‘์›์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”, material ์ž์ฒด์—์„œ ๋ฐฉ์ถœํ•˜๋Š” ์ƒ‰์ƒ ๊ฐ’
  • ** ๊ฒ€์ •์ƒ‰์œผ๋กœ ์ง€์ •ํ•  ๊ฒฝ์šฐ ์•„๋ฌด๋Ÿฐ ์ƒ‰๋„ ๋ฐฉ์ถœํ•˜์ง€ ์•Š์Œ

 

MeshPhongMaterial

mesh๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ํ”ฝ์…€ ๋‹จ์œ„๋กœ ๊ด‘์›์˜ ์˜ํ–ฅ์„ ๊ณ„์‚ฐํ•˜๋Š” material

const material = new THREE.MeshPhongMaterial({
  color: 0xff0000,
  emissive: 0x555500,
  specular: 0xffff00,
  shininess: 10,
  flatShading: true,
});
  • specular: ๊ด‘์›์— ์˜ํ•œ ๋ฐ˜์‚ฌ ๋˜๋Š” ์ƒ‰์ƒ. (๊ธฐ๋ณธ๊ฐ’์€ ์—ฐํ•œ ํšŒ์ƒ‰)
  • shininess: specular ์ƒ‰์œผ๋กœ ๋ฐ˜์‚ฌ๋˜๋Š” ์ •๋„
  • flatShading: mesh๋ฅผ ํ‰ํ‰ํ•˜๊ฒŒ ๋ Œ๋”๋ง ํ• ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€

 

์™ผ: shiness === 10 && flatShading: true ์˜ค: shiness === 1 && flatShading: false

 

๋ฌผ๋ฆฌ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง(PBR)์„ ์œ„ํ•œ Material

  • MeshStandardMaterial์™€ MeshPhysicalMaterial, 2๊ฐ€์ง€๊ฐ€ ์กด์žฌ
  • 3์ฐจ์› ๊ทธ๋ž˜ํ”ฝ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์žฌ์งˆ์ด๋‹ค.
  • ์†๋„๋ฉด์—์„œ๋Š” ๋‹ค๋ฅธ ์žฌ์งˆ์— ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆฌ์ง€๋งŒ ํ›จ์”ฌ ๊ณ ํ’ˆ์งˆ์˜ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

MeshStandardMaterial

const material = new THREE.MeshStandardMaterial({
    color: 0xff0000,
    emissive: 0x555500,
    roughness: 0.25,
    matalness: 1,
    wireframe: false,
    flatShading: false,
  });
  • roughness: ๊ฑฐ์น ๊ธฐ(0~1). 0์ผ ๊ฒฝ์šฐ ํ‘œ๋ฉด์ด ๋งˆ์น˜ ๊ฑฐ์šธ๊ณผ ๊ฐ™์€ ์ƒํƒœ. 1์ผ ๊ฒฝ์šฐ ํ‘œ๋ฉด์— ๊ด‘์›์ด ๋ฐ˜์‚ฌ๋˜์ง€ ์•Š์Œ
  • metalness: ๊ธˆ์†์„ฑ(0~1). 0์ผ ๊ฒฝ์šฐ ๋Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ. 1์ผ ๊ฒฝ์šฐ ์™„์ „ํ•œ ๊ธˆ์†์„ฑ

 

MeshPhysicalMaterial

MeshStandardMaterial์„ ์ƒ์† ๋ฐ›๊ณ  ์žˆ๋Š” ๋ณด๋‹ค ๋ฐœ์ „๋œ ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง ์žฌ์งˆ

ํ‘œ๋ฉด์— ์ฝ”ํŒ… ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๊ณ , ๋‹จ์ˆœ ํˆฌ๋ช…๋„ ์ฒ˜๋ฆฌ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์œ ๋ฆฌ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค

  • clearcoat: 0~1 ์‚ฌ์ด ๊ฐ’. 0์ด๋ฉด mesh์˜ ํ‘œ๋ฉด์— ์ฝ”ํŒ…์ด ์ „ํ˜€ ์•ˆ๋˜์–ด ์žˆ๋Š” ์žฌ์งˆ, 1์ด๋ฉด ์ฝ”ํŒ…์— ๋Œ€ํ•œ ํšจ๊ณผ๋ฅผ ์ตœ๋Œ€๋กœ ํ‘œํ˜„
  • clearcoatRoughness: 0~1 ์‚ฌ์ด ๊ฐ’. ์ฝ”ํŒ…์˜ ๊ฑฐ์น ๊ธฐ

clearcoat๊ฐ’์ด ์ปค์งˆ ์ˆ˜๋ก ์ฝ”ํŒ… ํšจ๊ณผ๊ฐ€ ์ ์šฉ๋˜์–ด ๊ด‘์›์˜ ๋ฐ˜์‚ฌ ํšจ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.


๋งˆ๋ฌด๋ฆฌ

  • ์žฌ์งˆ์€ ์ž์‹ ์˜ ์†์„ฑ๊ฐ’ ๋ณ€ํ™”์™€ ์™ธ๋ถ€ ๊ด‘์›์— ์˜ํ–ฅ์„ ๋งค์šฐ ํฌ๊ฒŒ ๋ฐ›๋Š”๋‹ค.
  • ์›ํ•˜๋Š” ์žฌ์งˆ ํšจ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์–‘ํ•œ ๊ฒฝํ—˜์ด ํ•„์š”ํ•˜๋‹ค.

์•ŒํŒŒ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๊ณต๋ถ€

๋ฐ‘์— ๋งํฌ์—์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ์•ŒํŒŒ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ณด์•˜๋‹ค.

 

ShaderLab: ๋ ˆ๊ฑฐ์‹œ ์•ŒํŒŒ ํ…Œ์ŠคํŠธ - Unity ๋งค๋‰ด์–ผ

์•ŒํŒŒ ํ…Œ์ŠคํŠธ๋Š” ํ”ฝ์…€์ด ํ™”๋ฉด์— ์“ฐ์—ฌ์ง€๋Š” ๊ฒƒ์„ ์ทจ์†Œํ•  ๋งˆ์ง€๋ง‰ ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค.

docs.unity3d.com

์š”์ฆ˜์€ ๊ฒŒ์ž„ ์—”์ง„์—์„œ ์•ŒํŒŒ ํ…Œ์ŠคํŠธ์™€ ๋ธ”๋ Œ๋”ฉ์„ ์ž˜ ๊ตฌํ˜„ํ•ด๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‰์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

Depth Buffer ์ถ”๊ฐ€ ๊ณต๋ถ€

๋‹ค๋ฅธ ํŒ€์›์ด Depth Buffer์— ๋Œ€ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณต์œ ํ•ด์ฃผ์…จ๋‹ค.

Depth Buffer๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

์šฐ๋ฆฌ๋Š” 3์ฐจ์› ์ƒ์— object.position.set(x,y,z)์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ์œ„์น˜์‹œํ‚ค๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์“ด๋‹ค๋ฉด ์—ฐ์‚ฐ์ด ๋งค์šฐ ์ปค์ง„๋‹ค.

๋”ฐ๋ผ์„œ ์—ฐ์‚ฐ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด ๊ฐ’์„ ์ •๊ทœํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (์ขŒํ‘œ๊ฐ’์„ ์ตœ์†Œ๊ฐ’~์ตœ๋Œ€๊ฐ’ ๋ฒ”์œ„๋‚ด์—์„œ ์••์ถ•ํ•จ.)

๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ ์…ฐ์ด๋”์—์„œ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š” z-buffer image

์ด z-buffer๊ฐ’์— ์ปฌ๋Ÿฌ๋ฅผ ์ž…ํžˆ๋ฉด ์ž…์ฒด๊ฐ์ด ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋œ๋‹ค!