리소스 선택

리소스는 3D 파이프라인에서 사용하는 데이터의 컬렉션입니다. 리소스를 만들고 리소스의 동작을 정의하는 것이 애플리케이션 프로그래밍의 첫 단계입니다. 이 가이드에서는 애플리케이션에 필요한 리소스를 선택하기 위한 기본 항목에 대해 설명합니다.

리소스가 필요한 파이프라인 단계 식별

첫 번째 단계는 리소스를 사용할 하나 이상의 그래픽 파이프라인 단계를 선택하는 것입니다. 즉, 리소스에서 데이터를 읽을 각 단계와 리소스에 데이터를 쓸 단계를 식별합니다. 리소스가 사용될 파이프라인 단계를 알면 리소스를 단계에 바인딩하기 위해 호출되는 API가 결정됩니다.

다음 표에는 각 파이프라인 단계에 바인딩할 수 있는 리소스 종류가 나와 있습니다. 여기에는 리소스를 입력 또는 출력으로 바인딩할 수 있는지 여부가 포함됩니다.

파이프라인 단계 입/출력 리소스 리소스 종류
입력 어셈블러 In 꼭짓점 버퍼 Buffer
입력 어셈블러 In 인덱스 버퍼 Buffer
셰이더 단계 In 셰이더 리소스 보기 버퍼, Texture1D, Texture2D, Texture3D
셰이더 단계 In 셰이더 상수 버퍼 Buffer
스트림 출력 Out Buffer Buffer
출력 병합기 Out 렌더링 대상 보기 버퍼, Texture1D, Texture2D, Texture3D
출력 병합기 Out 깊이/스텐실 보기 Texture1D, Texture2D

 

각 리소스가 사용되는 방법 식별

애플리케이션에서 사용할 파이프라인 단계와 각 단계에 필요한 리소스가 선택되었으면 다음 단계는 각 리소스를 사용하는 방법, 즉 CPU 또는 GPU에서 리소스에 액세스할 수 있는지 여부를 결정하는 것입니다.

애플리케이션이 실행되는 하드웨어에는 하나 이상의 CPU와 하나의 GPU가 있습니다. 사용할 값을 선택하려면 다음 옵션 중 리소스를 읽거나 써야 하는 프로세서 유형을 고려합니다.

Resource Usage 업데이트 수행 주체 업데이트 빈도
기본값 GPU 드물게
동적 CPU 자주
스테이징 GPU 해당 없음
변경 불가능 CPU(리소스를 만들 때만) 해당 없음

 

CPU에서 자주 업데이트할 필요가 없는(프레임당 1번 미만) 리소스에는 기본 사용을 사용해야 합니다. 성능 저하를 방지하려면 CPU에서 기본 사용의 리소스에 직접 쓰지 않는 것이 가장 좋습니다.

CPU에서 상대적으로 자주 업데이트(프레임당 1번 이상)하는 리소스에는 동적 사용을 사용해야 합니다. 일반적인 동적 리소스 시나리오는 런타임 시 각 프레임에 대한 사용자의 관점에서 볼 수 있는 기하 도형 관련 데이터로 채워지는 동적 꼭짓점과 인덱스 버퍼를 만드는 것입니다. 이러한 버퍼는 해당 프레임에 대해 사용자가 볼 수 있는 기하 도형만 렌더링하는 데 사용됩니다.

준비 사용은 다른 리소스와 데이터를 복사하는 데 사용해야 합니다. 일반적인 시나리오는 기본 사용의 리소스(CPU에서 액세스할 수 없음)에 있는 데이터를 준비 사용의 리소스(CPU에서 액세스할 수 있음)에 복사하는 것입니다.

리소스의 데이터가 절대 변경되지 않을 경우 변경할 수 없는 리소스를 사용해야 합니다.

동일한 아이디어를 보는 다른 방법은 애플리케이션에서 리소스를 사용하여 수행하는 작업을 생각하는 것입니다.

애플리케이션에서 리소스를 사용하는 방법 Resource Usage
한 번 로드하고 업데이트하지 않음 변경할 수 없음 또는 기본
애플리케이션에서 리소스를 반복적으로 채움 동적
질감으로 렌더링 기본값
GPU 데이터의 CPU 액세스 스테이징

 

선택할 용도가 확실하지 않을 경우 가장 일반적인 경우로 예상되는 기본 사용으로 시작합니다. 셰이더 상수 버퍼는 항상 기본 사용을 사용해야 하는 한 가지 리소스 종류입니다.

파이프라인 단계에 리소스 바인딩

리소스를 만들 때 지정된 제한 사항을 충족하는 경우 한 리소스를 둘 이상의 파이프라인에 동시에 바인딩할 수 있습니다. 이러한 제한 사항은 사용 플래그, 바인딩 플래그 또는 CPU 액세스 플래그로 지정됩니다. 더 구체적으로, 리소스의 일부를 동시에 읽고 쓸 수 없는 경우 리소스를 입력과 출력으로 동시에 바인딩할 수 있습니다.

리소스를 바인딩하는 경우 GPU와 CPU에서 리소스에 액세스하는 방법을 고려합니다. 단일 용도로 설계된 리소스(다중 용도, 바인딩 및 CPU 액세스 플래그를 사용하지 않음)는 성능을 향상시킬 가능성이 높습니다.

예를 들어 질감으로 여러 번 사용되는 렌더링 대상의 경우를 고려해 보세요. 렌더링 대상과 셰이더 리소스로 사용되는 질감의 두 가지 리소스를 사용하는 것이 더 빠를 수 있습니다. 각 리소스는 "렌더링 대상" 또는 "셰이더 리소스"를 나타내는 하나의 바인딩 플래그만 사용합니다. 데이터는 렌더링 대상 질감에서 셰이더 질감으로 복사됩니다.

이 예에서 이 기술은 셰이더 질감 읽기에서 렌더링 대상 쓰기를 분리하여 성능을 향상시킬 수 있습니다. 두 방법을 모두 구현하고 특정 애플리케이션에서의 성능 차이를 측정하는 것만이 확실한 방법입니다.

리소스