Differences of DirectX11 D3D11_MAP
Differences of DirectX11 D3D11_MAP
我有一个顶点缓冲区,它的某些部分每帧只需要更新一次,所以我用D3D11_CPU_ACCESS_WRITE
将其创建为D3D11_USAGE_DYNAMIC
。
由于有很多顶点(大约150k),我不想在整个缓冲区上迭代,只想在标记为要更新的部分上迭代。
为此,我用DirtyVertexBuffer
标志标记每个"区域",然后跳过未标记的区域。为了更新缓冲区,我使用D3D11_MAP_WRITE_NO_OVERWRITE
。代码为:
VertexType *vertices;
D3D11_MAPPED_SUBRESOURCE mappedResource;
Vertex *vertex;
HRESULT result;
result = context->Map(m_vertexBuffer, 0, D3D11_MAP_WRITE_NO_OVERWRITE, 0, &mappedResource);
if (FAILED(result))
return;
vertices = (DirectX::VertexPositionNormalTexture*)mappedResource.pData;
for (auto &material : materials) {
if ((material.dirty & Material::Dirty::VertexBuffer) == 0) continue;
material.dirty &= ~Material::Dirty::VertexBuffer;
// Update vertex data
}
// release the access to the buffer
context->Unmap(m_vertexBuffer, 0);
我的问题是:为什么这里需要D3D_MAP_WRITE_NO_OVERWRITE
而不是D3D_MAP_WRITE_DISCARD
?
如果使用后者,则顶点缓冲区似乎为"零"(仅渲染更改的区域)。MSDN表示:
D3D11_MAP_WRITE_DISCARD
资源被映射用于写入;资源的先前内容将是未定义的。
D3D11_MAP_WRITE_NO_OVERWRITE
资源被映射用于写入;无法覆盖资源的现有内容(请参阅备注)。
但既然我映射了资源,难道不应该将整个缓冲区从VRAM复制到系统RAM,然后在我取消映射时返回到VRAM吗?
经过思考,我想我找到了答案,有人能证实吗?
当使用D3D11_USAGE_DYNAMIC
和D3D11_CPU_ACCESS_WRITE
时,CPU将只能访问写入(好,这很清楚)。然后,在每次调用ID3D11DeviceContext::Map
时,都会有一个临时缓冲区(用_aligned_malloc
创建的东西),其状态是未定义的。
然后,当使用D3D11_MAP_WRITE_DISCARD
时,前一个顶点缓冲区将被丢弃,这意味着只保留更改的部分,因为它们存在于该临时缓冲区中。
另一方面,在使用D3D11_MAP_WRITE_NO_OVERWRITE
时,保留先前的顶点缓冲区,并且只写入更改的部分。
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- D3D11-将混合权重和索引传递到顶点着色器
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?