모든 함수는 WebGL 1.0 / GLSL ES 1.0 기준으로, Three.js 또는 RawShaderMaterial에서 사용할 수 있는 범위로 제한
GLSL 내장 함수 정리
기본 전제
- GLSL은 벡터 기반 수학 언어입니다.
- 대부분의 함수는 float, vec2, vec3, vec4에 대해 오버로드(overload)되어 있습니다.
- 각 함수는 GPU 병렬 연산에 최적화되어 있습니다.
1. 산술 함수 (Arithmetic)
| abs(x) | 절댓값 | abs(-3.2) → 3.2 |
| sign(x) | 부호 반환 (-1, 0, 1) | sign(-5.0) → -1.0 |
| floor(x) | 내림 | floor(1.9) → 1.0 |
| ceil(x) | 올림 | ceil(1.2) → 2.0 |
| fract(x) | 소수점 이하만 반환 | fract(3.75) → 0.75 |
| mod(x, y) | 나머지 계산 | mod(5.3, 2.0) → 1.3 |
| min(x, y) | 최소값 | min(3.0, 4.0) → 3.0 |
| max(x, y) | 최대값 | max(3.0, 4.0) → 4.0 |
| clamp(x, min, max) | 값 제한 | clamp(5.0, 0.0, 1.0) → 1.0 |
| mix(x, y, a) | 선형 보간 (Lerp) | mix(0.0, 10.0, 0.3) → 3.0 |
| step(edge, x) | 계단 함수 | step(0.5, 0.7) → 1.0, step(0.5, 0.2) → 0.0 |
| smoothstep(edge0, edge1, x) | 부드러운 step | smoothstep(0.0, 1.0, 0.5) → 0.5 |
2. 삼각 함수 (Trigonometry)
| radians(deg) | 도 → 라디안 |
| degrees(rad) | 라디안 → 도 |
| sin(x) | 사인 |
| cos(x) | 코사인 |
| tan(x) | 탄젠트 |
| asin(x) | 역사인 |
| acos(x) | 역코사인 |
| atan(y, x) | 방향 각도 (벡터 좌표 기준) |
⚠️ atan(y, x)은 2개 인자일 때, atan2와 동일합니다.
결과는 [-π, π] 범위입니다.
3. 지수/로그 함수 (Exponential & Logarithmic)
| pow(x, y) | x의 y승 |
| exp(x) | e^x |
| log(x) | 자연로그 (ln x) |
| exp2(x) | 2^x |
| log2(x) | log₂(x) |
| sqrt(x) | 제곱근 |
| inversesqrt(x) | 1 / sqrt(x) |
4. 벡터/기하 함수 (Vector Math)
| length(v) | 벡터의 길이 |
| distance(p1, p2) | 두 점 사이 거리 |
| dot(v1, v2) | 내적 |
| cross(v1, v2) | 외적 (vec3만 해당) |
| normalize(v) | 단위 벡터 반환 |
| faceforward(n, i, ng) | 반대 방향으로 벡터 뒤집기 |
| reflect(I, N) | 반사 벡터 계산 |
| refract(I, N, eta) | 굴절 벡터 계산 |
reflect와 refract는 주로 빛/물 표면 표현에 사용됩니다.
5. 불규칙 함수 (Noise는 없음)
GLSL ES 1.0 (WebGL1 기준)에는 noise 내장 함수가 정식 지원되지 않습니다.
→ 보통 셰이더 코드로 직접 구현하거나 noise.glsl 같은 유틸 코드를 사용합니다.
GLSL 내장 함수 응용 사례
실제 게임 및 이펙트 제작에서 자주 활용되는 예시 위주로 구성
1. mix() – 색상 보간 (Lerp)
용도:
- 두 색상 사이를 부드럽게 전환 (fade-in/out, 부드러운 색 변화)
예시:
vec3 startColor = vec3(1.0, 0.0, 0.0); // 빨강
vec3 endColor = vec3(0.0, 0.0, 1.0); // 파랑
float progress = clamp(time * 0.1, 0.0, 1.0); // 0~1로 제한
vec3 finalColor = mix(startColor, endColor, progress);
gl_FragColor = vec4(finalColor, 1.0);
실제 사용 예:
- HP 감소 시 점점 붉게
- 하늘 색상 일몰 표현
2. step() + smoothstep() – 엣지/단계 효과
용도:
- 셀 셰이딩, 윤곽선 추출, 부드러운 마스크 표현
예시:
float edge = 0.5;
float sharpEdge = step(edge, vValue); // 딱 끊기는 경계
float softEdge = smoothstep(edge - 0.05, edge + 0.05, vValue); // 부드러운 경계
실제 사용 예:
- 셀 애니메이션 셰이딩
- 마스킹 애니메이션
- 그림자 흐림 표현
3. fract() + sin() – 파동/움직이는 텍스처
용도:
- 시간 기반 애니메이션
- 노이즈처럼 불규칙한 흐름 표현
예시:
float wave = sin(uv.x * 10.0 + time) * 0.5 + 0.5;
vec3 color = mix(colorA, colorB, wave);
gl_FragColor = vec4(color, 1.0);
실제 사용 예:
- 물결 효과
- 사이버펑크 UI 흐름
- UV 애니메이션
4. dot() – 조명 계산의 핵심
용도:
- Lambertian 조명 모델 구현 (diffuse lighting)
예시:
vec3 lightDir = normalize(vec3(1.0, 1.0, 0.5));
float diff = max(dot(normal, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
실제 사용 예:
- 기본적인 조명
- Toon 셰이딩 경계 판별
5. reflect() – 반사 표현
용도:
- 금속/거울/물 표면 구현
예시:
vec3 viewDir = normalize(cameraPosition - fragPosition);
vec3 reflectDir = reflect(-viewDir, normal);
실제 사용 예:
- 동적 환경 맵 (CubeCamera)
- 미러 씬
- 금속 효과
6. refract() – 굴절 표현
용도:
- 물 속, 유리, 렌즈 효과
예시:
vec3 refractDir = refract(viewDir, normal, 1.0 / 1.33); // 공기 → 물
실제 사용 예:
- 물 아래에서 보는 왜곡
- 유리 통과 시 이미지 왜곡
- 돋보기 효과
7. mod() – 반복되는 패턴 만들기
용도:
- 격자, 체크무늬, 반복되는 텍스처
- 타일링 (tiling)
예시:
vec2 tileUV = mod(vUv * 10.0, 1.0);
vec3 tileColor = texture2D(uTexture, tileUV).rgb;
실제 사용 예:
- 타일 맵 패턴
- UI 장식
- 무한 배경 반복
흔한 조합
// 애니메이션 UV 움직임
vec2 offsetUv = vUv + vec2(time * 0.1, 0.0);
// 셀 셰이딩 그림자
float lightStrength = dot(normal, lightDir);
float toonStep = step(0.5, lightStrength);
// 혼합 색상
vec3 color = mix(darkColor, lightColor, toonStep);
'Graphic > GLSL' 카테고리의 다른 글
| GLSL에서 알아두면 좋은 규칙 (3) | 2025.08.02 |
|---|---|
| WebGL (3) | 2025.05.26 |