본문 바로가기

프로그래밍/DirectX

DirectX11 자원 (Resource)

Direct3D 11의 자원은 버퍼(Buffer), 텍스처(Texture)로 나뉜다.

 

이 자원들은 ID3D11Resource라는 단일 공통 기반 클래스를 상속받는다.

 

이러한 구조는 자원이라는 것이 결국 파이프라인에 연결할 수 있고 입력 또는 출력에 쓰이는 메모리 블록이라는 것을 보여준다.

 

모든 메모리 자원의 생성은 ID3D11Device 인터페이스로 만든다

 

모든 자원 생성 메서드는 세개의 매개변수를 받는다

 

1.. Resource Description

 : 자원 생성에 관한 모든 옵션을 지정하는 구조체이다. 생성된 자원의 원하는 특성들을 정의하는데 쓰인다.

 

용도 명세 (Usage Specification)

 : 자원을 어떤 용도로 사용할 것인지 나타낸다.

 

enum D3D11_USAGE

    {

        D3D11_USAGE_DEFAULT   = 0,

        D3D11_USAGE_IMMUTABLE = 1,

        D3D11_USAGE_DYNAMIC   = 2,

        D3D11_USAGE_STAGING   = 3

    }   D3D11_USAGE;

 

이 구조체의 변수들은 자원에 대한 GPU와 GPU의 읽기/쓰기 가능 여부를 결정한다.

 

D3D11_USAGE_DEFAULT

 : 기본 용도. GPU의 읽기와 쓰기를 허용하며 CPU 접근은 거부한다. GPU가 읽을 뿐만 아니라 종종 변경하기도 하는 자원에 가장 최적인 용도이다. 

ex) 렌더 타겟 텍스처(GPU의 렌더링 결과가 기록되고, 이후 GPU가 다시 읽어들인다), 

    스트림 출력 정점 버퍼(GPU의 처리 결과가 기록되고, 이후 GPU가 렌더링을 위해 읽어들인다)

 

D3D11_USAGE_IMMUTABLE

 : 생성한 자원은 오직 GPU가 읽을 수만 있고 CPU는 아예 접근하지 못한다. GPU와 CPU 모두 이 자원을 기록하지 못한다. 일단 생성된 후에는 자원을 수정할 수 없다.

 

D3D11_USAGE_DYNAMIC

 : CPU의 쓰기가 가능하다. GPU는 읽기만 가능하다. CPU가 자원의 내용을 생산하고, GPU가 소비한다. CPU가 자원의 내용을 읽어 들이지는 못한다.

ex) 상수버퍼

 

D3D11_USAGE_STAGING

 : GPU에서 자료를 계산, 조작하고 그것을 저장하거나 추가 조사를 위해 CPU로 읽어 들여야 하는 경우 사용된다.

 

CPU 접근 플래그

 : 자원에 대한 CPU의 접근 방식을 지정한다.

 

enum D3D11_CPU_ACCESS_FLAG

    {

        D3D11_CPU_ACCESS_WRITE        = 0x10000L,

        D3D11_CPU_ACCESS_READ = 0x20000L

    }   D3D11_CPU_ACCESS_FLAG;

 

두 값을 비트 단위 OR로 결합해서 CPU 접근 필드에 지정할 수 있다. CPU 읽기나 쓰기 둘 중 하나만이 아니라 읽기와 쓰기를 모두 허용할 수 있다. Staging 용도는 CPU의 읽기와 쓰기를 모두 허용한다. 반면 Default 용도는 CPU의 접근을 아예 거부하므로 반드시 0으로 설정해야 한다.

 

연결 플래그 (Bind Flag)

 : 자원을 파이프라인의 어디에 연결할 수 있는지 나타낸다. OR로 결합함으로써 연결 가능 장소를 여러개 지정하는 것도 가능하다.

 

enum D3D11_BIND_FLAG

    {

        D3D11_BIND_VERTEX_BUFFER      = 0x1L,

        D3D11_BIND_INDEX_BUFFER       = 0x2L,

        D3D11_BIND_CONSTANT_BUFFER    = 0x4L,

        D3D11_BIND_SHADER_RESOURCE    = 0x8L,

        D3D11_BIND_STREAM_OUTPUT      = 0x10L,

        D3D11_BIND_RENDER_TARGET      = 0x20L,

        D3D11_BIND_DEPTH_STENCIL      = 0x40L,

        D3D11_BIND_UNORDERED_ACCESS   = 0x80L,

        D3D11_BIND_DECODER    = 0x200L,

        D3D11_BIND_VIDEO_ENCODER      = 0x400L

    }   D3D11_BIND_FLAG;

 

D3D11_BIND_VERTEX_BUFFER, D3D11_BIND_INDEX_BUFFER

처음 두개는 정점 버퍼와 인덱스 버퍼에 해당한다. 파이프라인에 기하구조 자료를 공급하기 위한 입력 조립기 단계에 부착할 자원에 쓰인다.

D3D11_BIND_CONSTANT_BUFFER, D3D11_BIND_SHADER_RESOURCE

3, 4번째는 자원을 프로그램 가능 셰이더 단계들 전부 또는 일부에 연결해서 셰이더 프로그램 안에서 사용할 수 있음을 뜻한다.

D3D11_BIND_STREAM_OUTPUT

5번째 스트림 출력 플래그는 파이프라인으로부터의 출력을 위한 것이다.

D3D11_BIND_RENDER_TARGET, D3D11_BIND_DEPTH_STENCIL

6, 7번째 렌더 타겟 플래그와 깊이 스텐실 버퍼 플래그는 파이프라인의 렌더링 결과를 받는 출력 병합기 단계에 연결할 자원을 위한 것이다.

기타 플래그

 : 자원이 사용할 수 있는 특별한 속성들 대부분을 포괄한다.

enum D3D11_RESOURCE_MISC_FLAG

    {

        D3D11_RESOURCE_MISC_GENERATE_MIPS    = 0x1L,

        D3D11_RESOURCE_MISC_SHARED    = 0x2L,

        D3D11_RESOURCE_MISC_TEXTURECUBE      = 0x4L,

        D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS        = 0x10L,

        D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS   = 0x20L,

        D3D11_RESOURCE_MISC_BUFFER_STRUCTURED        = 0x40L,

        D3D11_RESOURCE_MISC_RESOURCE_CLAMP   = 0x80L,

        D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX        = 0x100L,

        D3D11_RESOURCE_MISC_GDI_COMPATIBLE   = 0x200L,

        D3D11_RESOURCE_MISC_SHARED_NTHANDLE  = 0x800L,

        D3D11_RESOURCE_MISC_RESTRICTED_CONTENT       = 0x1000L,

        D3D11_RESOURCE_MISC_RESTRICT_SHARED_RESOURCE = 0x2000L,

        D3D11_RESOURCE_MISC_RESTRICT_SHARED_RESOURCE_DRIVER = 0x4000L,

        D3D11_RESOURCE_MISC_GUARDED   = 0x8000L,

        D3D11_RESOURCE_MISC_TILE_POOL = 0x20000L,

        D3D11_RESOURCE_MISC_TILED     = 0x40000L,

        D3D11_RESOURCE_MISC_HW_PROTECTED     = 0x80000L

    }   D3D11_RESOURCE_MISC_FLAG;

 

2.. D3D11_SUBRESOURCE_DATA 구조체를 가리키는 포인터

 : 자원에 적재할 초기 자료를 제공하는데 쓰인다.

 

3.. 자원 종류에 맞는 자원 인터페이스를 가리키는 포인터의 포인터

 : 자원 생성이 성공하면 해당 자원을 가리키는 포인터가 이 매개변수에 설정된다.

 

정점 버퍼 (Vertex Buffer)

 : 파이프라인에 정점별 정보를 제공한다.

 

파이프라인에 자원을 부착하는 지점마다 그에 해당하는 연결 플래그(Bind Flag)가 존재한다.

 

정점 버퍼를 파이프라인에 정점 자료를 입력하는 용도로 사용하려면

D3D11_BIND_VERTEX_BUFFER 연결 플래그를 설정해야 한다.

 

파이프라인의 정점 자료 스트림 출력용으로 사용하려면

D3D11_BIND_STREAM_OUTPUT 연결 플래그를 설정해야 한다.

 

'프로그래밍 > DirectX' 카테고리의 다른 글

범프 매핑 (Bump Mapping)  (0) 2019.07.17
DirectX 11 기초  (0) 2019.03.28
3D 애니메이션 이론 2  (0) 2019.03.26
Directx11 렌더링 파이프라인  (0) 2019.03.22
3D Animation 이론 1  (0) 2019.03.22