리소스 선택Choosing a resource

리소스는 3D 파이프라인에서 사용 하는 데이터의 컬렉션입니다.A resource is a collection of data that is used by the 3D pipeline. 응용 프로그램 프로그래밍을 위한 첫 번째 단계는 리소스를 만들고 해당 동작을 정의 하는 것입니다.Creating resources and defining their behavior is the first step toward programming your application. 이 가이드에서는 응용 프로그램에 필요한 리소스를 선택 하기 위한 기본 항목을 설명 합니다.This guide covers basic topics for choosing the resources required by your application.

리소스를 필요로 하는 파이프라인 단계 식별Identify pipeline stages that need resources

첫 번째 단계는 리소스를 사용 하는 그래픽 파이프라인 단계를 선택 하는 것입니다.The first step is to choose the graphics pipeline stage (or stages) that will use a resource. 즉, 리소스에서 데이터를 읽을 각 단계와 리소스에 데이터를 기록 하는 단계를 식별 합니다.That is, identify each stage that will read data from a resource as well as the stages that will write data out to a resource. 리소스를 사용 하는 파이프라인 단계를 알면 리소스를 단계에 바인딩하기 위해 호출 되는 Api를 결정 합니다.Knowing the pipeline stages where the resources will be used determines the APIs that will be called to bind the resource to the stage.

다음 표에서는 각 파이프라인 단계에 바인딩할 수 있는 리소스의 유형을 보여 줍니다.This table lists the types of resources that can be bound to each pipeline stage. 리소스를 입력 또는 출력으로 바인딩할 수 있는지 여부를 포함 합니다.It includes whether the resource can be bound as an input or an output.

파이프라인 단계Pipeline Stage 입/출력In/Out 리소스Resource 리소스 종류Resource Type
입력 어셈블러Input Assembler In(다음 안에)In 꼭 짓 점 버퍼Vertex Buffer BufferBuffer
입력 어셈블러Input Assembler In(다음 안에)In 인덱스 버퍼Index Buffer BufferBuffer
셰이더 단계Shader Stages In(다음 안에)In 셰이더-ResourceViewShader-ResourceView Buffer, Texture1D, Texture2D, Texture3DBuffer, Texture1D, Texture2D, Texture3D
셰이더 단계Shader Stages In(다음 안에)In 셰이더-상수 버퍼Shader-Constant Buffer BufferBuffer
스트림 출력Stream Output 아웃Out BufferBuffer BufferBuffer
출력 병합기Output Merger 아웃Out 렌더링 대상 뷰Render-target View Buffer, Texture1D, Texture2D, Texture3DBuffer, Texture1D, Texture2D, Texture3D
출력 병합기Output Merger 아웃Out 깊이/스텐실 뷰Depth/Stencil View Texture1D, Texture2DTexture1D, Texture2D

 

각 리소스를 사용 하는 방법 식별Identify how each resource will be used

응용 프로그램에서 사용할 파이프라인 단계를 선택 하 고 (따라서 각 단계에 필요한 리소스), 다음 단계는 각 리소스가 사용 되는 방법, 즉 CPU 또는 GPU에서 리소스에 액세스할 수 있는지 여부를 결정 하는 것입니다.Once you have chosen the pipeline stages that your application will use (and therefore the resources that each stage will require), the next step is to determine how each resource will be used, that is, whether a resource can be accessed by the CPU or the GPU.

응용 프로그램이 실행 되는 하드웨어에는 최소 하나 이상의 CPU와 하나의 GPU가 포함 됩니다.The hardware that your application is running on will have a minimum of at least one CPU and one GPU. 사용 값을 선택 하려면 다음 옵션을 사용 하 여 리소스에 대 한 읽기 또는 쓰기를 수행 해야 하는 프로세서 유형을 고려해 야 합니다.To pick a usage value, consider which type of processor needs to read or write to the resource from the following options.

Resource UsageResource Usage 업데이트 가능Can be updated by 업데이트 빈도Frequency of Update
기본값Default GPUGPU 자주infrequently
동적Dynamic CPUCPU 자주frequently
준비Staging GPUGPU 해당 없음n/a
변경할 수 없음Immutable CPU (리소스를 만들 때만)CPU (only at resource creation time) 해당 없음n/a

 

CPU에서 자주 업데이트 될 것으로 예상 되는 리소스 (프레임당 한 번이 하)에는 기본 사용을 사용 해야 합니다.Default usage should be used for a resource that is expected to be updated by the CPU infrequently (less than once per frame). 이상적으로 CPU는 잠재적 성능 저하를 방지 하기 위해 기본 사용으로 리소스에 직접 쓰지 않습니다.Ideally, the CPU would never write directly to a resource with default usage so as to avoid potential performance penalties.

동적 사용은 CPU가 비교적 자주 업데이트 하는 리소스 (프레임당 한 번 이상)에 사용 해야 합니다.Dynamic usage should be used for a resource that the CPU updates relatively frequently (once or more per frame). 동적 리소스에 대 한 일반적인 시나리오는 런타임에 각 프레임에 대 한 사용자의 관점에서 표시 되는 기 하 도형에 대 한 데이터를 사용 하 여 런타임에 채워지는 동적 꼭 짓 점 및 인덱스 버퍼를 만드는 것입니다.A typical scenario for a dynamic resource would be to create dynamic vertex and index buffers that would be filled at runtime with data about the geometry visible from the point of view of the user for each frame. 이러한 버퍼는 해당 프레임의 사용자에 게 표시 되는 기 하 도형만 렌더링 하는 데 사용 됩니다.These buffers would be used to render only the geometry visible to the user for that frame.

스테이징 사용은 다른 리소스 간에 데이터를 복사 하는 데 사용 해야 합니다.Staging usage should be used to copy data to and from other resources. 일반적인 시나리오는 기본 사용 (CPU가 액세스할 수 없음)을 사용 하 여 리소스의 데이터를 스테이징 사용 (CPU에서 액세스할 수 있음)이 있는 리소스에 복사 하는 것입니다.A typical scenario would be to copy data in a resource with default usage (which the CPU cannot access) to a resource with staging usage (which the CPU can access).

리소스의 데이터가 변경 되지 않는 경우에는 변경할 수 없는 리소스를 사용 해야 합니다.Immutable resources should be used when the data in the resource will never change.

동일한 개념을 확인 하는 또 다른 방법은 응용 프로그램에서 리소스에 대해 수행 하는 작업을 고려 하는 것입니다.Another way of looking at the same idea is to think of what an application does with a resource.

응용 프로그램에서 리소스를 사용 하는 방법How Application uses the Resource Resource UsageResource Usage
한 번 로드 및 업데이트 안 함Load once and never update 변경할 수 없음 또는 기본값Immutable or Default
응용 프로그램이 리소스를 반복 해 서 채우기Application fills resource repeatedly 동적Dynamic
질감으로 렌더링Render to texture 기본값Default
GPU 데이터의 CPU 액세스CPU access of GPU data 준비Staging

 

어떤 용도를 선택 하는 것이 확실 하지 않은 경우 가장 일반적인 경우로 예상 되는 기본 사용으로 시작 합니다.If you are unsure what usage to choose, start with the default usage as it is expected to be the most common case. 셰이더 상수 버퍼는 항상 기본 사용을 가져야 하는 하나의 리소스 형식입니다.A Shader-Constant buffer is the one resource type that should always have default usage.

파이프라인 단계에 리소스 바인딩Binding resources to pipeline stages

리소스를 만들 때 지정 된 제한 사항이 충족 되는 한 한 번에 둘 이상의 파이프라인 단계에 리소스를 바인딩할 수 있습니다.A resource can be bound to more than one pipeline stage at the same time as long as the restrictions specified when the resource was created are met. 이러한 제한 사항은 사용 플래그, 바인드 플래그 또는 cpu 액세스 플래그로 지정 됩니다.These restrictions are specified as usage flags, bind flags, or cpu access flags. 구체적으로 말해서 리소스의 읽기 및 쓰기를 동시에 수행할 수 없으면 리소스를 입력 및 출력으로 동시에 바인딩할 수 있습니다.More specifically, a resource can be bound as an input and an output simultaneously as long as reading and writing part of a resource cannot happen at the same time.

리소스를 바인딩할 때 GPU 및 CPU가 리소스에 액세스 하는 방법을 고려 합니다.When binding a resource, think about how the GPU and the CPU will access the resource. 단일 용도로 설계 된 리소스 (여러 사용, 바인딩 및 cpu 액세스 플래그를 사용 하지 않음)가 더 나은 성능을 얻을 수 있습니다.Resources that are designed for a single purpose (do not use multiple usage, bind, and cpu access flags) will more than likely result in better performance.

예를 들어 렌더링 대상이 질감으로 여러 번 사용 되는 경우를 고려해 보세요.For example, consider the case of a render target used as a texture multiple times. 두 리소스를 사용 하는 것이 더 빠를 수 있습니다. 렌더링 대상과 셰이더 리소스로 사용 되는 질감입니다.It may be faster to have two resources: a render target and a texture used as a shader resource. 각 리소스는 "렌더링 대상" 또는 "셰이더 리소스"를 나타내는 바인드 플래그를 하나만 사용 합니다.Each resource would use only one bind flag, indicating "render target" or "shader resource". 데이터는 렌더링 대상 질감에서 셰이더 질감으로 복사 됩니다.The data would be copied from the render-target texture to the shader texture.

이 예제의이 기법은 셰이더-질감 읽기에서 렌더링 대상 쓰기를 격리 하 여 성능을 향상 시킬 수 있습니다.This technique in this example may improve performance by isolating the render-target write from the shader-texture read. 두 가지 방법을 모두 구현 하 고 특정 응용 프로그램의 성능 차이를 측정 하는 방법만을 확인할 수 있습니다.The only way to be sure is to implement both approaches and measure the performance difference in your particular application.

관련 항목Related topics

리소스Resources