사전 디스크립터 세트
개념

디스크립터 세트

gabury1고친 사람 github-actions[bot]

디스크립터 세트는 그래픽 카드에서 도는 프로그램에게 읽을 데이터를 한꺼번에 건네줍니다. 그림과 값 묶음을 하나씩 넘기지 않고 미리 한 벌로 묶어 둡니다. 그리기 직전에는 그 묶음 하나만 끼웁니다. 프로그램은 묶음 안의 번호만 보고 데이터를 찾아 읽습니다.

쉽고 빠른 이해

디스크립터 세트는 셰이더가 읽을 자원 여러 개를 한 묶음으로 건넵니다. 의자를 그린다면 나뭇결 그림과 광택 값이 어디 있는지를 한 세트에 적어 둡니다. 그리기 직전에는 이 세트 하나만 끼웁니다.

자원을 하나씩 꽂으면 물체마다 꽂는 명령이 자원 수만큼 나갑니다. 그래픽 카드 드라이버는 그 명령마다 처리할 일이 있습니다. 물체가 수천 개면 그리기 전 준비가 그만큼 길어집니다.

어떻게 도나:

  1. 몇 번 칸에 어떤 종류의 자원이 오는지 틀을 먼저 정합니다
  2. 그 틀로 세트를 만들고 칸마다 쓸 자원을 적어 넣습니다
  3. 그리기 직전에 세트를 끼우면 셰이더가 칸 번호로 자원을 읽습니다

대가는 미리 챙길 것이 는다는 것입니다. 세트를 담을 공간을 미리 잡아 둬야 합니다. 그래픽 카드가 아직 읽고 있는 세트는 고칠 수 없습니다.

그릴 때마다 바뀌는 작은 값 몇 개에는 안 맞습니다. 그런 값은 그리기 명령에 바로 싣는 편이 가볍습니다.

상세

식당 주방에서는 요리사에게 재료를 하나씩 건네지 않습니다. 한 접시에 들어갈 재료를 칸이 나뉜 쟁반 하나에 담아 올립니다. 요리사는 몇 번 칸에 무엇이 있는지 이미 알고 있어서 쟁반만 받으면 바로 조리를 시작합니다.

이 절은 디스크립터 세트가 무엇을 묶는지, 왜 묶는지, 어떤 순서로 만들어 쓰는지를 봅니다. 의자 하나를 화면에 그리는 장면을 줄곧 예로 씁니다. 끝에서는 다른 그래픽스 API(Application Programming Interface, 응용 프로그램 인터페이스)가 이 묶음을 어떻게 부르는지와 언제 쓰는지를 봅니다.

셰이더가 읽는 자원

GPU(Graphics Processing Unit, 그래픽 처리 장치)는 같은 계산을 동시에 아주 많이 돌리는 칩입니다. 화면의 점 수백만 개의 색을 한꺼번에 정하려고 만들었습니다. 이 칩을 얹은 판을 그래픽 카드라고 부릅니다.

GPU 위에서 도는 작은 프로그램을 셰이더라고 부릅니다. 의자 표면의 점 하나가 어떤 색이 될지 계산하는 코드가 셰이더입니다. 이 코드는 점마다 한 번씩, 수많은 점에서 동시에 돕니다.

셰이더는 계산에 쓸 데이터를 바깥에서 받아 읽습니다. 이 데이터를 자원이라고 부릅니다. 의자를 그리는 셰이더가 읽는 자원은 세 종류입니다.

자원 무엇인가 의자 그리기에서
텍스처 그림 데이터 나뭇결 그림
샘플러 텍스처에서 색을 읽어 오는 규칙 멀리서 볼 때 이웃한 색을 섞어 읽기
버퍼 값을 한 줄로 늘어놓은 메모리 덩어리 광택 값 · 의자의 위치 · 카메라의 위치

표의 자원은 전부 그래픽 카드의 메모리에 올라가 있습니다. 셰이더 코드 안에는 들어 있지 않습니다. 그래서 셰이더에게 이 자원들을 어디서 찾을지 알려 줄 방법이 따로 필요합니다.

자원을 가리키는 디스크립터

디스크립터는 자원 하나를 가리키는 작은 데이터입니다. 자원이 메모리 어디에 있고 어떤 종류인지를 담습니다. 나뭇결 텍스처의 디스크립터에는 「이것은 텍스처이고 메모리의 이 주소에 있다」가 적혀 있습니다.

셰이더는 자원을 직접 들고 있지 않습니다. 셰이더 코드에는 자원 대신 번호만 적힙니다. 그리기 전에 그 번호에 디스크립터를 이어 두면 셰이더는 디스크립터를 거쳐 자원을 찾아갑니다.

번호와 디스크립터를 갈라 둔 덕분에 셰이더 하나로 여러 물체를 그립니다. 의자를 그리고 나서 책상을 그릴 때는 그 번호에 이을 디스크립터만 책상의 것으로 바꿉니다. 셰이더 코드는 바뀌지 않습니다.

디스크립터를 세트로 묶는 까닭

의자 하나를 그리는 데 자원이 다섯 필요합니다. 나뭇결 텍스처, 샘플러, 광택 값 버퍼, 의자 위치 버퍼, 카메라 버퍼입니다. 디스크립터를 하나씩 꽂으면 의자 한 번 그릴 때 꽂는 명령이 다섯 번 나갑니다.

명령을 받는 쪽은 드라이버입니다. 드라이버는 운영체제와 GPU 사이에서 프로그램의 명령을 칩이 알아듣는 꼴로 바꿔 주는 소프트웨어입니다. 드라이버는 꽂는 명령을 받을 때마다 디스크립터를 GPU 가 읽는 꼴로 옮겨 적습니다. 앞서 꽂은 것과 어긋나지 않는지도 따집니다.

물체가 수천 개면 꽂는 명령도 그 다섯 배로 늘어납니다. 이 준비는 GPU 가 아니라 CPU(Central Processing Unit, 중앙 처리 장치)가 합니다. 명령이 늘수록 그리기 전 준비에 CPU 가 오래 붙잡힙니다.

디스크립터 세트는 디스크립터들을 미리 한 벌로 묶어 둡니다. 드라이버가 할 준비도 묶을 때 미리 해 둡니다. 그리기 직전에는 세트를 끼우는 명령 한 번으로 디스크립터 여럿이 셰이더에 이어집니다. 세트를 끼우는 일을 바인딩이라고 부릅니다.

칸 번호와 세트 번호

세트 안은 번호가 붙은 칸으로 나뉩니다. 칸 하나에는 보통 디스크립터가 하나 듭니다. 의자의 재질을 담은 세트라면 0번 칸에 나뭇결 텍스처, 1번 칸에 샘플러, 2번 칸에 광택 값 버퍼의 디스크립터가 듭니다.

칸 번호는 바인딩 번호라고도 부릅니다. 셰이더는 세트를 여러 개 동시에 받을 수 있어서 세트에도 번호가 붙습니다. 셰이더 코드에 적히는 번호는 이 둘, 「몇 번 세트의 몇 번 칸」입니다.

flowchart TD
    S["셰이더 · 1번 세트의 0번 칸을 읽는다"]
    subgraph S0["0번 세트"]
        A0["0번 칸 · 카메라 버퍼 디스크립터"]
    end
    subgraph S1["1번 세트 · 의자의 재질"]
        B0["0번 칸 · 나뭇결 텍스처 디스크립터"]
        B1["1번 칸 · 샘플러 디스크립터"]
        B2["2번 칸 · 광택 값 버퍼 디스크립터"]
    end
    subgraph S2["2번 세트"]
        C0["0번 칸 · 의자 위치 버퍼 디스크립터"]
    end
    S --> B0
    B0 --> T["나뭇결 텍스처 · 그래픽 카드 메모리"]

셰이더 코드에는 맨 아래 나뭇결 텍스처의 이름이 없습니다. 「1번 세트의 0번 칸」이라는 번호 둘만 있습니다. 칸에 든 디스크립터가 번호와 텍스처를 잇습니다.

세트를 왜 셋으로 나눴는지는 아래 「끼우는 빈도로 나눈 세트」에서 봅니다.

틀을 정하는 레이아웃

세트를 만들기 전에 틀부터 정합니다. 몇 번 칸에 어떤 종류의 디스크립터가 몇 개 오는지 적은 틀이 디스크립터 세트 레이아웃입니다. 재질 세트의 틀에는 「0번 칸은 텍스처 하나, 1번 칸은 샘플러 하나, 2번 칸은 버퍼 하나」가 적힙니다.

틀에 적는 것 재질 세트의 0번 칸 재질 세트의 2번 칸
바인딩 번호 0 2
디스크립터 타입 텍스처 읽기 전용 값 버퍼
개수 1 1

표의 둘째 줄처럼 칸마다 정하는 종류를 디스크립터 타입이라고 부릅니다. 텍스처 칸과 버퍼 칸은 드는 디스크립터의 꼴이 달라서 종류를 미리 정해 둡니다.

틀이 같으면 세트를 몇 개든 찍어 냅니다. 의자의 재질 세트와 책상의 재질 세트는 같은 틀로 만든 두 세트입니다. 두 세트는 칸에 든 디스크립터만 다릅니다.

셰이더가 받을 세트들의 틀을 차례로 늘어놓은 목록이 파이프라인 레이아웃입니다. 목록에서 몇 번째에 놓였는지가 곧 세트 번호입니다. 의자 예에서는 카메라 틀, 재질 틀, 물체 틀이 0번, 1번, 2번으로 놓입니다.

파이프라인은 셰이더와 그리기 설정을 그리기 전에 한데 묶어 고정해 둔 객체입니다. 파이프라인 레이아웃은 이 파이프라인을 만들 때 함께 고정됩니다. 그리기 직전에 끼우는 세트는 그 번호의 틀로 만든 것이어야 합니다.

flowchart TD
    P["파이프라인"]
    subgraph PL["파이프라인 레이아웃"]
        L0["0번 · 카메라 틀"]
        L1["1번 · 재질 틀"]
        L2["2번 · 물체 틀"]
        L0 ~~~ L1 ~~~ L2
    end
    P -->|만들 때 고정| PL
    L1 -->|찍어 냄| A["의자 재질 세트"]
    L1 -->|찍어 냄| B["책상 재질 세트"]

그림은 틀 하나에서 세트가 여럿 나오는 모양과, 틀이 목록에 놓인 순번이 세트 번호가 되는 모양을 함께 보입니다. 의자 재질 세트와 책상 재질 세트는 둘 다 1번 틀로 만들었습니다. 그래서 둘 다 1번 세트로만 끼울 수 있습니다.

만들고 채우고 끼우는 순서

세트 하나는 네 단계를 거쳐 그리기에 쓰입니다.

  1. 풀과 틀을 만든다
  2. 풀에서 빈 세트를 할당한다
  3. 칸마다 가리킬 자원을 적어 넣는다
  4. 그리기 직전에 세트를 끼운다

앞의 셋은 세트마다 한 번 합니다. 보통 프로그램이 시작할 때 합니다. 넷째는 그릴 때마다 합니다.

세트는 디스크립터 풀에서 할당합니다. 디스크립터 풀은 세트를 담을 메모리를 미리 크게 잡아 둔 통입니다. 세트마다 메모리를 따로 받으면 느립니다. 통에서 할당하면 빠릅니다.

풀에는 한도가 있습니다. 풀을 만들 때 정한 양을 넘기면 세트를 할당하는 호출이 실패합니다. 그래서 풀을 넉넉히 잡거나, 모자랄 때 풀을 하나 더 만듭니다. 풀을 비우면 거기서 할당한 세트를 모두 돌려받습니다.

풀에 틀을 건네면 그 틀대로 칸이 나뉜 빈 세트가 나옵니다. 빈 칸마다 가리킬 자원을 적어 넣는 일을 세트 갱신이라고 부릅니다. 갱신을 마쳐야 세트를 쓸 수 있습니다.

갱신은 칸이 어느 자원을 가리킬지를 바꾸는 일입니다. 자원 안의 값을 바꾸는 일과는 다릅니다. 카메라가 움직이면 카메라 버퍼에 새 값을 써 넣습니다. 세트의 칸은 여전히 같은 버퍼를 가리키므로 세트는 고치지 않습니다.

GPU 에 보낼 명령은 곧바로 가지 않습니다. 커맨드 버퍼라는 목록에 차례로 적었다가 한 번에 보냅니다. 세트를 끼우는 명령은 이 목록에서 그리기 명령 바로 앞에 적습니다.

sequenceDiagram
    participant 프로그램
    participant 드라이버
    participant GPU
    프로그램->>드라이버: 풀과 틀을 만든다
    프로그램->>드라이버: 풀에서 빈 세트를 할당한다
    프로그램->>드라이버: 칸마다 자원을 적어 넣는다
    Note over 프로그램,드라이버: 여기까지는 세트마다 한 번
    Note over 프로그램: 바뀐 값을 버퍼에 써 넣는다
    Note over 프로그램: 세트 끼우기와 그리기를 커맨드 버퍼에 적는다
    프로그램->>드라이버: 커맨드 버퍼를 보낸다
    드라이버->>GPU: 명령을 차례로 넘긴다
    Note over GPU: 셰이더가 칸 번호로 자원을 읽는다

그림의 위 세 화살표가 준비입니다. 그 아래는 그릴 때마다 되풀이됩니다. 되풀이되는 쪽에서 세트가 차지하는 몫은 끼우는 명령 한 줄뿐입니다. 카메라처럼 값이 바뀌는 자원은 버퍼에 값만 새로 써 넣습니다.

끼우는 빈도로 나눈 세트

물체를 차례로 그리는 동안 셰이더가 읽을 자원이 바뀌는 빈도는 자원마다 다릅니다. 앞의 그림이 세트를 셋으로 나눈 까닭이 이 빈도입니다. 이 소절은 물체 100 개를 그리는 장면으로 나눈 덕을 셈해 봅니다.

화면 한 장을 그려 내는 한 차례를 프레임이라고 부릅니다. 카메라 버퍼는 한 프레임 안의 모든 물체가 같이 읽습니다. 재질은 물체 여럿이 나눠 쓰므로 물체보다 드물게 바뀝니다. 위치 버퍼는 물체마다 다릅니다.

세트 번호 담는 자원 새로 끼우는 때
0 카메라 버퍼 프레임마다 한 번
1 나뭇결 텍스처 · 샘플러 · 광택 값 버퍼 재질이 바뀔 때
2 의자 위치 버퍼 물체마다

세트를 끼우면 그 번호의 세트만 바뀝니다. 나머지 번호에 끼워 둔 세트는 남습니다. 그래서 다음 물체로 넘어갈 때는 2번 세트만 새로 끼웁니다.

같은 재질을 쓰는 물체를 모아 차례로 그리면 1번 세트는 재질 수만큼만 끼웁니다. 물체 100 개가 재질 3 가지를 나눠 쓰면 끼우는 횟수가 아래 번호로 갈수록 늘어납니다.

flowchart TD
    F["프레임 · 0번 세트를 1번 끼움"]
    F --> MA["재질 A · 1번 세트 끼움"]
    F --> MB["재질 B · 1번 세트 끼움"]
    F --> MC["재질 C · 1번 세트 끼움"]
    MA --> OA["재질 A 의 물체들 · 2번 세트를 물체마다 끼움"]
    MB --> OB["재질 B 의 물체들 · 2번 세트를 물체마다 끼움"]
    MC --> OC["재질 C 의 물체들 · 2번 세트를 물체마다 끼움"]

한 프레임에 0번은 1번, 1번은 3번, 2번은 100번 끼웁니다. 이 장면을 세트 하나로 묶을 때와 비교하면 이렇습니다.

나누는 방식 세트 수 디스크립터 수 물체를 넘길 때 새로 잇는 디스크립터
물체마다 다섯 칸짜리 세트 하나 100 500 5
빈도로 세 번호에 나눔 104 110 1

나눈 쪽의 104 는 0번 세트 1 개, 재질 세트 3 개, 물체 세트 100 개를 더한 값입니다. 110 은 그 안의 디스크립터를 1 개, 9 개, 100 개씩 더한 값입니다.

세트 수는 둘이 비슷합니다. 갈리는 것은 겹쳐 적는 양과 물체마다 새로 잇는 양입니다. 하나로 묶으면 같은 카메라와 같은 재질을 물체마다 되풀이해 적습니다. 물체를 넘길 때마다 다섯 칸을 전부 새로 잇게 됩니다.

GPU 가 쓰는 중인 세트

프로그램과 GPU 는 따로 돕니다. 프로그램은 커맨드 버퍼를 보내고 나서 기다리지 않고 다음 프레임을 준비합니다. 그동안 GPU 는 앞 프레임을 아직 그리는 중일 수 있습니다.

이때 GPU 가 읽는 중인 것은 고치면 안 됩니다. 세트의 칸을 갱신하는 것도, 세트가 가리키는 버퍼에 새 값을 써 넣는 것도 그렇습니다. 고치면 화면이 깨지거나 엉뚱한 값이 읽힙니다.

그래서 동시에 처리 중인 프레임 수만큼 자원과 세트를 여러 벌 둡니다. 프레임 둘이 겹쳐 돌면 카메라 버퍼를 둘 두고, 그 버퍼를 하나씩 가리키는 카메라 세트도 둘 둡니다. 버퍼 하나와 그것을 가리키는 세트 하나를 한 벌로 쳐서 A 벌과 B 벌이라 하겠습니다.

두 벌은 프레임마다 번갈아 씁니다. GPU 가 앞 프레임을 다 그렸는지는 펜스 같은 신호로 확인합니다.

sequenceDiagram
    participant 프로그램
    participant A as A 벌
    participant B as B 벌
    participant GPU
    프로그램->>A: 프레임 1 의 카메라 값을 써 넣는다
    프로그램->>GPU: 프레임 1 을 보낸다 · A 벌의 세트를 끼움
    Note over GPU: 프레임 1 을 그리는 중
    프로그램->>B: 프레임 2 의 카메라 값을 써 넣는다
    프로그램->>GPU: 프레임 2 를 보낸다 · B 벌의 세트를 끼움
    GPU-->>프로그램: 펜스 · 프레임 1 을 다 그렸다
    프로그램->>A: 프레임 3 의 카메라 값을 써 넣는다

GPU 가 프레임 1 을 그리는 동안 프로그램은 B 벌에 프레임 2 를 준비합니다. 프레임 3 은 펜스로 프레임 1 이 끝난 것을 확인한 뒤에 A 벌을 다시 씁니다. 두 벌의 세트는 처음 만들 때 한 번 갱신한 뒤로 고치지 않습니다.

그래픽스 API 마다 부르는 이름

프로그램이 GPU 를 다룰 때 부르는 함수 모음을 그래픽스 API 라고 합니다. 그래픽스 API 는 여럿입니다. 자원을 묶어 건네는 방식도 API 마다 조금씩 다릅니다.

디스크립터 세트라는 이름은 Vulkan 이 쓰는 이름입니다. 다른 API 에서는 같은 역할을 하는 묶음을 다른 이름으로 부릅니다.

API 묶음을 부르는 이름 틀을 부르는 이름
Vulkan 디스크립터 세트 디스크립터 세트 레이아웃
WebGPU 바인드 그룹 바인드 그룹 레이아웃
Direct3D 12 디스크립터 테이블 루트 시그니처 안에 적는다
Metal 아규먼트 버퍼 셰이더 코드의 구조체
OpenGL 묶음이 없다 없다

WebGPU 의 바인드 그룹은 한 번 만들면 고칠 수 없습니다. 자원이 바뀌면 바인드 그룹을 새로 만듭니다. Vulkan 의 세트는 GPU 가 쓰고 있지 않을 때 갱신해서 다시 씁니다.

OpenGL 에는 묶음이 없습니다. 번호가 붙은 연결 지점에 자원을 하나씩 꽂습니다. 연결 지점 하나는 세트 없이 따로 떨어진 칸 하나에 해당합니다. 앞의 「디스크립터를 세트로 묶는 까닭」에서 본 하나씩 꽂는 방식이 이것입니다.

Vulkan 코드로 본 모습

이 소절은 의자 예를 코드로 적어 봅니다. 셰이더 쪽에서 세트 번호와 칸 번호를 어떻게 적는지 보고, 프로그램 쪽에서 세트를 어떻게 끼우는지 봅니다.

셰이더는 GLSL(OpenGL Shading Language, OpenGL 셰이딩 언어)로 적었습니다. set 은 세트 번호입니다. binding 은 칸 번호입니다.

glsl
layout(set = 0, binding = 0) uniform Camera {
  mat4 viewProj;
};
layout(set = 1, binding = 0) uniform texture2D woodTex;
layout(set = 1, binding = 1) uniform sampler woodSampler;
layout(set = 1, binding = 2) uniform Material {
  float gloss;
};
layout(set = 2, binding = 0) uniform Object {
  mat4 model;
};

uniform 뒤에 중괄호가 오는 선언은 버퍼 하나를 읽기 전용 값 묶음으로 읽겠다는 뜻입니다. 이렇게 읽는 버퍼를 유니폼 버퍼라고 부릅니다. 한 번 그리는 동안 모든 점이 같은 값을 읽을 때 씁니다.

mat4 는 4×4 행렬입니다. 물체를 옮기고 돌리는 계산에 씁니다. viewProj 는 카메라 버퍼에, model 은 의자 위치 버퍼에 든 행렬입니다.

코드의 세트 번호와 칸 번호는 위 그림의 번호와 같습니다. woodTex 가 1번 세트의 0번 칸, gloss 가 든 버퍼가 1번 세트의 2번 칸입니다.

다음은 물체를 하나 그릴 때마다 프로그램이 커맨드 버퍼에 적는 호출입니다. 함수 이름의 Bind 가 세트를 끼우는 바인딩입니다. 2번 세트 하나만 새로 끼웁니다.

C
vkCmdBindDescriptorSets(cmd,
    VK_PIPELINE_BIND_POINT_GRAPHICS,
    layout,
    2,           // 끼우기 시작할 세트 번호
    1, &objSet,  // 끼울 세트 1 개
    0, NULL);    // 여기선 안 쓰는 인자

cmd 는 명령을 적고 있는 커맨드 버퍼입니다. layout 은 파이프라인 레이아웃입니다. 2번부터 세트 1 개를 끼우므로 2번 세트만 바뀝니다. 앞서 끼워 둔 0번과 1번 세트는 남습니다.

쓸 때와 안 쓸 때

백엔드 개발자가 디스크립터 세트를 손으로 만들 일은 드뭅니다. 게임 엔진이 안쪽에서 대신 만듭니다. 직접 만나게 되는 때는 Vulkan 이나 WebGPU 를 직접 다룰 때입니다.

GPU 로 계산만 돌릴 때도 만납니다. 계산용 셰이더를 묶어 둔 컴퓨트 파이프라인도 버퍼를 같은 방식으로 받습니다. 행렬 두 개를 곱한다면 두 행렬이 든 버퍼와 결과를 받을 버퍼를 세트의 칸에 꽂아 건넵니다.

물체마다 다른 색 값 하나처럼 그릴 때마다 바뀌는 작은 값에는 세트가 안 맞습니다. 세트로 건네려면 그 값을 담을 버퍼와 그 버퍼를 가리키는 세트를 물체마다 따로 둬야 합니다. 값 하나에 비해 준비가 무겁습니다. 이럴 때는 그리기 명령에 값을 바로 싣는 푸시 상수를 씁니다.

물체마다 텍스처가 다른 장면도 세트가 부담이 됩니다. 텍스처 수만큼 세트를 만들고 끼워야 합니다.

이럴 때는 텍스처 전부를 가리키는 디스크립터 배열 하나를 한 칸에 넣습니다. 셰이더는 그 배열에서 번호로 텍스처를 골라 읽습니다. 이 방식을 바인드리스 렌더링이라고 부릅니다. GPU 와 드라이버가 지원해야 쓸 수 있습니다.

flowchart TD
    S["셰이더 · 0번 칸 배열의 1번을 고른다"]
    subgraph SET["세트 · 0번 칸 = 디스크립터 배열"]
        D0["0번 · 텍스처 디스크립터"]
        D1["1번 · 텍스처 디스크립터"]
        DN["나머지 텍스처 디스크립터"]
    end
    S --> D1

앞의 그림에서는 칸 하나에 디스크립터가 하나였습니다. 여기서는 칸 하나에 디스크립터가 배열로 여럿 듭니다. 물체가 바뀌어도 세트는 다시 끼우지 않습니다. 물체마다 고를 번호만 달리 건넵니다.

관련 항목

디스크립터 세트를 이루는 구성 요소

디스크립터 · 디스크립터 타입 · 바인딩 · 디스크립터 세트 레이아웃 · 디스크립터 풀

디스크립터 세트의 칸이 가리키는 자원

자원 · 텍스처 · 이미지 뷰 · 샘플러 · 버퍼 · 유니폼 버퍼 · 스토리지 버퍼 · 스토리지 텍스처

디스크립터 세트를 받아 쓰는 파이프라인 객체

파이프라인 레이아웃 · 파이프라인 · 그래픽스 파이프라인 · 컴퓨트 파이프라인 · 셰이더 · 셰이더 모듈

디스크립터 세트를 끼우고 실어 보내는 명령

커맨드 버퍼 · 드로우 콜 · 디스패치 · 펜스 · 렌더 패스

디스크립터 세트를 다른 그래픽스 API 에서 부르는 이름

바인드 그룹 · 바인드 그룹 레이아웃 · 디스크립터 테이블 · 디스크립터 힙 · 루트 시그니처 · 아규먼트 버퍼

디스크립터 세트를 대신할 수 있는 다른 수단

푸시 상수 · 푸시 디스크립터 · 바인드리스 · 디스크립터 인덱싱 · 텍스처 유닛

디스크립터 세트 번호를 적는 셰이더 언어

GLSL · HLSL · WGSL · MSL · SPIR-V

셰이더에 자원을 건네는 방식을 정한 그래픽스 API

Vulkan · WebGPU · Direct3D · Metal · OpenGL

디스크립터 세트가 속하는 상위 분류

그래픽스 · 렌더링 · GPU · API · 디바이스 드라이버 · 프레임

다른 이름: descriptor set · VkDescriptorSet · 디스크립터 집합