레슨 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 처럼 변환하여 종횡비를 보정할 수 있습니다.