Learning
레슨 2 / 8·20분

Uniform과 좌표

Uniform 변수 — 외부 데이터 전달

Uniform은 JavaScript(CPU)에서 셰이더(GPU)로 값을 전달하는 변수입니다. 모든 픽셀이 동일한 uniform 값을 공유합니다. u_time(경과 시간), u_resolution(화면 크기), u_mouse(마우스 위치) 등을 전달하여 동적이고 인터랙티브한 셰이더를 만들 수 있습니다. 좌표를 정규화하면 화면 크기에 무관하게 0~1 범위에서 작업할 수 있습니다.

glsl
precision mediump float;

// ── Uniform 선언 — CPU에서 전달받는 값 ──
uniform float u_time;       // 경과 시간 (초)
uniform vec2 u_resolution;  // 캔버스 크기 (width, height)
uniform vec2 u_mouse;       // 마우스 위치 (x, y)

void main() {
  // ── 좌표 정규화 — 0.0 ~ 1.0 범위로 변환 ──
  vec2 st = gl_FragCoord.xy / u_resolution;
  // st.x: 0(왼쪽) ~ 1(오른쪽)
  // st.y: 0(아래) ~ 1(위)

  // 정규화된 좌표로 그라데이션
  vec3 color = vec3(st.x, st.y, 0.5);
  gl_FragColor = vec4(color, 1.0);
}
glsl
precision mediump float;

uniform float u_time;
uniform vec2 u_resolution;
uniform vec2 u_mouse;

void main() {
  vec2 st = gl_FragCoord.xy / u_resolution;

  // ── 시간에 따른 색상 변화 ──
  float r = sin(u_time) * 0.5 + 0.5;        // 0~1 사이 진동
  float g = sin(u_time + 2.094) * 0.5 + 0.5; // 120도 위상차
  float b = sin(u_time + 4.189) * 0.5 + 0.5; // 240도 위상차

  vec3 bgColor = vec3(r * st.x, g * st.y, b);

  // ── 마우스 위치 활용 ──
  vec2 mouseNorm = u_mouse / u_resolution; // 마우스도 정규화
  float dist = distance(st, mouseNorm);     // 픽셀~마우스 거리

  // 마우스 주변에 빛나는 원
  float glow = 0.05 / dist;
  vec3 glowColor = vec3(1.0, 0.8, 0.3) * glow;

  // 색상 혼합
  vec3 finalColor = bgColor + glowColor;
  gl_FragColor = vec4(finalColor, 1.0);
}
javascript
// JavaScript에서 Uniform 값 전달하기 (WebGL)
const gl = canvas.getContext('webgl');

// uniform 위치 가져오기
const uTime = gl.getUniformLocation(program, 'u_time');
const uResolution = gl.getUniformLocation(program, 'u_resolution');
const uMouse = gl.getUniformLocation(program, 'u_mouse');

// 렌더 루프에서 매 프레임 업데이트
function render(time) {
  gl.uniform1f(uTime, time * 0.001); // 밀리초 → 초
  gl.uniform2f(uResolution, canvas.width, canvas.height);
  gl.uniform2f(uMouse, mouseX, canvas.height - mouseY); // y축 반전

  gl.drawArrays(gl.TRIANGLES, 0, 6);
  requestAnimationFrame(render);
}
  • uniform float u_time — 시간 기반 애니메이션의 핵심
  • uniform vec2 u_resolution — 화면 크기, 좌표 정규화에 사용
  • uniform vec2 u_mouse — 마우스 인터랙션 구현
  • st = gl_FragCoord.xy / u_resolution — 0~1 정규화 좌표
  • distance(a, b) — 두 점 사이 거리 계산
  • sin(u_time) * 0.5 + 0.5 — -1~1을 0~1 범위로 변환하는 패턴
💡

좌표를 정규화(0~1)하면 해상도와 무관하게 동일한 결과를 얻습니다. 또한 중앙 기준 좌표가 필요하면 st = (gl_FragCoord.xy - u_resolution * 0.5) / u_resolution.y 처럼 변환하여 종횡비를 보정할 수 있습니다.