프로그래밍/Graphics

WGSL 기본

Lou Park 2024. 1. 7. 13:15

Shader의 Lifetime

Shader Creation

  • const-expressions에 대한 값을 확정
    • 리터럴
    • @const 함수
    • const 선언 값

Pipeline Creation

  • override-expressions 대한 값을 확정

Shader Execution

  • runtime-expressions에 대한 값을 확정
    • let 선언 값
    • 함수 호출
    • 변수 참조, 포인터
    • 가변 내용

 

WGSL 함수

문법
Rust와 문법과 사용방법이 동일하다.

fn negate(v: vec3f) -> vec3f {
    return -v;
}

 

EntryPoints
@vertex, @fragment, @comute 어노테이션이 붙은 함수는 Shader Entrypoint다.

 

@must_use
@must_use 어노테이션이 붙은 함수는 그 반환값을 사용하지 않으면 컴파일 타임 에러를 뱉는다.

@must_use
fn a() -> i32 {
  return 10;
}

fn b() -> i32 {
  return 10;
}

fn c() {
  let d = a();  // Ok, 반환 값을 사용했음
  b();          // Ok, @must_use 어노테이션이 없으므로 괜찮음

  if a() < 5 {  // Ok, 컨트롤 플로우에서 사용했음

  }

  a();       // 오류! a()의 반환값을 어디에서도 사용하지 않았기 때문에.
}

 

WGSL 타입

Vectors
WGSL은 스칼라 타입에 대한 3종류의 벡터를 지원한다. 몇 개의 요소를 가질 수 있냐에 따라 구분된다.

  • vec2
  • vec3
  • vec4

또한 Alias도 제공한다. N은 요소의 수, S는 타입 (i, u, f)일때 vecNS 형식으로 적는다.

  • vec2i = vec2
  • vec3f = vec3
  • vec4u = vec4

Matrices
f32 요소에 대한 2x2~4x4 행렬을 지원한다.

  • matCxR
    • C: Columns
    • R: Rows
    • T: Type