Direct3D顶点缓冲区使用类型、性能和C++ AMP?

3

我对direct3d和图形编程一般都很陌生,我的程序每帧应用非平凡计算后更改顶点,根据这个 Direct3D编程技巧

我应该为这样的任务使用动态缓冲区,但它说这会影响性能,通过搜索网络我发现了 更新顶点缓冲区的最快方法

向下滚动到Xoofx的回答(SharpDX的设计师),他认为更新子资源比使用动态缓冲区更好,据我所知,只有默认缓冲区才会使用更新子资源。

我应该选择哪种用法?什么是暂存(staging)?

如果我决定使用C++ AMP来进行计算(我知道它将GPU作为处理器使用),有没有办法将缓冲区使用设置为默认并仍然可以通过C++ AMP访问CPU?

1个回答

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_RESOURCE和UNORDERED_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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接