gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:18:14 25 4
gpt4 key购买 nike

那么如何使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com