Search

[TIL] shader glsl from scratch

subtitle
Tags
webGL
threejs
Created
2025/03/24
2 more properties

Z-buffering

โ€ข
Z-buffer๋Š” ํ™”๋ฉด์˜ ๊ฐ ์ (pixel)์ด ์–ผ๋งˆ๋‚˜ ์นด๋ฉ”๋ผ์—์„œ ๋ฉ€๋ฆฌ ์žˆ๋Š”์ง€๋ฅผ ์ €์žฅํ•˜๋Š” ํ‘œ
โ€ข
์ด๊ฑธ ์ด์šฉํ•ด์„œ ๋” ๊ฐ€๊นŒ์šด ๋ฌผ์ฒด๋งŒ ๋ณด์ด๊ฒŒ ํ•˜๊ณ , ๋’ค์— ์žˆ๋Š” ๊ฑด ๊ฐ€๋ฆผ
โ€ข
์ปดํ“จํ„ฐ๊ฐ€ ๋ฌผ์ฒด๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋ ค๊ณ  ํ•  ๋•Œ, ๊ทธ ๋ฌผ์ฒด์˜ ํ”ฝ์…€์ด ํ™”๋ฉด์˜ ์–ด๋””์— ์œ„์น˜ํ• ์ง€๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๊ทธ ํ”ฝ์…€์˜ Z๊ฐ’(๊นŠ์ด)์„ ํ™•์ธ โ†’ ๋งŒ์•ฝ ๊ทธ ํ”ฝ์…€์ด ๋” ์•ž์— ์žˆ๋‹ค๋ฉด, ๊ธฐ์กด ๊ฒƒ์„ ๋ฎ์–ด์“ฐ๊ณ  Z-buffer๋„ ์—…๋ฐ์ดํŠธ. ๋งŒ์•ฝ ๋’ค์— ์žˆ๋‹ค๋ฉด, ๋ฌด์‹œํ•˜๊ณ  ์›๋ž˜ ์žˆ๋˜ ๊ฑธ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค.

semicolon

โ€ข
glsl ๊ฐœ๋ฐœํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์„ธ๋ฏธ์ฝœ๋ก ์„ ์žŠ์ง€ ๋ง ๊ฒƒ.

vec: ivec, bvec

โ€ข
ivec: int vector
โ€ข
bvec: bool vector

vertext shader, fragment shader

โ€ข
void๋ฅผ returnํ•˜๋Š” main function์ด ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•ด์•ผ ํ•จ
โ€ข
vertex shader๋Š” gl_Position์— ๊ฐ’์„, fragment shader๋Š” gl_FragColor, gl_FragCoord์— ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

uniforms

โ€ข
uniforms๋ฅผ ํ†ตํ•ด javascript์—์„œ ๋งŒ๋“  ๊ฐ’์„ shader์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
const uniforms = { u_time: { value: 0.0 }, u_mouse: { value: { x: 0.0, y: 0.0 } }, u_resolution: { value: { x: 0.0, y: 0.0 } }, u_color: { value: new THREE.Color(0, 1, 1) }, }; const material = new THREE.ShaderMaterial({ uniforms, vertexShader: vshader, fragmentShader: fshader, });
JavaScript
๋ณต์‚ฌ

sin, cos

โ€ข
-1 ~ 1 ์‚ฌ์ด์˜ ๊ฐ’ ๋ฐ˜ํ™˜
โ€ข
(sin(u_time) + 1.0)/2: ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ sin(u_time)์€ -1 ~ 1 ์‚ฌ์ด์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜. -1์ด color์˜ rgba ๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋˜๋ฏ€๋กœ ์ด ๊ฒฝ์šฐ์—๋Š” + 1์„ ํ•ด์ค€๋‹ค. ๋ฐ˜๋Œ€๋กœ sin(u_time)์ด 1์ผ ๋•Œ๋Š” 1์„ ์ดˆ๊ณผํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ 2๋กœ ๋‚˜๋ˆ ์ค€๋‹ค.

mix

โ€ข
์„ ํ˜• ๋ณด๊ฐ„ ํ•จ์ˆ˜
โ€ข
float x, y, a: 3๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๋Š”๋‹ค.
โ€ข
(x, y, 0) = x
โ€ข
(x, y, 1) = y
โ€ข
x * (1-a) + y * a

varying

โ€ข
varying: vertex shader โ†’ fragment shader๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์— ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ
โ€ข
vec2 uv: (0~1, 0~1):varying vec2 v_uv
โ€ข
vec3 position: (-1~1, -1~1, -1~1)

clamp

โ€ข
n, min, max 3๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ: clamp(n, min, max)
โ€ข
x ๊ฐ’์ด minVal๋ณด๋‹ค ์ž‘์œผ๋ฉด โ†’ minVal์„ ๋ฐ˜ํ™˜
โ€ข
x ๊ฐ’์ด maxVal๋ณด๋‹ค ํฌ๋ฉด โ†’ maxVal์„ ๋ฐ˜ํ™˜
โ€ข
๊ทธ ์‚ฌ์ด๋ฉด โ†’ x ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
clamp(n, 1, 5) - n=0) 1 - n=6) 5 - n=3) 3
JavaScript
๋ณต์‚ฌ
โ€ข
์–ด๋–ค ๊ฐ’์„ "์ตœ์†Œ~์ตœ๋Œ€ ๋ฒ”์œ„ ์•ˆ"์œผ๋กœ ๋งž์ถฐ์ฃผ๋Š” ํ•จ์ˆ˜
โ€ข
์–ธ์ œ ์“ฐ๋Š”๊ฐ€
โ—ฆ
์ƒ‰์ƒ ๊ฐ’์„ 0~1 ์‚ฌ์ด๋กœ ์ œํ•œํ•  ๋•Œ โ†’ clamp(color, 0.0, 1.0)
โ—ฆ
๋ฌผ์ฒด๊ฐ€ ํ™”๋ฉด ๋ฐ–์œผ๋กœ ์•ˆ ๋‚˜๊ฐ€๊ฒŒ ํ•  ๋•Œ
โ—ฆ
๋ฐ๊ธฐ, ์Œ์˜, ๊ฑฐ๋ฆฌ ๋“ฑ์„ ์ •ํ•ด์ง„ ๋ฒ”์œ„ ๋‚ด๋กœ ์กฐ์ •ํ•  ๋•Œ

step

โ€ข
step(edge, n) : 0 ๋˜๋Š” 1 ๋ฐ˜ํ™˜
โ€ข
๊ฐ’ n์ด edge๋ณด๋‹ค ํฌ๋ฉด 1.0, ์ž‘์œผ๋ฉด 0.0์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ„๋‹จ ํ•จ์ˆ˜
๋†€์ด๊ณต์› ์ž…์žฅํ•  ๋•Œ ํ‚ค 140cm ์ด์ƒ์ด๋ฉด ์ž…์žฅ ๊ฐ€๋Šฅ
step(140.0, 130.0) // ๊ฒฐ๊ณผ: 0.0 (์ž…์žฅ ๋ถˆ๊ฐ€) step(140.0, 150.0) // ๊ฒฐ๊ณผ: 1.0 (์ž…์žฅ ๊ฐ€๋Šฅ)
GLSL
๋ณต์‚ฌ
โ€ข
์–ธ์ œ์“ฐ๋Š”๊ฐ€
โ—ฆ
์–ด๋–ค ๊ธฐ์ค€๋ณด๋‹ค ํฌ๋ƒ ์ž‘๋ƒ์— ๋”ฐ๋ผ ์ƒ‰, ํˆฌ๋ช…๋„ ๋“ฑ์„ ๋”ฑ ๋‚˜๋ˆŒ ๋•Œ
โ—ฆ
๋งˆ์Šคํฌ ํšจ๊ณผ ๋งŒ๋“ค ๋•Œ

smoothstep

โ€ข
smoothstep(edge0, edge1, n)
โ€ข
๋ถ€๋“œ๋Ÿฝ๊ฒŒ 0์—์„œ 1๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
ํ•ด๊ฐ€ ์ฒœ์ฒœํžˆ ์ง€๋ฉด์„œ ํ•˜๋Š˜์ด ์–ด๋‘์›Œ์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋ฐ๊ธฐ(0โ†’1)๊ฐ€ ๋ฐ”๋€Œ๋Š” ๋А๋‚Œ
smoothstep(0.0, 1.0, 0.0) // ๊ฒฐ๊ณผ: 0.0 smoothstep(0.0, 1.0, 0.5) // ๊ฒฐ๊ณผ: 0.5 (์ค‘๊ฐ„) smoothstep(0.0, 1.0, 1.0) // ๊ฒฐ๊ณผ: 1.0
GLSL
๋ณต์‚ฌ
โ€ข
n์ด edge0๋ณด๋‹ค ์ž‘์œผ๋ฉด: 0
โ€ข
n์ด edge1๋ณด๋‹ค ํฌ๋ฉด: 1
โ€ข
๊ทธ ์‚ฌ์ด๋ฉด: ๋ถ€๋“œ๋Ÿฝ๊ฒŒ 0 โ†’ 1๋กœ ๋ณ€ํ™”
โ€ข
์–ธ์ œ ์“ฐ๋Š”๊ฐ€
โ—ฆ
๊ทธ๋ผ๋ฐ์ด์…˜ ํšจ๊ณผ
โ—ฆ
๋ถ€๋“œ๋Ÿฌ์šด ํ…Œ๋‘๋ฆฌ
โ—ฆ
์ž์—ฐ์Šค๋Ÿฌ์šด ์ „ํ™˜

length

โ€ข
๋ฒกํ„ฐ(ํ™”์‚ดํ‘œ)์˜ ๊ธธ์ด(๊ฑฐ๋ฆฌ)๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜: length(vec2(x,y))=sqrt(x2+y2)length(vec2(x, y)) = sqrt(x^2 + y^2)
โ€ข
(0, 0)์—์„œ (3, 4)๊นŒ์ง€ ๊ฑธ์–ด๊ฐ€๋ฉด, ๊ฑธ์€ ๊ฑฐ๋ฆฌ = 5 (ํ”ผํƒ€๊ณ ๋ผ์Šค)
โ—ฆ
length(vec2(3.0, 4.0)) // ๊ฒฐ๊ณผ: 5.0
โ€ข
์–ธ์ œ ์“ฐ๋Š”๊ฐ€
โ—ฆ
์–ด๋–ค ์ ์ด ์ค‘์‹ฌ์—์„œ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€ ๊ณ„์‚ฐํ•  ๋•Œ
โ—ฆ
์›ํ˜• ๊ทธ๋ผ๋ฐ์ด์…˜ ๋งŒ๋“ค๊ธฐ
โ—ฆ
๋งˆ์šฐ์Šค ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ˜ ๋ฐ˜์‘ ๋งŒ๋“ค๊ธฐ
์ฑŒ๋ฆฐ์ง€! length๋กœ ๋…ธ๋ž€์ƒ‰ ์› ๋งŒ๋“ค์–ด๋ณด๊ธฐ!

์‰์ด๋”์—์„œ If ๋ฌธ์ด ๋А๋ฆฐ ์ด์œ : ๋ถ„๊ธฐ ๋ฐœ์‚ฐ

rect(custom function)

float rect(vec2 pt, vec2 size, vec2 center) { vec2 p = pt - center; vec2 halfsize = size * 0.5; float horz = step(-halfsize.x, p.x) - step(halfsize.x, p.x); float vert = step(-halfsize.y, p.y) - step(halfsize.y, p.y); return horz * vert; }
GLSL
๋ณต์‚ฌ
โ€ข
yellow square
void main (void) { vec3 color = vec3(1.0,1.0, 0.0) * rect(v_position.xy, vec2(1.0), vec2(0.0)); gl_FragColor = vec4(color, 1.0); }
GLSL
๋ณต์‚ฌ

(cos, sin)

โ€ข
์›์œผ๋กœ ์›€์ง์ด๊ฒŒ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ

mat2

โ€ข
2*2 ํ–‰๋ ฌ ๋ฐ์ดํ„ฐ

fract

โ€ข
1.5 โ†’ 0.5, 6.5 โ†’ 0.5
โ€ข
์ •์ˆ˜๋ฅผ ๋ฒ„๋ฆผ

dot

โ€ข
dot(d, p)๋Š” ํ”ฝ์…€์ด ๋ฐ”๋Š˜(p) ๋ฐฉํ–ฅ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๊ฐ€๊นŒ์ด ์žˆ๋Š”์ง€ ์ธก์ •
โ—ฆ
๋‘ ๋ฒกํ„ฐ d, p๋ฅผ ๋„ฃ์œผ๋ฉด "์–ผ๋งˆ๋‚˜ ๊ฐ™์€ ๋ฐฉํ–ฅ์„ ๋ณด๊ณ  ์žˆ๋Š”์ง€" ์•Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜
dot(a, b) = a.x * b.x + a.y * b.y (+ a.z * b.z ... 3D์ธ ๊ฒฝ์šฐ)
GLSL
๋ณต์‚ฌ
โ€ข
๊ฐ™์€ ๋ฐฉํ–ฅ์ผ ์ˆ˜๋ก ๊ฐ’์ด ์ปค์ง€๊ณ , ๋ฐ˜๋Œ€๋ฐฉํ–ฅ์ผ ์ˆ˜๋ก ๊ฐ’์€ ์ž‘์•„์ง„๋‹ค.
โ€ข
dot(a, b)๋Š” 1 โ†’ ์™„์ „ ๊ฐ™์€ ๋ฐฉํ–ฅ
โ€ข
0 โ†’ 90๋„ (์ˆ˜์ง)
โ€ข
1 โ†’ ์™„์ „ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ