我是direct3d和图形编程的新手,我正在编写的程序在每帧应用非平凡计算后每帧更改一次顶点,根据Direct3d programming tips
我应该使用动态缓冲区来完成这样的任务,但它表示它的性能是可以预期的,我在网上搜索Fastest way to update vertex buffer
向下滚动到Xoofx的答案(Sharpdx的设计师)根据他更新子资源比使用动态缓冲区更好,据我所知更新子资源仅用于默认缓冲区。
我应该使用哪种用法以及什么是(分段)?
如果我决定使用C ++ AMP进行计算(我知道它使用gpu作为处理器)有没有办法将缓冲区使用设置为默认值并仍然使用C ++ AMP通过cpu访问它?
答案 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_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));