다음을 통해 공유


리소스 선택(Direct3D 10)

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

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

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

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

파이프라인 단계 입/출력 리소스 리소스 종류 바인딩 API
입력 어셈블러 그런 다음 꼭짓점 버퍼 Buffer IASetVertexBuffers
입력 어셈블러 그런 다음 인덱스 버퍼 Buffer IASetIndexBuffer
셰이더 단계 그런 다음 셰이더 리소스 보기 버퍼, Texture1D, Texture2D, Texture3D VSSetShaderResources, GSSetShaderResources, PSSetShaderResources
셰이더 단계 그런 다음 셰이더 상수 버퍼 Buffer VSSetConstantBuffers, GSSetConstantBuffers, PSSetConstantBuffers
스트림 출력 아웃 Buffer Buffer SOSetTargets
출력 병합기 아웃 렌더링 대상 보기 버퍼, Texture1D, Texture2D, Texture3D OMSetRenderTargets
출력 병합기 아웃 깊이/스텐실 보기 Texture1D, Texture2D OMSetRenderTargets

 

각 리소스를 사용하는 방법 식별

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

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

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

 

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

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

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

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

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

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

 

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

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

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

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

예를 들어 질감으로 여러 번 사용되는 렌더링 대상의 경우를 고려해 보세요. 렌더링 대상과 셰이더 리소스로 사용되는 질감의 두 가지 리소스를 사용하는 것이 더 빠를 수 있습니다. 각 리소스는 하나의 바인딩 플래그(D3D10_BIND_RENDER_TARGET 또는 D3D10_BIND_SHADER_RESOURCE)만 사용합니다. 데이터는 CopyResource 또는 CopySubresourceRegion을 사용하여 렌더링 대상 텍스처 에서 셰이더 텍스처로 복사됩니다. 이렇게 하면 셰이더-텍스처 읽기에서 렌더링 대상 쓰기를 격리하여 성능을 향상시킬 수 있습니다. 물론 확실한 유일한 방법은 두 가지 방법을 모두 구현하고 특정 애플리케이션의 성능 차이를 측정하는 것입니다.

리소스(Direct3D 10)