2013-05-06 4 views
3

난 Direct3D를 처음 사용하고 있는데, 일반적으로 그래픽 프로그래밍 내가 쓰고 프로그램 I는 작업 동적 버퍼를 사용한다 Direct3d programming tipsDirect3D 버텍스 버퍼 사용 유형, 성능 및 C++ amp? ,

이것에 따르면, 프레임 당 비 단순 계산을 적용한 후에, 프레임 당 한번 정점 변경 하지만 그 성능은 기대하고있다, 내가 찾은 웹을 검색 Fastest way to update vertex buffer

Xooofx 대답 (디자이너의 Sharpdx) 아래로 스크롤하여 하위 리소스를 업데이트하는 것은 동적 버퍼를 사용하는 것보다 낫다. 기본 버퍼에서만 사용됩니다.

어떤 사용법을 사용해야하며 무엇을 준비해야합니까?

계산을 수행하기 위해 C++ AMP를 사용하기로 결정했다면 (프로세서로 gpu를 사용하는 것으로 알고 있습니다.) 버퍼 사용을 기본값으로 설정하고 C++ AMP를 사용하여 CPU를 통해 액세스 할 수있는 방법이 있습니까?

답변

2

make_array() 함수를 사용하여 기존 Direct3D 버퍼와 연결된 C++ AMP 배열을 만들 수 있습니다.

template<typename T, int N> 
array<T,N> make_array(const extent& ext, IUnknown* buffer); 

Direct3D 버퍼는 ID3D11Buffer 인터페이스를 구현해야합니다. 원시보기 (D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS)를 지원하고 SHADER_RESOURCEUNORDERED_ACCESS 바인딩을 허용해야합니다. 버퍼 자체의 크기는 올바른 크기 여야하며 범위의 크기는 에 버퍼 유형의 크기를 곱한 값이어야합니다.

get_buffer() 함수는 역방향 연산을 지원하므로 의 Direct3D 버퍼 인터페이스를 배열로 가져옵니다. 장치를 가져올 때와 마찬가지로 반환 된 IUnknown은 원하는 인터페이스에 대해 쿼리해야합니다.

HRESULT hr = S_OK; 
array<int, 1> arr(1024); 
CComPtr<ID3D11Buffer> buffer; 
IUnknown* unkBuf = get_buffer(arr); 
hr = unkBuf->QueryInterface(__uuidof(ID3D11Buffer), reinterpret_cast<LPVOID*>(&buffer)); 
관련 문제