greentec's blog game designer, scripter, researcher

kr

Shadertoy 'Bleepy blocks' 뢄석

Tags:


β€œBleepy blocks” by Daedelus

Β 

λ„μž…

거의 2λ…„ 반 λ§Œμ— Shadertoy κ΄€λ ¨ ν¬μŠ€νŒ…μ„ ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έλ™μ•ˆ λ§Žμ€ 일이 μžˆμ—ˆμ§€λ§Œ λ‹€ν–‰νžˆ creative coding의 세계에 λŒμ•„μ˜€κ²Œ λ˜μ–΄ κΈ°μ©λ‹ˆλ‹€. μ§€κΈˆμ€ κ°„λ‹¨νžˆ 손을 ν’€μ–΄λ³΄λŠ” μ˜λ―Έμ—μ„œ μ•½κ°„ 짧은 μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. 뢄석할 μ½”λ“œλŠ” β€˜Bleepy blocksβ€™μž…λ‹ˆλ‹€. 이 μ½”λ“œλŠ” Three.js 기초 νŠœν† λ¦¬μ–Όμ˜ 쉐이더토이(Shadertoy) ν™œμš©ν•˜κΈ°μ—λ„ μ‚¬μš©λ  만큼 유λͺ…ν•œ μ½”λ“œμž…λ‹ˆλ‹€. 그럼 μ‹œμž‘ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

Β 

Texture μž…λ ₯

μ˜ˆμ „μ— Shadertoy λΉ—λ°©μšΈ 효과 λΆ„μ„μ—μ„œ μ‚¬μš©ν–ˆλ˜ κ²ƒμ²˜λŸΌ 이 μ½”λ“œμ—μ„œλ„ ν…μŠ€μ²˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ‚¬μš©λ˜λŠ” ν…μŠ€μ²˜λŠ” 8x8 ν”½μ…€ 크기의 μž‘μ€ 랜덀 λ…Έμ΄μ¦ˆμž…λ‹ˆλ‹€. 참고둜 Shadertoy λΉ—λ°©μšΈ 효과 λΆ„μ„μ—μ„œλŠ” 256x256 크기의 랜덀 λ…Έμ΄μ¦ˆ 이미지가 μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ μ‚¬μš©ν•  8x8 ν”½μ…€ μ΄λ―Έμ§€μ˜ 이름은 베이어(bayer)둜, μΉ΄λ©”λΌμ˜ 이미지 μ„Όμ„œμ— λ°°μΉ˜λ˜λŠ” 격자무늬 νŒ¨ν„΄μ˜ μ΄λ¦„μž…λ‹ˆλ‹€.

Shadertoyμ—μ„œ μ‚¬μš©λ˜λŠ” 8x8 ν”½μ…€ 크기의 베이어 νŒ¨ν„΄

λ¨Όμ € νŒ¨ν„΄ 이미지λ₯Ό λΆˆλŸ¬μ˜€κ² μŠ΅λ‹ˆλ‹€. 이 μ½”λ“œμ—μ„œλŠ” texture0μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ 이미지λ₯Ό λΆˆλŸ¬μ˜€λ„λ‘ μ§€μ •ν–ˆμŠ΅λ‹ˆλ‹€(Shadertoyμ—μ„œλŠ” iChannel0μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ 첫번째 ν…μŠ€μ²˜λ₯Ό λΆˆλŸ¬μ˜΅λ‹ˆλ‹€).

μœ„ μ½”λ“œμ˜ 결과둜 베이어 νŒ¨ν„΄ 이미지가 화면에 ν‘œμ‹œλ©λ‹ˆλ‹€. uvλŠ” μ’Œν‘œκ³„ 계산을 κ±°μ³μ„œ ν…μŠ€μ³λ₯Ό 1:1 λΉ„μœ¨λ‘œ ν‘œμ‹œλ˜λ„λ‘ ν•©λ‹ˆλ‹€. 5행을 μ£Όμ„μ²˜λ¦¬ 해보면 이미지가 화면에 꽉 차도둝, μ•½κ°„ 깨진 λΉ„μœ¨λ‘œ ν‘œμ‹œλ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

6ν–‰ λŒ€μ‹  7ν–‰μ˜ μ£Όμ„μ²˜λ¦¬λ₯Ό ν•΄μ œν•΄λ„ κ²°κ³Όμ—λŠ” λ³€ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€. 이것은 ν…μŠ€μ³λ₯Ό nearest ν•„ν„°λ‘œ 뢈러였고 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 이와 λ°˜λŒ€λ˜λŠ” 필터링 λ°©λ²•μœΌλ‘œλŠ” linear ν•„ν„°κ°€ μžˆμŠ΅λ‹ˆλ‹€. nearest ν•„ν„°λŠ” κ°€μš΄λ°κ°€ ν…μŠ€μ³ μ’Œν‘œμ— κ°€μž₯ κ°€κΉŒμš΄ 픽셀을 μ„ νƒν•˜κ³ , linear ν•„ν„°λŠ” μΈμ ‘ν•œ ν”½μ…€μ˜ μ»¬λŸ¬λ“€μ΄ 거리에 λΉ„λ‘€ν•΄μ„œ ν˜Όν•©λœ 색상을 μ–»κ²Œ λ©λ‹ˆλ‹€.1

7ν–‰ λŒ€μ‹  6행을 써도 상관이 μ—†κΈ° λ•Œλ¬Έμ—, floor ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  uv 만 μ‚¬μš©ν•˜κ² μŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ p λΌλŠ” 값을 화면에 ν‘œμ‹œν•΄λ³΄λŠ” μ½”λ“œμž…λ‹ˆλ‹€.

Β 

뢈이 λ°μ•„μ§€λŠ” 효과

λ¨Όμ € 8ν–‰μ—μ„œλŠ” ν…μŠ€μ³ 값을 noise λΌλŠ” λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€. ν…μŠ€μ³λŠ” 흑백이기 λ•Œλ¬Έμ— r, g, b λͺ¨λ‘ 같은 값을 가지고 μžˆμŠ΅λ‹ˆλ‹€. κ·Έ λ‹€μŒμ— p λΌλŠ” 값은 μ‹œκ°„ 값인 time 이 더해지고 noise 의 r, g, b 값을 λͺ¨λ‘ λ”ν•©λ‹ˆλ‹€. mod ν•¨μˆ˜λŠ” λ‚˜λ¨Έμ§€λ₯Ό λ°˜ν™˜ν•˜λŠ”λ°, λ‘λ²ˆμ§Έ μΈμˆ˜κ°€ λ‚˜λˆ„λŠ” 수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 1.0으둜 λ‚˜λˆ„κΈ° λ•Œλ¬Έμ— μ—¬κΈ°μ„œ mod ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ€ 0.0~1.0 μ‚¬μ΄μž…λ‹ˆλ‹€. 결과적으둜 화면에 λ‚˜μ˜€λŠ” 값은 검정색(0.0)κ³Ό 흰색(1.0) μ‚¬μ΄μ—μ„œ ν‘œν˜„λ©λ‹ˆλ‹€.

ν‘œν˜„μƒμ˜ 차이λ₯Ό μ’€ 더 μ•Œμ•„λ³΄κΈ° μœ„ν•΄ 9행을 μ£Όμ„μ²˜λ¦¬ν•˜κ³  10ν–‰μ˜ 주석을 ν•΄μ œν•΄ 보면 차이λ₯Ό λŠλ‚„ 수 μžˆμŠ΅λ‹ˆλ‹€. 9행은 10행보닀 κ°’μ˜ 차이λ₯Ό κ°•μ‘°ν•©λ‹ˆλ‹€.

9ν–‰ μ£Όμ„μ²˜λ¦¬ν•˜κ³  11ν–‰μ˜ 주석을 ν•΄μ œν•˜λ©΄, 9ν–‰μ˜ λ™μž‘κ³ΌλŠ” λ°˜λŒ€λ‘œ 뢈이 점점 λ°μ•„μ§€λŠ” λ“―ν•œ 효과λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

10ν–‰μ—μ„œ p 값에 min, max ν•¨μˆ˜λ₯Ό 더해주면 값이 천천히 λ³€ν•˜λ˜ λͺ¨μŠ΅μ—μ„œ μ’€ 더 μžμ—°μŠ€λŸ½κ²Œ μ „κ΅¬μ˜ 뢈이 λ“€μ–΄μ™”λ‹€κ°€ κΊΌμ§€λŠ” 것 같은 효과λ₯Ό μ€λ‹ˆλ‹€. 이 p 값이 ꡬ체적으둜 μ–΄λ–»κ²Œ λ³€ν•˜λŠ”μ§€λ₯Ό κ·Έλž˜ν”„λ‘œ 확인해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

κ·Έλž˜ν”„λ‘œ 값을 ν™•μΈν•΄λ³΄λ‹ˆ 3행에 λΉ„ν•΄ 2ν–‰μ˜ κ·Έλž˜ν”„λŠ” μ’€ 더 λΎ°μ‘±ν•˜κ³  쒁은 λͺ¨μ–‘μž…λ‹ˆλ‹€. 2ν–‰μ˜ κ·Έλž˜ν”„μ—μ„œ p 값은 0에 λ¨Έλͺ°λŸ¬ μžˆλŠ” μ‹œκ°„, 즉 κΊΌμ Έ μžˆλŠ” μ‹œκ°„μ΄ μ›λž˜ κ·Έλž˜ν”„λ³΄λ‹€ 훨씬 κΉλ‹ˆλ‹€. λͺ¨λ“  뢈이 λ™μ‹œμ— μΌœμ§€μ§€ μ•Šκ³  있기 λ•Œλ¬Έμ— 베이어 νŒ¨ν„΄μ΄ μ’€ 더 λšœλ ·ν•˜κ²Œ 보이게 λ©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ 각 λ„νŠΈμ˜ 엣지λ₯Ό λ‘₯κΈ€κ²Œ κΉŽμ•„μ£Όκ³  색을 μž…ν˜€μ£ΌλŠ” 뢀뢄이 λ‚¨μ•˜μŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ r μ΄λΌλŠ” 값을 화면에 ν‘œμ‹œν•΄ 보면 각 λ„νŠΈμ˜ κ°€μž₯μžλ¦¬μ— ν•΄λ‹Ήν•˜λŠ” κ°’μ—λ§Œ 뢉은색과 μ΄ˆλ‘μƒ‰μ— ν•΄λ‹Ήν•˜λŠ” x, y 값이 μ‘΄μž¬ν•˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. r 값은 mod κ³„μ‚°μ˜ 결과이기 λ•Œλ¬Έμ— 0.0~1.0일 것이고, μ—¬κΈ°μ„œ 0.5λ₯Ό λΉΌκ³  μ œκ³±μ„ ν•΄μ£ΌκΈ° λ•Œλ¬Έμ— 0.0~0.25 μ‚¬μ΄μ˜ λ²”μœ„λ₯Ό κ°€μ§€λŠ” 값일 κ²ƒμž…λ‹ˆλ‹€.

15행은 μ—¬κΈ°μ„œ r 값을 dot 계산(dot.x * dot.x + dot.y * dot.y)을 ν•΄μ€€ 뒀에 12λ₯Ό κ³±ν•˜κ³ , 1과의 min 값을 찾은 뒀에 그것을 μ œκ³±ν•΄μ£Όκ³  1μ—μ„œ λΊλ‹ˆλ‹€. μ΅œλŒ€κ°’μΈ 0.25λŠ” 이 계산을 거치면 0.25 * 0.25 * 12 = 0.75κ°€ 되고, 여기에 λ‹€μ‹œ μ œκ³±μ„ ν•˜λ©΄ 0.5625κ°€ λ©λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ λ‹€μ‹œ 1μ—μ„œ λΉΌλ©΄ 0.4375κ°€ 될 κ²ƒμž…λ‹ˆλ‹€. 이 값이 μ΅œλŒ€κ°’μ΄μ—ˆκ³ , μ΅œμ†Œκ°’μΈ 0은 이 계산을 거치면 1이 λ©λ‹ˆλ‹€.

말둜 ν‘œν˜„ν•˜λ©΄ λ³΅μž‘ν•˜μ§€λ§Œ 16ν–‰μ˜ 주석을 μ œκ±°ν•˜μ—¬ ν™”λ©΄μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ 무척 κ°„λ‹¨ν•©λ‹ˆλ‹€. 14ν–‰μ—μ„œ 봀던 값이 λΆ€λ“œλŸ½κ²Œ μ—­μœΌλ‘œ κ³„μ‚°λ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. λ„νŠΈμ— ν•΄λ‹Ήν•˜λŠ” 뢀뢄은 λͺ¨λ‘ 흰 색, 즉 1.0에 κ°€κΉŒμš΄ 값이 λ©λ‹ˆλ‹€.

μœ„μ˜ κ·Έλž˜ν”„μ—μ„œλ„ 결과값이 λΆ€λ“œλŸ½κ²Œ κΉŽμ΄λŠ” 엣지가 λ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 값을 p 에 κ³±ν•œ 것이 15ν–‰μ˜ κ³„μ‚°μž…λ‹ˆλ‹€.

17ν–‰μ˜ 주석을 ν•΄μ œν•΄λ³΄λ©΄ 이 값을 p에 κ³±ν–ˆμ„ λ•Œμ˜ κ²°κ³Όλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 18ν–‰μ˜ 주석을 ν•΄μ œν•˜λ©΄ 여기에 ν‘Έλ₯Έμƒ‰ κ³„μ—΄μ˜ μ‘°λͺ…을 μž…νžŒ κ²°κ³Όλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄μƒμœΌλ‘œ μ½”λ“œ 뢄석을 λ§ˆμΉ˜κ² μŠ΅λ‹ˆλ‹€. 였랜만이라 짧은 μ½”λ“œλ₯Ό λ³΄μ—¬λ“œλ ΈλŠ”λ° λ‹€μŒμ—λŠ” μ’€ 더 λ³΅μž‘ν•œ μ½”λ“œλ‘œ λŒμ•„μ˜€λ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€. μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.