【问题标题】: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_RESOURCEUNORDERED_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));
    

    【讨论】:

      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多