z Indirect Command Buffer :: C++, 그래픽 기술 블로그

Overview

Indirect Command Buffer은 인코딩된 GPU 명령들을 지속적으로 저장하기에, 이를 활용하면 명령을 한 번 인코딩하고 여러 번 재사용할 수 있습니다. CPU의 여러 스레드와 GPU의 컴퓨팅 커널을 사용하여 명령을 Indirect Command Buffer로 동시에 인코딩할 수도 있습니다. 즉, 다음과 같이 시작할 때 모델을 불러오고 나서, 이후에 렌더 패스를 생성하고 해당하는 명령을 생성하여 집어 넣는 식으로 drawing 작업이 수행되었습니다.

 

 

렌더 패스 당 명령을 생성하는 것 대신, 명령들의 리스트를 포함한 indirect command buffer를 생성하여 명령을 관련된 자원들 및 그리는 방법을 설정하고, 렌더 루프 동안, 이를 실행시켜 인코더가 한번의 명령으로 명령의 집합을 실행할 수 있도록 합니다.

 

 명령을 하나씩 하나씩 실행시킨 경우, CPU와 GPU 사이의 데이터 전송이 발생하여 이에 의한 정지 및 오버헤드가 발생합니다. 

indirect command를 사용한다면, CPU는 한번에 다수의 명령을 인코딩하여, GPU가 모든 패스를 수행한 뒤 CPU로 돌아오게 됩니다.

 

이를 위해서는 다음과 같은 순서로 작업이 수행되어야 합니다.

  1. 버퍼에 uniform 데이터를 전부 배치 시킵니다. indirect command는 프로그램이 시작될 때 buffer를 가리키고 있어, GPU에 임시 바이트를 보낼 수 없습니다.
  2. indirect command buffer를 설정하여, draw command에 사용합니다
  3. 모델에서 indirect command buffer에 indirect command를 설정합니다
  4. render loop를 정리하고 GPU에 indirect command에서 참조하는 자원들을 보냅니다.
  5. 모델 상수의 배열을 변경합니다
  6. command list를 실행합니다.

GPU-Driven Rendering

위의 과정이 CPU에서 수행하는 과정으로 command list를 설정하고 이를 렌더링 하였습니다. 하지만 이는 GPU에서 더 나은 방식으로 수행 가능합니다. CPU에서는 for문을 이용하여 순차적으로 사용하였지만, GPU에서는 병렬적으로 수행 가능합니다. 프로그램이 시작한 직후 render loop를 설정하는 것은 보이지 않는 물체도 렌더링하는 등의 비효율적인 부분이 많습니다. 따라서 command list를 상황에 맞게 유동적으로 GPU에서 빠르게 생성한다면 더 효과적으로 운용가능합니다.

 

이는 다음과 같은 단계를 밟습니다

  1. 커널 함수 생성
  2. compute pipeline state object 설정
  3. kernel function을 위한 argument buffer 설정
  4. draw argument 설정
  5. compute command encoder 완료

 

+ Recent posts