본문 바로가기
DirectX Practice

Direct3DX 복습하기 3 - Day - Direct3D 11 자원(Memory Resource)(1)

by Srff5123 2024. 9. 23.
728x90

1. 자원(Memory Resource)

 

1. 개요

Direct3D 11의 자원은 크게 두 종류로 나누어진다.  하나는 버퍼(Buffer), 또 하나는 텍스처(Texture)이다.

버퍼와 텍스처 모두 좀 더 세분화된 하위 종류들이 존재하며, 각 하위 종류마다 구성 옵셥들이 다르다. 자원 생성 시 지정 할 수 있는 옵션들이 굉장히 많다.

자원 클래스의 계봉 구조인데 이것은 그림에서 보듯이 전체 API에서 자원에 관한 클래스는 단 네 개로, 버퍼를 위한 클래스 하나와 각각 1차원, 2차원, 3차원 텍스처를 위한 클래스 세 개가 있다.

이 계통도는 보시다시피 ID3D11Resouce라는 단일화 공통 기반 클래스로 부터 파생되어져 있는데

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

다른 말로 하면, 자원은 GPU가 사용하고 조작하도록 마련된 메모리 블록이다.

여러 종류의 자원들의 차이는 자원을 파이프라인에 묶는 데 쓰이는 의미구조와 자원의 형식, 접근, 사용에 관한 규칙들 뿐이다.

 

2. 자원 생성

모든 메모리 자원의 생성은 ID3D11Device 인터페이스가 책임진다. 

생성된 자원을 파이프라인에 직접 연결할 수 있고, 자원 뷰를 통해 연결할 수도있다.

연결이 된 후 파이프라인 실행 과정 안에서 자원이 실제로 사용되어지고, 자원 생성에 쓰이는 ID3D11Device의 메서드는 자원의 종류마다 다르지만, 모두 동일한 일반 패턴을 따른다.

 

모든 자원 생성 메서드는 세 개의 매개변수를 받는데, 첫 매개변수는 자원 생성에 관한 모든 옵션을 지정하는 구조체로

자원 서술(Resource Description)이라고 부른다. 자원 종류마다 자원 서술 구조체가 다르지만 이 구조체들은 모두 동일한 목적으로 생성된 자원의 원하는 특성들을 정의하는데 쓰인다. 

 

생성 메서드이 두번째 매개변수는 D3D11_SUBRESOURCE_DATA 구조체를 가리키는 포인터인데, 이 구조체는 자원에

적재할 초기 자료를 제공하는 데 쓰인다. 정적 정점 자료를 담을 버퍼 자원을 만드는경우 이 구조체를 이용해서 모형의 정점 자료를 버퍼 자원에 채워 넣을 수 있다.

내용이 변하지 않을 버퍼의 경우 이렇게 하면 먼저 버퍼를 만든 후 일일이 자료를 채워 넣는 수고를 덜 수 있다.

자원 생성 메서드의 마지막매개변수는 자원 종류에 맞는 자원 인터페이스를 가리키는 포인터의 포인터로 자원 생성이 성공하면 해당 자원을 가리키는포인터가 이 매개변수에 설정된다.  

 

자원 생성 메서드에서 실질적인 구성 설정이 일어나는 곳은 바로 자원 서술 구조체로, 앞에서 언급했듯이 각 자원 종류마다 자원의 속성들을 지정하는 구조체가 다르다.

그런데 그 구조체들이 모두 공유하는 공통의 요소도 존재한다. 용도 플래그, 연결 플래그, CPU 접근 플래그, 기타 여러 플래그들을위한 구조체 필드들이 그런 공통의 요소이다. 이 요소들은 모든 자원 종류가 공유한다.

 

1. 자원 용도 플래그 

 

자원 서술 구조체의 필드는 용도 명세(Usage Specification) 필드로, 이 필드는 응용 프로그램이 자원을 어떤 용도로 사용할 것인지를 나타낸다.

자원은 컴퓨터 안의 어딘가에 있는 메모리 블록인데 자원이 존재하는 메모리는 비디오 카드의 메모리일 수도 있고 시스템의 주 메모리일 수도 있다. 또한 Direct3D11 실행 시점 모듈이 자원을 비디오 카드 메모리에서 시스템 메모리로 , 또는 그 반대 방향으로 이동할 수도 있다.

실행 시점 모듈/구동기가 자원을 최적의 장소에 두고 내부적으로 자원을 효율적으로 처리할 수 있게 하기 위해, 응용 프로그램은 반드시 자원의 사용 방식에 대한 자신의 의도를 용도 명세 필드를 통해서 명시적으로 밝혀야 한다.

이는 이전 버전의  Direct3D와는 다른 점으로, 이전 버전에서는 자원이 상주할 메모리 풀을 응용 프로그램이 직접 지정할 수 있었다. 그러나 자원의 사용 의도를 지정하는 것으로도 이전과 비슷한 수준의 제어가 가능하다.

이 필드에 사용할 수 있는 값들은 D3D11_USAGE 열거형에 정의되어 있다.

위의 값들은 각각 서로 다른 용법을 나타낸다. 구체적으로, 이들은 자원에 대한 CPU와 GPU의 읽기/쓰기 가능 여부를 결정한다. 예를 들어 GPU만 읽고 쓰고 CPU는 결코 접근 하지 않을 자원일 경우면 비디오 메모리에 두어도 무방하다.

그런 자원은 시스템 자원으로 이동되지 않는다 또한 그런 자원을 GPU가까이에 두면 성능 향상에 도움이 된다.

1. 불변 용도

가장 간단한 사용 패턴은 D3D11_IMMUTABLE에 해당하는 불변(Immutable)용도이다. 

이 용도를 지정하여 생성된 자원은 GPU만 읽을 수 있고, CPU는 접근하지 못하게 한다.

또한 GPU와 CPU 모두 이 자원을 쓰지못하고, 일단 생성된 후에는 자원을 결코 수정할 수 없다.

자원을 수정할 수 없기에 불변이라는 이름이 붙었다. 이런 종류의 자원의 예로는 응용 프로그램의 수명동안 변하지 않는 자료로 생성되는 정적인 상수나 정점, 색인 버퍼를 들 수있다. 일반적으로 이런 자원들은 GPU에 자료를 공급하는 데에 쓰인다.

 

2. 기본 용도

D3D11_DEFAULT는 기본 용도를 뜻한다. 기본 용도 자원은 GPU의 읽기와 쓰기를 허용하며 CPU 접근은 모두 거부한다.

이는 GPU가 읽을 뿐 아니라 종종 변경하기도 하는 자원에 가장 최적인 용도이다. 이런 용도가 유용한 예시로는 렌더 대상 텍스처(GPU의 렌더링 결과가 기록되고, 이후 GPU가 다시 읽거나), 스트림 출력 정점 버퍼(GPU의 처리 결과가 기록되고, 이후 GPU가 렌더링을 위해 읽어드리는 경우)가 있다. 이런 자원은 비디오 메모리에 상주할 수 있으므로 GPU는 이런 자원에 최대한 빠르게 접근할 수 있으며, 결과적으로 응용 프로그램의 전체적인 성능이 향상된다.

 

3. 동적 용도

D3D11_DYNAMIC에 해당하는 동적 용도는 CPU의 쓰기가 가능한 두 가지 용도 중 하나이다. GPU는 읽기만 가능하며, 이 사용 패턴에서는 CPU가 자원의 내용을 생산하고 GPU가 그것을 소비한다. 이런 종류의 자원으로 가장 흔한 예는 프레임 마다 바뀔 수 있는 렌더링 자료(변환 행렬)를 프로그램 가능 셰이더 단계에 공급하기 위한 상수 버퍼로, CPU가 자원의 내용을 읽어 들지는 못한다는 점에 주목한다. 즉 자료는 CPU에서 GPU로 한 방향으로만 흘러간다.

 

2. CPU 접근 플래그

자원의 용도를 지정했다면, 다음으로는 자원에 대한 CPU의 접근 방식을 지정해야 한다.

용도 플래그처럼 CPU 접근 플래그도 자원에 대한 접근 허용 여부를 결정하거나, CPU에만 국한된 것이라는 점이 다르다.

CPU 접근 플래그로 가능한 값은 두가지로 아래의 사진에 있다.

이 열거형의 두 값을 비트 단위 OR로 결합하여 CPU 접근 필드에 지정할 수 있다. 즉 CPU 읽기나 쓰기 둘 중 하나만이 아닌 읽기와 쓰기를 모두 허용할수 있다.

이 플래그를 설정할 경우에는 반드시 자원의 용도 플래그도 고려해야 한다.

예비 용도 자원은 CPU의 읽기와 쓰기를 모두 허용한다. 반면 기본 용도는 CPU의 접근을 아예 거부하기에 CPU 접근 플래그를 반드시 0으로 설정해야 한다.

 

3. 연결 플래그

자원 서술 구조체의 또 라느 공통 필드로 연결플래그(Bind Flag)가 있다. 이 필드는 자원을 파이프라인의 어디에 연결할 수 있는지를 나타내며, 다양한 장소들에 대한 열거형 값들이 마련되어 있으며, 그 값들을 비트 단위 OR로 결합함으로써 연결 가능 장소를 여러 개 지정하는 것도 가능하다.

이 플래그를 제대로 지정하지 않고 자원을 생성하면 나중에 응용 프로그램이 자원을 파이프파링네 연결하여 할 때 오류가 발생한다.

열거형 정의에서 보듯이, 자원을 파이프 라인에 연결할 수 있는 지점은 총 8 가지로

처음 둘은 정점 버퍼와 색인 버퍼에 해당하며, 파이프라인에 기하구조로 자료를 공급하기 위한 입력 조립기 단계에 연결할 자원으로 쓰인다.

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

5번째의 스트림 출력 플래그 역시 파이프라인으로 부터의 출력을 위한 것이나. 래스터화된 이미지 자료가 아니라 기하구조 자료를 받는다는 점이 다르다. 지금까지 말한 플래그 값들은 모두, 각각 파이프라인의 하나의 연결 지점에 대응된다.

 

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

 

4. 기타 플래그들

이 필드는 자원이 사용할 수 있는 특별한 속성들 대부분을 포괄한다. 이들 중 일부는 GDI의 그리기 명령들과의 연동이나 여러 ID3D11Device 인스턴스들 사이의 자원 공유 같은 특별한 상황들에서 자원을 사용할 수 있게 하기 위한 것이다.

D3D11_RESOURCE_MISC_SHARED 플래그는 자원을 여러 ID3D11Device 인스턴스들이 공유할 수 있게 한다.

이 용법은 고급 응용 프로그램에서만 쓰인다.

D3D11_RESOURCE_MISC_KEYEDMUTEXT 플래그도 자원을 여러 장치들이 사용할 수 있게 하는 것이나,

자원의 공유 제어를 위한 뮤텍스 시스템을 지원한다는 점이 다르다.

D3D11_RESOURCE_MISC_GDI_COMPATIBLE 플래그는 자원을 GDI에서도 사용할 수 있게 하는 것이다. 일부 에제 프로그램이 텍스트 렌더링 구현을 위해 그런 기법을 사용한다. 

 

3. 자원 해제

응용 프로그램에서 사용할 수 있는 다양한 종류의 메모리 자원들을 위에서 많이 나왔다.

이러한 자원들은 모두 COM 인터페이스를 구현하는 객체의 형태이며, 따라서 해당 객체의 계통구조 안의 어딘가에 IUnknown 인터페이스가 존재한다. 이는 자원들이 참조 계수 방식으로 관리된다는 뜻이며, 따라서 응용 프로그램이 자원을 다 사용하고 난 후에는 반드시 참조를 해제해 주어야 한다. 응용 프로그램은 자신이 사용하는 자원의 참조들을 세심하게 관리하고 적절히 해제해야 하며, 그렇지 않으면 메모리 누수 현상이 나타나게 된다.

 

1. 자원 뷰

자원의 종류는 여러 가지이지만 자원을 파이프라인에 묶는 방법은 한가지 이다.

앞의 연결 플래그에서 보듯이. 파이프라인에 자원을 연결할 수 있는 지점은 총 8군데 이다. 그들 중 절반에서는 자원을 파이프 라인에 직접 연결할 수 있다. 

정점 버퍼와 색인 버퍼, 상수 버퍼, 스트림 출력 버퍼가 바로 그것이다.

나머지 네 연결 지점들에서는 자원 뷰(Resource View)라고 하는 일종의 접속기를 이용해서 자원을 파이프라인에 연결해야 한다.

자원을 파이프라인에 묶는 데 쓰이는 적응 객체(Adaptor)인 자원 뷰는, 개념적으로 말하자면 자원에 대한 특정한 시각(View)를 지공한다. 자원 자체와 비슷하게, 자원 뷰 역시 다양한 옵션들로 구성할 수 있다. 자원 뷰를 통해서 자원을 어느 정도는 자유로이 해석 할 수 있기 때문에, 하나의 자원을 여러 가지 자원 뷰를 이용해서 파이프 라인의 각자 다른 위치에 연결하는 것이 가능하다. 실제로 한 자원의 부분집합들을 나타내는 데에도 자원 뷰들을 사용할 수 있다.

 

1. 자원 뷰의 종류

자원 뷰는 크게 네 종류로, 각각 지원을 파이프라인에 연결하는 서로 다른 네 장소에 대응된다. 이 뷰들은 파이프라인의 해당 장소에 묶인 자원으로 할 수 있는 일과 할 수 없는 일을 결정한다. 네 종류의 자원 뷰는 다음과 같다.

 

- 렌더 대상 뷰(ID3D11RenderTargetView)

- 깊이-스텐실 뷰(ID3D11DepthStencilView)

- 셰이더 자원 뷰(ID3D11ShaderResourceView)

- 순서 없는 접근 부(ID3D11UnorderedAccessView)

 

같은 자원이라도 어떤 자원 뷰로 연결되는가에 따라 자원의 의미론(Semantics : 용도)가 달라진다. 

또한 각 자원 뷰는 자원 사용 방식을 더욱 세밀하게 제어하기 위한 일단의 서로 다른 구성 옵션들도 제공한다.

 

1. 렌더 대상 뷰(Render Target View, RTV)

렌더링 파이프라인의 출력을 받을 자원을 연결하는 데 쓰인다. 렌더링 파이프라인은 이러한 자원에 대해 자료를 기록하며,

경우에 따라서는 혼합 연산을 위해 자원으로부터 자료를 읽어 들이기도 한다. 전통적으로 렌더 대산의 2차원 텍스처이나,

다른 종류의 자원을 렌더 대상으로 연결하는 것도 가능하다.

렌더 대상 뷰의 구성 옵션으로는 자원의 DXGI 형식이 있으며, 그 외에도 자원의 종류에 따라 다양한 구성 옵션들이 존재한다.

렌더 대상 뷰는 또한 자원의 일부분을 파이프라인에 노출시키는 다양한 메서드들도 제공한다.

 

2. 깊이-스텐실 뷰(Depth Stencil View, DSV)

렌더 대상 뷰처럼 렌더링 파이프라인의 출력을 받는 자원을 위한 것이다. 차이는, 렌더 대상 뷰가 색상 값들을 담는 버퍼를 위한 것인 반면 깊이-스텐실 뷰는 깊이와 스텐실 값들을 담는 버퍼를 위한 것이라는 점이다.

깊이-스텐실 버퍼 자원을 빈번하게 쓰이는 렌더링 연산인 깊이 판정과 스텐실 판정을 수행하는 데 사용하며, 이 때문에 파이프 라인의 효율성에 아주 중요한 요인이 된다.

그렇기에 성능 향상을 위해 깊이-스텐실 뷰는 연결된 자원에 기록이 필요한지를 나타내는 추가적인 플래그를 제공한다.

이를 통해 하나의 자원을 깊이-스텐실버퍼로 연결됨과 동시에, 세이더 자원 뷰를 이용해 자원을 셰이더 프로그램 안에서 사용할 수 있게 만드는 것이 가능하다. 이러한 구성에서 두 뷰 모두 읽기 전용이다.

그렇기에 자원은 전혀 수정되지 않는다.

하나의 자원을 이처럼 읽기/쓰기에 따른 위험 요소 없이 파이프라인의 여러 지점에 연결함으로써 자원을 좀 더 유연한 방식으로 활용할 수 있다. 깊이-스텐실 버퍼를 통상적인 방식으로 사용하고 싶다면, 두 번째 자원뷰를 읽기전용이 아닌 쓰기도 가능한 뷰로 대신하면 된다.

 

3. 셰이더 자원 뷰(Shader Resource View, SRV)

파이프 라인의 프로그램 가능 셰이더 단계가 자원을 읽을 수 있게 한다. 이 뷰는 예전에 픽셀 세이더에서 텍스처가 하던 역할로 즉 셰이더 프로그램 안에서 읽고 사용할 수는 있지만 기록하지는 못하는 자료에 해당하는 것이다. 셰이더 자원 뷰는 여러 가지 프로그램 가능 셰이더 단계들 모두에서 사용할 수 있다.

 

4. 순서 없는 접근 뷰(Unordered Access View, UAV)

자원의 가장 흥미로운 새 용법들 몇 가지를 가능하게 하는 뷰이다.

셰이더 자원 뷰처럼 순서 없는 접근 뷰 역시 자원 읽기를 가능하게 한다. 더 나아가 같은 셰이더 프로그램안에서 자원을 읽음과 동시에 기록까지 할 수 있다. 게다가, 출력 장소가 미리 정해져 있지 않아 셰이더 프로그램 안에서 자원 안의 임의의 위치에 흩어 쓰기(Scatter)연산을 수행하는 것도 가능하다. 이 뷰로는 자원을 훨씬 더 유연한 방식으로 사용할 수 있기 때문에 전혀 새로운 부류의 자원 접근이 가능해진다. 

그러나 이런 종류의 뷰를 프로그램 가능 셰이더 단계들 전부가 지원하지는 않는다는 점을 주의해야 한다.

이 자원 뷰는 픽셀 셰이더 단계와 계산 셰이더 단계에만 사용할 수 있다. 

 

2. 자원 뷰의 생성

자원 뷰를 생성하는 과정은 자원 생성 과정과 다소 비슷하다.

자원 뷰의 생성에도 ID3D11Devie가 쓰인다. 이 인터페이스는 각 자원 종류별 생성 메서드를 제공하는데, 이 생성 메서드들은 모두 같은 패턴을 따른다. 메서드이 매개변수들에 대해 응용 프로그램이 제공하는 값이 다를 뿐이다.

자원 뷰 생성 메서드들은 모두 세 개의 매개 변수를 받는데, 첫 매개변수는 자원 뷰를 적용할 자원을 가리키는 포인터이다. 

둘 째 매개변수는 자원 뷰를 서술하는 구조체를 가리키는 포인터로, 그 구조체는 해당 종류의 자원 뷰를 위한 모든 옵션을 담는다.

셋째 이자 마지막 매개변수는 해당 종류의 자원 뷰 객체에 대한 포인터로, 호출이 성공한 경우 그 포인터가 가리키는 곳에 자원 뷰 객체가 만들어진다.

자원 뷰를 응용 프로그램의 요구에 맞게 만드는 데 있어 가장 중요한 매개변수는 둘째로 네 가지 자원 뷰 종류마다 각자 고유한 서술 구조체가 존재하며, 각 구조체는 해당 자원 뷰를 위한 고유한 구성 옵션들을 제공한다.

 

1.렌더 대상 뷰의 구성 설정

렌더 대상 뷰를 생성할 때 지정할 수 있는 옵션이다.

D3D11Device::CreateRenderTargetView() 메서드를 호출할 때 반드시 채워 넣어야하는 구조체를 나타낸 것이다.

이 구조체는 두개의 일반 필드와, 여러 가지 구조체들 중 하나를 선택할 수 있는 공용체 필드 하나로 구성되어 있다. 이러한 구조 덕분에 다양한 종류의 자원들에 대해 동일한 서술 구조체를 사용하면서도 각 자원 종류마다 고유한 속성들을 제공할 수 있다. Format 필드는 자원을 읽어 들일 때 자원의 내용을 어떤 형식의 자료로 변환할 것인지를 결정한다.

상황에 따라서는 이를 통해 자원의 형식을 자원 뷰가 제공한 형식에 따라 실행 시점에서 결정하는 것이 가능하다.

비디오 형식 변환기 같은 응용 프로그램이라면 그런 기법이 도움이 된고, 그런 기법을 위해서는 이 구조체에 지정된 자료 형식과 호환되는 현식으로 자원을 생성해 두어야 한다.

둘째 필드인 ViewDimension은 이 자원 뷰를 이용해서 묶을 자원의 종류를 뜻한다. 자원 뷰 생성 메서드는 이 필드에 근거해서 공용체의 구조체 중 하나를 선택한다. 이러한 공용체 방식 덕분에 여러 자원 종류에 대해 동일한 생성 메서드와 구조체를 사용할 수 있으며, 또한 구조체의 크기를 최소한으로 유지할 수있다.

공용체로 묶인 모든 구조체는 자원의 어떤 부분들을 자원 뷰가 사용할 수 있게 할 건인지를 지정하는 역할을 하며,

각 자원 종류마다 메모리 배치 방식이나 옵션이 다르므로, 각 자원 종류에 따라 서로 다른 구조체를 두는 것이 합당하다.

 

2. 깊이-스텐실 뷰의 구성 설정 

 

그림에서 보듯이, 이 자원 뷰도 DXGI 자료 형식과 뷰로 묶을 자원의 종류를 지정해야 한다.

한가지 흥미로운 점은, 깊이-스텐실 자원 뷰에 사용할 수 있는 자원 종류가 렌더 대상 뷰보다 조금 적다는 것이다.

이는 깊이-스텐실 자원으로 수행하는 연산의 고유한 특성 때문이다.

 

이 구조체에서 주목할 또 다른 사항은 Flags라는 필드가 있다는 점이다.

이 필드에는 파이프라인이 이 자원 뷰를 통해서 자원의 깊이 부분이나 스텐실 부분에 읽기 전용으로 접근할 수 있게 할 것인지의 여부를 뜻하는 플래그들을 비트단위 OR로 결합해서 지정한다.

이 필드 덕분에, 깊이나 스텐실 값을 읽어야 하는 알고리즘을 구현하는 경우 하나의 깊이-스텐실 자원에 대한 여러 개의 뷰들을 동시에 파이프라인에 연결할 수 있다.

3. 셰이더 자원 뷰의 구성 설정

셰이더 자원 뷰의 서술 구조체 역시 앞에 나온 구조체들과 같은 패턴을 따른다.

이 구조체에도 자료 형식과 자원 종류를 지정하는 필드들이 있다.

이 구조체의 특징은, 공용체에 속한 하위 구조체들이 더 많다는 것이다.

이는 셰이더 자원 뷰가 다른 뷰들보다 더 많은 종류의 자원을 지원한다는 뜻이다.

추가된 자원 종류는 총 세개로 공용체의 TextureCube 필드에 해당하는 텍스트 입방체자원과 TextureCubeArray 필드에 해당하는 텍스처 입방체 배열 자원, 그리고 BufferEx필드에 해당하는 확장 버퍼 자원이다. 텍스처 입방체는 Texture2D 배열 자원을 입방체 버퍼로 재해석하기 위한 것으로, 이에 의해 HLSL 프로그램은 특화된 고유(Intrinsic) 명령들을 이용해서 텍스처를 추출할 수 있게 된다.

텍스처 입방체 배열도 마찬가지로, 이것은 텍스처 입방체 자원과 같은 방식으로 해석되는 배열이다.

이처럼 자원 뷰라는 것이 어떤 자원의 자료를 특정 목적을 위해 또 다른 시각으로 볼 수 있게 한다는 점이다.

 

BufferEx 필드에 해당하는 새 자원 종류는 주어진 자원 버퍼를 하나의 생(Raw) 버퍼로 볼 수 있게 한다. 이를 통해서 HLSL은 셰이더 프로그램 안에서 주어진 자원을 자신의 임의대로 해석할 수 있다. 

 

4. 순서 없는 접근 뷰의 구성 설정

이 뷰의 서술 구조체 역시 표준적인 패턴을 따른다.

순서 없는 자원 뷰는 셰이더 자원 뷰에 비해 적은 종류의 자원들을 지원한다. 

그러나 이 뷰에는 버퍼 자원 구성을 위한 옵션이 더 많다. 버퍼들 중에서는 특별한 목적을 위해 생성하는 독특한 종류의 것들이 있다.

이 자원 뷰 서술 구조체 안에는 버퍼를 추가 버퍼와 소비 버퍼로 사용하기 위한 플래그들과 버퍼 객체가 내장 카운터를 제공하게 만드는 플래그도 있다.

 

728x90