Direct3D c ++ api如何更新顶点缓冲区?

The*_*mer 0 c++ windows graphics direct3d directx-11

那么如何使用IASetVertexBuffers方法更新绑定到设备对象的顶点缓冲区中的值?也将在此缓冲区变化值调用之前Draw()Present()?还会根据缓冲区中的这些新值更新图像吗?

meg*_*dan 7

要通过CPU更新顶点缓冲区,必须首先创建一个允许CPU写入的动态顶点缓冲区.要做到这一点,调用ID3D11Device::CreateBufferUsage设置为D3D11_USAGE_DYNAMICCPUAccessFlags设置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 );
Run Code Online (Sandbox Code Playgroud)

现在你有了一个动态顶点缓冲区,你可以使用ID3D11DeviceContext :: MapID3D11DeviceContext :: Unmap来更新它.例:

D3D11_MAPPED_SUBRESOURCE resource;
d3dDeviceContext->Map( vertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource );
memcpy( resource.pData, sourceData, vertexDataSize );
d3dDeviceContext->Unmap( vertexBuffer, 0 );
Run Code Online (Sandbox Code Playgroud)

其中sourceData是您要放入缓冲区的新顶点数据.

这是一种更新顶点缓冲区的方法,您可以在其中上传一组全新的顶点数据并丢弃以前的内容.还有其他方法可以更新顶点缓冲区.例如,您可以保留当前内容并仅修改某些值,或者您只能更新顶点缓冲区的某些区域而不是整个内容.

每种方法都有自己的用法和性能特征.这完全取决于您的数据是什么以及您打算如何使用它.这个NVIDIA演示文稿提供了一些关于更新缓冲区以满足不同用途的最佳方法的建议.

是的,你会希望把这个和IASetVertexBuffers之前Draw()Present()看到更新的结果对当前帧.在调用之前,您不一定需要更新顶点缓冲区内容IASetVertexBuffers.这些可以按任何顺序排列.