GLSL에서 알아두면 좋은 중요한 규칙
1. 🔁 Swizzling (벡터 요소 재조합)
벡터(vec2 ~ vec4)의 구성 요소를 .xyz, .rgba, .stpq 등으로 재조합/추출/복제할 수 있음
→ 위에서 설명한 것처럼 매우 강력한 문법
2. 📐 Type Promotion (암시적 형변환)
GLSL에서는 일부 자동 형변환이 허용됩니다.
예시
vec3 color = vec3(1.0); // vec3(1.0, 1.0, 1.0)
vec3 mixed = vec3(1.0, 0.5, 0.2) * 0.5; // float와 vec3 연산 → OK
- vec * float 은 자동으로 vec * vec 로 확장됩니다.
- int → float 암시적 승격 가능
- 하지만 float → int는 명시적 캐스팅이 필요합니다: int(f)
3. 🧱 Constructor Overloading (다양한 방식의 벡터 생성)
vec3 a = vec3(1.0); // vec3(1.0, 1.0, 1.0)
vec3 b = vec3(1.0, 2.0, 3.0); // 각각 지정
vec3 c = vec3(vec2(1.0, 2.0), 3.0); // 혼합 지정
- 대부분의 GLSL 타입은 다양한 방식으로 생성 가능
- vec4(vec2, float, float), vec4(vec3, float) 등도 가능
4. 🧪 Dot/Multiply/Normalize는 오버로드 가능
dot(vec3, vec3) // 내적
cross(vec3, vec3) // 외적
normalize(vec3) // 단위 벡터
- 타입별로 오버로드되어 있음
- 같은 이름의 함수가 vec2, vec3, vec4에 자동 적용됨
5. 💥 배열은 고정 크기 선언 필수
float arr[3]; // OK
arr[0] = 1.0;
arr[3] = 4.0; // ❌ 런타임 이상 (범위 초과)
- 동적 배열 사용 불가 (WebGL1에서는 특히 제한적)
- length() 메서드 없음. 고정 크기만 알고 있어야 함
6. 🧬 Attribute, Varying, Uniform
GLSL에는 데이터 전달을 위한 특별한 예약어가 존재합니다.
키워드 목적 흐름
| attribute | 정점 데이터 입력 | CPU → Vertex Shader |
| uniform | 정적 전역 값 | CPU → 모든 Shader |
| varying | 정점 → 프래그먼트 전파용 | Vertex Shader → Fragment Shader |
GLSL 1.x에서는 위 3가지 사용
GLSL 3.0 이상에서는 in, out 키워드로 대체됨
7. 📉 Precision 설정 필수 (WebGL1)
precision mediump float;
- WebGL1에서는 반드시 정밀도 명시 필요 (lowp, mediump, highp)
- 주로 float에만 필요함
8. 🔀 조건문은 항상 if (조건)만
if (x > 0.5) {
...
} else {
...
}
- switch 문 없음 (WebGL1)
- 반복문 for, while은 지원하지만 너무 복잡하면 최적화 대상에서 제외될 수 있음
9. 🔗 main() 함수만 존재 (글로벌 코드 불가)
void main() {
...
}
- 진입점은 반드시 main() 함수
- main() 외부에서 바로 실행되는 전역 코드는 불가능
- 그러나 uniform, varying, const 등 선언은 가능
10. ⚠️ 함수는 미리 선언되어 있어야 함
float foo(float x); // 함수 선언
void main() {
float y = foo(1.0);
}
float foo(float x) {
return x * x;
}
- 함수는 main() 위쪽에 선언하거나 선언만 먼저 해둬야 함
기타 알아두면 좋은 요소
| const | 컴파일 타임 상수 |
| discard | 프래그먼트 무시 (알파, 투명도 마스크 등에서 사용) |
| mod(a, b) | 나머지 계산 (a % b와 동일) |
| mix(a, b, t) | 선형 보간 (a * (1 - t) + b * t) |
| step(edge, x) | x < edge → 0, x ≥ edge → 1 |
| smoothstep(edge0, edge1, x) | 부드러운 전환 |
| fract(x) | 소수점 이하만 추출 |
| clamp(x, min, max) | 값 제한 |
📦 요약 정리
분류 | 대표 문법/규칙 | 설명
| Swizzling | .xyz, .rgba | 벡터 요소 재조합 |
| Type Promotion | vec3 * float | float 자동 승격 |
| Precision | precision mediump float; | WebGL 필수 |
| Varying/Uniform | uniform mat4, varying vec2 | 데이터 전달 |
| No global execution | main() 함수 내만 실행 가능 | 글로벌 코드 불가 |
| 함수 선언 | 반드시 먼저 선언 또는 정의 | 호이스팅 없음 |
| 특수 함수 | mix, step, mod, clamp 등 | 그래픽 수학 함수 다수 존재 |
'Graphic > GLSL' 카테고리의 다른 글
| GLSL 내장 함수 정리 (5) | 2025.08.02 |
|---|---|
| WebGL (3) | 2025.05.26 |