- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
那么如何使用 IASetVertexBuffers
方法更新绑定(bind)到设备对象中的顶点缓冲区中的值?在调用 Draw()
和 Present()
之前还会更改此缓冲区中的值吗?图像也会根据缓冲区中的这些新值进行更新吗?
最佳答案
要通过 CPU 更新顶点缓冲区,您必须首先创建一个允许 CPU 写入的动态顶点缓冲区。为此,调用 ID3D11Device::CreateBuffer
并将 Usage
设置为 D3D11_USAGE_DYNAMIC
并将 CPUAccessFlags
设置为 D3D11_CPU_ACCESS_WRITE
。示例:
D3D11_BUFFER_DESC desc;
ZeroMemory( &desc, sizeof( desc ) );
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.ByteWidth = size;
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
d3dDevice->CreateBuffer( &desc, initialVertexData, &vertexBuffer );
现在您有了一个动态顶点缓冲区,您可以使用 ID3D11DeviceContext::Map 更新它和 ID3D11DeviceContext::Unmap .示例:
D3D11_MAPPED_SUBRESOURCE resource;
d3dDeviceContext->Map( vertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource );
memcpy( resource.pData, sourceData, vertexDataSize );
d3dDeviceContext->Unmap( vertexBuffer, 0 );
其中 sourceData 是您要放入缓冲区的新顶点数据。
这是更新顶点缓冲区的一种方法,您可以在其中上传一整套新的顶点数据并丢弃以前的内容。还有其他方法可以更新顶点缓冲区。例如,您可以保留当前内容并只修改某些值,或者您可以只更新顶点缓冲区的某些区域而不是整个内容。
每种方法都有自己的用法和性能特征。这完全取决于您的数据是什么以及您打算如何使用它。 This NVIDIA presentation就针对不同用途更新缓冲区的最佳方式提供了一些建议。
是的,您需要在 Draw()
和 Present()
之前调用它和 IASetVertexBuffers
以查看当前的更新结果框架。在调用 IASetVertexBuffers
之前,您不一定需要更新顶点缓冲区内容。这些可以按任何顺序排列。
关于c++ - Direct3D c++ api 如何更新顶点缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26453773/
我是一名优秀的程序员,十分优秀!