Resource (자원)
반응형
dx10에서의 자원은 버퍼와 텍스쳐의 두가지 타입이 있다.
msdn을 참고해 보면 아래와 같다.
ID3D10Resource Interface
A resource interface provides common actions on all resources.
IUnknownID3D10DeviceChild
ID3D10Resource
즉, 모든 자원에 대한 공통 기능은 ID3D10Resource 인터페이스로 구현된다는 것을 알 수 있다.
이 인터페이스를 상속받아구현된 인터페이스들로는 ID3DBuffer, ID3D10TextureXD, ID3D10TextureCuber가 있다.
자원은 비디오 메모리에 존재하게 된다.
자원의 생성시에는 Usage와 CPUAcessFlags를 설정할 수 있다.
Usage
CPU와 GPU가 각각 자원을 읽기와 쓰기 관점에서 어떻게 접근하는지.
CPUAccessFlags
자원에 대한 CPU의 접근 권한을 명시.
리소스를 생성하고 나서 사용하기 위해서는 뷰를 만들고 바인딩을 시켜야 한다.
모든 데이터는 각 스테이지가 적절히 해석할 수 있는 형태로 스테이지에게 제공해야 한다.
뷰가 바로 이런 일을 해주는 녀석이다.
뷰는 스테이지가 인식할 수 있도록 데이터를 포장한다.
렌더타겟뷰, 깊이스텐실뷰, 세이더 자원뷰가 이들이다.
각 뷰의 인터페이스는 아래와 같다.
render target view - ID3D10RenderTargetView CreateRenderTargetView
depth stencil view - ID3D10DepthStencilView CreateDepthStencilView
shader resource view - ID3D10ShaderResourceView CreateShaderResourceView
렌더타겟뷰와 깊이스텐실뷰는 OMSetRenderTargets을 사용하여 출력병합기(om) 스테이지에 바인딩 하고
세이더 자원뷰는 (vs/gs/ps)SetShaderResources함수를 호출하여 정점세이더, 기하세이더, 픽셀세이더 스테이지에 바인딩된다.
뷰 바인딩은 자원이 텍스쳐인 경우 사용되며 자원이 버퍼인 경우에는 다음과 같은 함수가 사용된다.
정점버퍼 바인딩 - IASetVertexBuffers
인덱스버퍼 바인딩 - IASetIndexBuffers
상수버퍼 바인딩 - SetConstantBuffers
dx10에서는 자원을 생성할 때 자원이 시스템 메모리나 비디오 메모리 등의 어떤 종류의 메모리에 존재하도록 할지를 설정하지 않는다.
단지 Usage만 지정하고 자원이 존재하는 메모리 풀은 내부적으로 장치의 메모리 관리자가 결정한다.
Usage는 자원의 생성시에 지정할 수 있다.
ex)
D3D10_TEXTURE2D_DESC tex2dDesc;
tex2dDesc.Width = desc_.width_;
tex2dDesc.Height = desc_.height_;
tex2dDesc.MipLevels = 1;
tex2dDesc.ArraySize = 1;
tex2dDesc.Format = deviceSetting->d3d10_.autoDepthStencilFormat_;
tex2dDesc.BindFlags = D3D10_BIND_DEPTH_STENCIL;
tex2dDesc.CPUAccessFlags = 0;
tex2dDesc.MiscFlags = 0;
tex2dDesc.SampleDesc = deviceSetting->d3d10_.sd_.SampleDesc;
tex2dDesc.Usage = D3D10_USAGE_DEFAULT;
자원은 CPU 또는 GPU가 접근할 수 있다.
CPU가 자원을 접근하기 위해서는 Map함수를 사용하고 GPU가 자원을 접근하기 위해서는
CopySubresourcRegion, CopyResource, UpdateSubresource함수를 사용한다.
접근은 많이 허용될수록 성능이 떨어진다는 것을 유의해야 한다.
위의 예에서는 D3D10_USAGE_DEFAULT를 지정하였다.
이 외에도 Uage에 대한 옵션을 알아보자면 아래와 같다.
D3D10_USAGE_DEFAULT : GPU가 자원의 읽기 및 쓰기를 할 수 있도록 한다.
D3D10_USAGE_IMMUTABLE : GPU의 READ ONLY, CPU는 접근불가.
D3D10_USAGE_DYNAMIC : GPU의 READ ONLY, CPU의 WRITE ONLY
이 옵션은 CPU가 매 프레임을 그릴 때에 자원을 매번 수정하는 동적자원일 경우 적합.
D3D10_USAGE_STAGING : GPU의 데이터를 CPU로 보내는 경우 사용.
Usage의 지정에 있어서 고려해야 할 것은 자원이 갱신되는 정도이다.
. 생성이후 불변인 경우 - IMMUTBLE로 지정.
. 갱신 정도가 프레임당 1번 미만인 경우 - DEFAULT 지정.
. 매 프레임당 한번이상 갱신되는 경우. - DYNAMIC로 지정.
'Study > Directx 10' 카테고리의 다른 글
dx10 파이프라인. (0) | 2010.07.08 |
---|---|
dx10에서의 multi stream single index rendering & multi stream multi index rendering (0) | 2010.07.07 |
듀얼모니터.. 빌어먹을 dxut (0) | 2010.06.13 |
IDXGIFactory::MakeWindowAssociation Method (Windows) (0) | 2010.06.05 |
반사 (0) | 2010.06.04 |
TAGS.