【问题标题】:Direct3d vertex buffer usage type, performance and c++amp?Direct3d顶点缓冲区使用类型、性能和c++amp?
【发布时间】:2013-05-06 18:25:28
【问题描述】:
我是 direct3d 和图形编程的新手,我正在编写的程序在每帧应用非平凡计算后每帧更改一次顶点,根据Direct3d programming tips
我应该为这样的任务使用动态缓冲区,但它说它的性能是可以预期的,搜索我找到的网络Fastest way to update vertex buffer
根据他的说法,向下滚动到 Xoofx 答案(Sharpdx 的设计师)更新子资源比使用动态缓冲区更好,据我所知,更新子资源仅用于默认缓冲区。
我应该使用哪种用法以及什么是(分期)?
如果我决定使用 C++ AMP 进行计算(我知道它使用 gpu 作为处理器),有没有办法将缓冲区使用设置为默认值,并且仍然使用 C++ AMP 通过 cpu 访问它?
【问题讨论】:
标签:
winapi
graphics
direct3d
direct3d11
c++-amp
【解决方案1】:
您的程序可以使用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() 函数支持反向操作,从
数组。与获取设备时一样,必须查询返回的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));