Compute PipeLine의 자원 접근

열수철·2025년 9월 16일

1. 왜 디스크립터가 필요할까?

Vulkan에서는 셰이더가 GPU 자원(버퍼, 이미지 등)에 직접 접근할 수 없습니다.
대신 셰이더는 “나는 여기 버퍼가 필요해” 라는 자리표(slot) 만 선언해 두고, 실제로 어떤 자원이 연결될지는 애플리케이션이 준비해서 넘겨줘야 합니다.

이때 등장하는 개념이 디스크립터(Descriptor)디스크립터 셋(Descriptor Set) 입니다.


2. 기본 용어 정리

  • Descriptor (디스크립터)
    → 버퍼나 이미지 같은 GPU 자원을 참조하기 위한 정보(예: 메모리 주소, 이미지 뷰).

  • Descriptor Set (디스크립터 셋)
    → 여러 디스크립터들을 하나로 묶은 패키지.
    → 셰이더 입장에서는 “내가 필요로 하는 데이터 묶음”을 한 번에 받는 것.

  • Descriptor Set Layout (디스크립터 셋 레이아웃)
    → 셰이더가 요구하는 자원 구조를 정의한 설계도.
    → 어떤 슬롯에 어떤 타입의 자원이 들어올 수 있는지를 규정.


3. 동작 흐름

(1) 셰이더 코드에서 슬롯 선언

// set = 0, binding = 0 슬롯에 버퍼가 필요하다!
layout(set = 0, binding = 0) buffer Data {
    float values[];
};

(2) 디스크립터 셋 레이아웃 생성

Vulkan 코드에서 이 슬롯이 “스토리지 버퍼”임을 명시.

(3) 디스크립터 셋 할당 및 업데이트

실제 GPU 버퍼를 슬롯에 연결.
(예: 입력 데이터 버퍼, 결과 저장 버퍼)

(4) 커맨드 버퍼에서 바인딩

vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_COMPUTE,
                        pipelineLayout, 0, 1, &descriptorSet, 0, nullptr);

→ 실행 시점에 셰이더와 실제 자원이 이어집니다.


4. 비유로 이해하기

  • 셰이더 = 멀티탭(콘센트 구멍)
  • 디스크립터 셋 레이아웃 = 멀티탭 구멍 배치 설계도
  • 디스크립터 셋 = 실제 전자기기를 멀티탭에 꽂아둔 상태
  • 바인딩 = 전원 스위치를 켜서 전기가 흐르도록 만드는 과정

5. 요약

  • 셰이더는 직접 자원 접근 불가.
  • 대신 Slot(셰이더 선언)Layout(설계도)Set(실제 자원) 구조를 통해 접근.
  • 실행 전에 모든 자원을 올바르게 연결해 두어야 GPU가 제대로 동작.

profile
그래픽스, 수학, 물리, 게임 만세

0개의 댓글