Vulkan에서는 셰이더가 GPU 자원(버퍼, 이미지 등)에 직접 접근할 수 없습니다.
대신 셰이더는 “나는 여기 버퍼가 필요해” 라는 자리표(slot) 만 선언해 두고, 실제로 어떤 자원이 연결될지는 애플리케이션이 준비해서 넘겨줘야 합니다.
이때 등장하는 개념이 디스크립터(Descriptor) 와 디스크립터 셋(Descriptor Set) 입니다.
Descriptor (디스크립터)
→ 버퍼나 이미지 같은 GPU 자원을 참조하기 위한 정보(예: 메모리 주소, 이미지 뷰).
Descriptor Set (디스크립터 셋)
→ 여러 디스크립터들을 하나로 묶은 패키지.
→ 셰이더 입장에서는 “내가 필요로 하는 데이터 묶음”을 한 번에 받는 것.
Descriptor Set Layout (디스크립터 셋 레이아웃)
→ 셰이더가 요구하는 자원 구조를 정의한 설계도.
→ 어떤 슬롯에 어떤 타입의 자원이 들어올 수 있는지를 규정.
// set = 0, binding = 0 슬롯에 버퍼가 필요하다!
layout(set = 0, binding = 0) buffer Data {
float values[];
};
Vulkan 코드에서 이 슬롯이 “스토리지 버퍼”임을 명시.
실제 GPU 버퍼를 슬롯에 연결.
(예: 입력 데이터 버퍼, 결과 저장 버퍼)
vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_COMPUTE,
pipelineLayout, 0, 1, &descriptorSet, 0, nullptr);
→ 실행 시점에 셰이더와 실제 자원이 이어집니다.