本文共 1110 字,大约阅读时间需要 3 分钟。
例如我们要在同一副精灵纹理中创建一套精灵动画,我们需要经常更改缓存中的顶点位置信息。动态缓存对于我们需要修改一块缓存中的内容的这种情况来说是很合适的。 不推荐多次创建和销毁静态缓存块,特别是逐帧这样做,你应该使用动态缓存来做这样的任务。
我们可以通过调用设备的CreateBuffer函数来创建顶点缓存,该函数以前已经介绍过。不同的是,我们将子资源参数(第二个参数)设置为 NULL,因为我们会对顶点缓存的内容进行动态更新,从而在创建时不需要设置任何数据。当动态缓存创建后,我们能够在任何时候对它进行更新。
为了创建一块动态顶点缓存,我们首先需要填充缓存描述对象:
- Usage:设置使用标识为 D3D11_USAGE_DYNAMIC 来允许我们的缓存能够通过 CPU 来动态更新。在之前的 Demo 中对于静态缓存我们设置的使用标识是 D3D11_USAGE_DEFAULT。
- CPUAccessFlags:设置 CPU 访问标识为 D3D11_CPU_ACCESS_WRITE。这是为了让 CPU 能够对 GPU 中的资源进行写访问。其它的访问标识还有读访问和读写访问,但是在本 Demo 中我们不需要 CPU 读任何东西。
- BindFlags:像以前那样设为D3D11_BIND_VERTEX_BUFFER就可以了。
- ByteWidth:我们这个纹理有24帧,每帧有6个顶点,所以按实际顶点个数计算即可。
D3D11_BUFFER_DESC vertexDesc; ZeroMemory( &vertexDesc, sizeof( vertexDesc ) ); vertexDesc.Usage = D3D11_USAGE_DYNAMIC; vertexDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; const int sizeOfSprite = sizeof( VertexPos ) * 6; const int maxLetters = 24; vertexDesc.ByteWidth = sizeOfSprite * maxLetters; d3dResult = d3dDevice_->CreateBuffer( &vertexDesc, 0, &vertexBuffer_ );
转载地址:http://ojyii.baihongyu.com/