본문 바로가기
Graphic/GLSL

GLSL에서 알아두면 좋은 규칙

by curious week 2025. 8. 2.

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