DEV Community

BamgasiJM
BamgasiJM

Posted on

๐Ÿ—๏ธ 1. WebGL2 GLSL ํ•ต์‹ฌ ๋ฌธ๋ฒ•๊ณผ ๊ฐœ๋… ์ •๋ฆฌ

WebGL ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ(HTML/JS)๋Š” ์ด๋ฏธ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์—, ์…ฐ์ด๋” ์ฝ”๋“œ(vert.glsl, frag.glsl) ์ž์ฒด์—์„œ ์•Œ์•„์•ผ ํ•˜๋Š” ๋ฌธ๋ฒ•๊ณผ ๊ฐœ๋…๋งŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ธฐ์ค€ ๋ฒ„์ „์€ WebGL2์—์„œ ์‚ฌ์šฉํ•˜๋Š” GLSL ES 3.00(#version 300 es)์ž…๋‹ˆ๋‹ค.

1. ์…ฐ์ด๋” ํŒŒ์ดํ”„๋ผ์ธ ๊ธฐ๋ณธ ๊ตฌ์กฐ

GPU ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ฒ„ํ…์Šค ์…ฐ์ด๋”๋Š” ์ •์  ๋‹จ์œ„๋กœ, ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋Š” ํ”ฝ์…€ ๋‹จ์œ„๋กœ ๋™์‹œ์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฒ„ํ…์Šค ์…ฐ์ด๋”๊ฐ€ out์œผ๋กœ ๋‚ด๋ณด๋‚ธ ๊ฐ’์€ ๋ž˜์Šคํ„ฐํ™” ๊ณผ์ •์—์„œ ๋ณด๊ฐ„๋˜์–ด ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์˜ in์œผ๋กœ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค.

vert.glsl (๋ฒ„ํ…์Šค ์…ฐ์ด๋”)

#version 300 es
// [ํ•„์ˆ˜ ๊ฐœ๋… 1: in / out]
// in: ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ(JS)์—์„œ ๋ฒ„ํผ๋กœ ๋„˜๊ฒจ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ํ‚ค์›Œ๋“œ (๊ตฌ๋ฒ„์ „์˜ attribute)
in vec2 a_position;

// [ํ•„์ˆ˜ ๊ฐœ๋… 2: varying ๋Œ€์ฒด]
// ๋ฒ„ํ…์Šค ์…ฐ์ด๋”์—์„œ ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธธ ๋•Œ out์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
out vec2 v_uv;

void main() {
    // [ํ•„์ˆ˜ ๊ฐœ๋… 3: gl_Position]
    // ๋ฒ„ํ…์Šค ์…ฐ์ด๋”๋Š” ๋ฐ˜๋“œ์‹œ ์ด ๋‚ด์žฅ ๋ณ€์ˆ˜์— ์ขŒํ‘œ๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    // a_position์€ ๋ณดํ†ต -1.0 ~ 1.0 ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.
    gl_Position = vec4(a_position, 0.0, 1.0);

    // [ํ•„์ˆ˜ ๊ฐœ๋… 4: ๋ฒกํ„ฐ ์—ฐ์‚ฐ๊ณผ ์Šค์œ„์ฆ๋ง(Swizzling)]
    // -1~1 ๋ฒ”์œ„๋ฅผ 0~1 ๋ฒ”์œ„๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋กœ ๋„˜๊น๋‹ˆ๋‹ค.
    // xy, xyz ๋“ฑ ์›ํ•˜๋Š” ์ถ•์„ ๋ฝ‘์•„๋‚ด๋Š” ๋ฌธ๋ฒ•์„ ์Šค์œ„์ฆ๋ง์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
    v_uv = a_position * 0.5 + 0.5;
}
Enter fullscreen mode Exit fullscreen mode

frag.glsl (ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”)

#version 300 es
// [ํ•„์ˆ˜ ๊ฐœ๋… 5: ์ •๋ฐ€๋„ ์„ค์ •]
// WebGL์€ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•ด ์ •๋ฐ€๋„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
precision highp float;

// [ํ•„์ˆ˜ ๊ฐœ๋… 6: uniform]
// JS์—์„œ ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์…ฐ์ด๋” ์ „์ฒด์— ๋™์ผํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์ „์—ญ ๊ฐ’์ž…๋‹ˆ๋‹ค.
uniform float u_time;
uniform vec2 u_resolution;

// ๋ฒ„ํ…์Šค ์…ฐ์ด๋”์—์„œ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. (๊ตฌ๋ฒ„์ „์˜ varying)
in vec2 v_uv;

// [ํ•„์ˆ˜ ๊ฐœ๋… 7: out ๋ณ€์ˆ˜]
// GLSL ES 3.00๋ถ€ํ„ฐ๋Š” gl_FragColor ๋Œ€์‹  ์ง์ ‘ out ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
out vec4 fragColor;

void main() {
    // 1. ์ข…ํšก๋น„(Aspect Ratio) ๋ณด์ •
    vec2 uv = v_uv;
    uv.x *= u_resolution.x / u_resolution.y;

    // 2. ์ค‘์‹ฌ์  ๊ณ„์‚ฐ
    vec2 center = vec2(u_resolution.x / u_resolution.y * 0.5, 0.5);

    // [ํ•„์ˆ˜ ๊ฐœ๋… 8: ๋‚ด์žฅ ์ˆ˜ํ•™ ํ•จ์ˆ˜]
    // distance(A, B): ๋‘ ์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ
    float dist = distance(uv, center);

    // sin()์€ -1.0 ~ 1.0์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ * 0.5 + 0.5๋กœ 0.0 ~ 1.0 ๋ฒ”์œ„๋กœ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค.
    float wave = sin(dist * 15.0 - u_time * 3.0) * 0.5 + 0.5;

    // [ํ•„์ˆ˜ ๊ฐœ๋… 9: vec3 ์ƒ‰์ƒ ํ‘œํ˜„]
    // RGB ๊ฐ ์ฑ„๋„์„ 0.0(์–ด๋‘ ) ~ 1.0(๋ฐ์Œ) ์‹ค์ˆ˜๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    vec3 color1 = vec3(0.1, 0.5, 1.0);
    vec3 color2 = vec3(1.0, 0.2, 0.4);

    // mix(A, B, t): t๊ฐ€ 0.0์ด๋ฉด A, 1.0์ด๋ฉด B, ์ค‘๊ฐ„๊ฐ’์ด๋ฉด ๋ณด๊ฐ„๋œ ์ƒ‰์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    vec3 finalColor = mix(color1, color2, wave);

    // [ํ•„์ˆ˜ ๊ฐœ๋… 10: ์ตœ์ข… ์ถœ๋ ฅ]
    // vec4(R, G, B, Alpha) ํ˜•ํƒœ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    fragColor = vec4(finalColor, 1.0);
}
Enter fullscreen mode Exit fullscreen mode

2. ๋ฐ์ดํ„ฐ ํƒ€์ž…

  • float: ์†Œ์ˆ˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. GLSL์—์„œ๋Š” ์ •์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด์„ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, 1์ด ์•„๋‹ˆ๋ผ 1.0์ฒ˜๋Ÿผ ์†Œ์ˆ˜์ ์„ ๋ช…์‹œํ•ด์•ผ ํƒ€์ž… ๋ถˆ์ผ์น˜ ์—๋Ÿฌ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • int, uint: ์ •์ˆ˜ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ ์ธ๋ฑ์Šค๋‚˜ ๋น„ํŠธ ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋˜๋ฉฐ, float๊ณผ ์ž๋™ ํ˜•๋ณ€ํ™˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ float(i)์ฒ˜๋Ÿผ ๋ช…์‹œ์  ์บ์ŠคํŒ…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • bool: ๋…ผ๋ฆฌ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. if ์กฐ๊ฑด์ด๋‚˜ step() ๊ฐ™์€ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  • vec2, vec3, vec4: float ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋ฌถ์€ ๋ฒกํ„ฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์œ„์น˜, ์ƒ‰์ƒ, UV ์ขŒํ‘œ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • mat2, mat3, mat4: ํ–‰๋ ฌ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์ด๋™, ํšŒ์ „, ํˆฌ์˜ ๋ณ€ํ™˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • sampler2D: ํ…์Šค์ฒ˜ ์œ ๋‹›์„ ์ฐธ์กฐํ•˜๋Š” ํ•ธ๋“ค ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ž์ฒด์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ์ง€ ์•Š๊ณ , texture() ํ•จ์ˆ˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

3. ๋ณ€์ˆ˜ ํ•œ์ •์ž (Qualifier)

  • in: ์™ธ๋ถ€(JS ๋˜๋Š” ์ด์ „ ์Šคํ…Œ์ด์ง€)๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ํ•œ์ •์ž์ž…๋‹ˆ๋‹ค.
  • out: ๋‹ค์Œ ์Šคํ…Œ์ด์ง€(ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋” ๋˜๋Š” ํ”„๋ ˆ์ž„๋ฒ„ํผ)๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ํ•œ์ •์ž์ž…๋‹ˆ๋‹ค.
  • uniform: JS์—์„œ ์…ฐ์ด๋” ์ „์ฒด์— ๋™์ผํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ •์ /ํ”ฝ์…€๋งˆ๋‹ค ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • const: ์ปดํŒŒ์ผ ํƒ€์ž„ ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์˜ ์ƒํ•œ๊ฐ’์ฒ˜๋Ÿผ GPU๊ฐ€ ๋ฏธ๋ฆฌ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฐ’์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • flat: ๋ณด๊ฐ„ ์—†์ด ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ํ•œ์ •์ž์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต ์ •์ˆ˜ํ˜• out/in ๋ณ€์ˆ˜์— ํ•„์ˆ˜๋กœ ๋ถ™์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ •์ˆ˜๋Š” ๋ณด๊ฐ„์ด ์ •์˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

4. ์ž์ฃผ ์“ฐ๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜

ํ•จ์ˆ˜ ์„ค๋ช…
mix(a, b, t) ์„ ํ˜• ๋ณด๊ฐ„. ์ƒ‰์ƒ์ด๋‚˜ ๊ฐ’์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์„ž์„ ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
clamp(x, min, max) x๋ฅผ min~max ๋ฒ”์œ„๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
smoothstep(edge0, edge1, x) ๋ถ€๋“œ๋Ÿฌ์šด S์ž ๋ณด๊ฐ„. ๋งˆ์Šคํ‚น์ด๋‚˜ ๊ฒฝ๊ณ„๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
step(edge, x) x๊ฐ€ edge๋ณด๋‹ค ์ž‘์œผ๋ฉด 0.0, ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด 1.0์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ„๋‹จ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
length(v) ๋ฒกํ„ฐ์˜ ๊ธธ์ด(ํฌ๊ธฐ)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
distance(a, b) ๋‘ ์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
normalize(v) ๋ฒกํ„ฐ๋ฅผ ๊ธธ์ด 1์ธ ๋‹จ์œ„ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
dot(a, b) ๋‚ด์ ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒกํ„ฐ์˜ ๋ฐฉํ–ฅ ์œ ์‚ฌ๋„๋‚˜ ์กฐ๋ช… ๊ณ„์‚ฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
cross(a, b) ์™ธ์ ์ž…๋‹ˆ๋‹ค. ๋ฒ•์„  ๋ฒกํ„ฐ ๊ณ„์‚ฐ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
reflect(I, N), refract(I, N, eta) ๋ฐ˜์‚ฌ/๊ตด์ ˆ ๋ฒกํ„ฐ ๊ณ„์‚ฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
pow(x, y), exp(x), log(x) ์ง€์ˆ˜/๋กœ๊ทธ ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค.
floor(x), ceil(x), fract(x) ๋‚ด๋ฆผ, ์˜ฌ๋ฆผ, ์†Œ์ˆ˜๋ถ€ ์ถ”์ถœ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๋“œ ํŒจํ„ด์ด๋‚˜ ๋ฐ˜๋ณต ํŒจํ„ด์„ ๋งŒ๋“ค ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
mod(x, y) ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ณต(ํƒ€์ผ๋ง) ํŒจํ„ด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
abs(x), sin(x), cos(x) ์ ˆ๋Œ“๊ฐ’, ์‚ผ๊ฐํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

GLSL ES์—๋Š” Perlin/Simplex ๋…ธ์ด์ฆˆ ๊ฐ™์€ ๋…ธ์ด์ฆˆ ํ•จ์ˆ˜๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ธ์ด์ฆˆ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•ด์‹œ ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜์˜ ์ปค์Šคํ…€ ๊ตฌํ˜„์„ ์…ฐ์ด๋” ์ฝ”๋“œ์— ์ง์ ‘ ํฌํ•จ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

5. ์Šค์œ„์ฆ๋ง (Swizzling)

๋ฒกํ„ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์กฐํ•ฉํ•ด์„œ ์ถ”์ถœํ•˜๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

vec3 v = vec3(1.0, 2.0, 3.0);

v.x;     // 1.0 (์œ„์น˜ ํ‘œ๊ธฐ: xyzw)
v.r;     // 1.0 (์ƒ‰์ƒ ํ‘œ๊ธฐ: rgba, ์˜๋ฏธ๋Š” ๋™์ผ)
v.xy;    // vec2(1.0, 2.0)
v.xyy;   // vec3(1.0, 2.0, 2.0) โ€” ์ž„์˜ ์กฐํ•ฉ ๋ฐ ์ค‘๋ณต ๊ฐ€๋Šฅ
v.xy = vec2(5.0, 6.0); // ์ผ๋ถ€ ์ปดํฌ๋„ŒํŠธ๋งŒ ๋Œ€์ž…(write-swizzle)๋„ ๊ฐ€๋Šฅ
Enter fullscreen mode Exit fullscreen mode

6. ํ…์Šค์ฒ˜ ์ƒ˜ํ”Œ๋ง

GLSL ES 3.00๋ถ€ํ„ฐ ํ…์Šค์ฒ˜๋ฅผ ์ฝ๋Š” ํ•จ์ˆ˜๋Š” texture()๋กœ ํ†ต์ผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฒ„์ „์˜ texture2D()๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

uniform sampler2D u_texture;
in vec2 v_uv;
out vec4 fragColor;

void main() {
    vec4 texColor = texture(u_texture, v_uv);
    fragColor = texColor;
}
Enter fullscreen mode Exit fullscreen mode

7. ๋ถ„๊ธฐ์™€ ๋ฐ˜๋ณต๋ฌธ

if/else, for, while์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, GPU๋Š” SIMD ๋ฐฉ์‹์œผ๋กœ ํ”ฝ์…€์„ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๊ธฐ ๋น„์šฉ์ด CPU๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ทธ๋ฃน ๋‚ด ํ”ฝ์…€๋“ค์ด ๋‹ค๋ฅธ ๋ถ„๊ธฐ๋ฅผ ํƒ€๋ฉด ์–‘์ชฝ ๋ถ„๊ธฐ๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•˜๊ณ  ๊ฒฐ๊ณผ๋งŒ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

for (int i = 0; i < 8; i++) {
    // const ๋˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ ์ˆ˜ ์žˆ๋Š” ์ƒํ•œ๊ฐ’์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
}
Enter fullscreen mode Exit fullscreen mode

๊ฐ€๋Šฅํ•˜๋ฉด if/else ๋Œ€์‹  step(), mix(), smoothstep() ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ๋ถ„๊ธฐ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ์ตœ์ ํ™” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

8. ๋ฐฐ์—ด๊ณผ ๊ตฌ์กฐ์ฒด

// ๋ฐฐ์—ด
float values[4] = float[4](0.1, 0.3, 0.6, 1.0);

// ๊ตฌ์กฐ์ฒด
struct Light {
    vec3 position;
    vec3 color;
};

Light light;
light.position = vec3(0.0, 1.0, 0.0);
Enter fullscreen mode Exit fullscreen mode

9. ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•œ์ •์ž

ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” in(๊ธฐ๋ณธ๊ฐ’, ์ฝ๊ธฐ ์ „์šฉ), out(ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๊ฐ’์„ ์ฑ„์›Œ ๋ฐ˜ํ™˜), inout(์ฝ๊ณ  ์“ฐ๊ธฐ ๋ชจ๋‘ ๊ฐ€๋Šฅ) ํ•œ์ •์ž๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

float square(in float x) {
    return x * x;
}

void getMinMax(in float a, in float b, out float minV, out float maxV) {
    minV = min(a, b);
    maxV = max(a, b);
}
Enter fullscreen mode Exit fullscreen mode

10. discard์™€ ์•ŒํŒŒ ํด๋ฆฌํ•‘

ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋” ๋‚ด์—์„œ ํŠน์ • ํ”ฝ์…€์˜ ์ถœ๋ ฅ์„ ์™„์ „ํžˆ ๋ฒ„๋ฆด ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

void main() {
    float alpha = texture(u_texture, v_uv).a;
    if (alpha < 0.1) {
        discard;
    }
    fragColor = vec4(1.0, 1.0, 1.0, alpha);
}
Enter fullscreen mode Exit fullscreen mode

11. ์ •๋ฐ€๋„(precision) ํ•œ์ •์ž

lowp, mediump, highp ์„ธ ๋‹จ๊ณ„๊ฐ€ ์žˆ์œผ๋ฉฐ, ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋Š” ๊ธฐ๋ณธ ์ •๋ฐ€๋„๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์•„ precision ์ง€์‹œ์–ด๋ฅผ ์ง์ ‘ ์„ ์–ธํ•ด์•ผ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํ…์Šค ์…ฐ์ด๋”๋Š” highp๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žกํ˜€ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ง€๋งŒ, ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

precision highp float;
precision highp int;
Enter fullscreen mode Exit fullscreen mode

๋ชจ๋ฐ”์ผ GPU์—์„œ๋Š” mediump๋งŒ ์‚ฌ์šฉํ•ด๋„ ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ณ , ์„ฑ๋Šฅ ์ตœ์ ํ™” ์‹œ ์ •๋ฐ€๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ๋„ ๊ณ ๋ ค ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

12. Multiple Render Targets์™€ layout(location = ...)

์—ฌ๋Ÿฌ ๊ฐœ์˜ out ๋ณ€์ˆ˜๋ฅผ ๋™์‹œ์— ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„๋ฒ„ํผ ์–ดํƒœ์น˜๋จผํŠธ๋กœ ์ถœ๋ ฅํ•  ๋•Œ๋Š” layout(location = N)์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

layout(location = 0) out vec4 fragColor;
layout(location = 1) out vec4 fragNormal;
Enter fullscreen mode Exit fullscreen mode

๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฒ„ํ…์Šค ์…ฐ์ด๋”์˜ in ๋ณ€์ˆ˜์—๋„ layout(location = 0) in vec2 a_position;์ฒ˜๋Ÿผ attribute ์œ„์น˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

13. ์ž์ฃผ ์“ฐ๋Š” ๋‚ด์žฅ ๋ณ€์ˆ˜

  • gl_Position (๋ฒ„ํ…์Šค ์…ฐ์ด๋”, ํ•„์ˆ˜): ํด๋ฆฝ ๊ณต๊ฐ„ ์ขŒํ‘œ์ž…๋‹ˆ๋‹ค.
  • gl_PointSize (๋ฒ„ํ…์Šค ์…ฐ์ด๋”): gl.POINTS๋กœ ๊ทธ๋ฆด ๋•Œ ์ ์˜ ํ”ฝ์…€ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • gl_FragCoord (ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”): ํ˜„์žฌ ํ”ฝ์…€์˜ ํ™”๋ฉด ์ขŒํ‘œ(xy)์™€ ๊นŠ์ด(z)๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. u_resolution์„ ๋„˜๊ธฐ์ง€ ์•Š๊ณ  ํ™”๋ฉด ์ขŒํ‘œ ๊ธฐ๋ฐ˜ ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • gl_FragDepth (ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”): ๊นŠ์ด ๊ฐ’์„ ์ง์ ‘ ๋ฎ์–ด์“ธ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

14. ์ฐธ๊ณ : ๊ตฌ๋ฒ„์ „(GLSL ES 1.00) ๋ฌธ๋ฒ•๊ณผ์˜ ์ฐจ์ด

GLSL ES 1.00 (WebGL1) GLSL ES 3.00 (WebGL2)
attribute in (๋ฒ„ํ…์Šค ์…ฐ์ด๋”)
varying ๋ฒ„ํ…์Šค: out / ํ”„๋ž˜๊ทธ๋จผํŠธ: in
texture2D(), textureCube() texture()
gl_FragColor ์ง์ ‘ ์„ ์–ธํ•œ out vec4 ๋ณ€์ˆ˜
๋ฒ„์ „ ์ง€์‹œ์–ด ์—†์Œ ๋˜๋Š” #version 100 #version 300 es

๊ธฐ์กด WebGL1 ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•  ๋•Œ๋Š” ์ด ํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์น˜ํ™˜ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

Top comments (0)