Direct3d顶点缓冲区使用类型,性能和c ++放大器?

时间:2013-05-06 18:25:28

标签: winapi graphics direct3d direct3d11 c++-amp

我是direct3d和图形编程的新手,我正在编写的程序在每帧应用非平凡计算后每帧更改一次顶点,根据Direct3d programming tips

我应该使用动态缓冲区来完成这样的任务,但它表示它的性能是可以预期的,我在网上搜索Fastest way to update vertex buffer

向下滚动到Xoofx的答案(Sharpdx的设计师)根据他更新子资源比使用动态缓冲区更好,据我所知更新子资源仅用于默认缓冲区。

我应该使用哪种用法以及什么是(分段)?

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

1 个答案:

答案 0 :(得分: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));