[英]Vulkan Storage Buffer Memory Mapping
我正在重构和重写VkGuide制作的指南,以符合我对引擎的想法。 我正在使用VMA来处理我的内存需求。
在将内存映射代码重构为更易于阅读的内容时,我偶然发现了一个奇怪的(?)问题:
原始代码:
Renderer fields
//-------------------------------------------------
struct ObjectData { matrix4 transform };
inline Frame& frame(); // Get current frame in flight
std::vector<RenderableObject> renderables;
//--------------------------------------------------
Drawing code
void* object_data;
vmaMapMemory(allocator, frame().object_buffer.allocation, &object_data);
auto* ssbo = static_cast<ObjectData*>(object_data);
for (int i = 0; i < renderables.size(); i++) {
auto& object = renderables[i];
ssbo[i].model_matrix = object.transform;
}
vmaUnmapMemory(allocator, frame().object_buffer.allocation)
以及重构和模板化的命名空间局部函数:
struct AllocatedBuffer { VkBuffer buffer, VmaAllocation allocation };
template <typename T, typename Func>
void effect_mmap(VmaAllocator& allocator, AllocatedBuffer& buffer, Func&& effect)
{
void* object_data;
vmaMapMemory(allocator, buffer.allocation, &object_data);
auto* t_pointer = static_cast<T*>(object_data);
effect(*t_pointer);
vmaUnmapMemory(allocator, buffer.allocation);
}
我的相机位置和其他一切似乎都在移动并且工作不正常。 以下显示了用法(现在应该替换原始代码):
MemoryMapper::effect_mmap<ObjectData>(allocator, frame().object_buffer, [&](ObjectData& data) {
for (auto& object : renderables) {
data.model_matrix = object.transform;
}
});
这是正确的(纹理仍然无效,我不知道为什么,那是另一天)和之后:正确和不正确。
您的使用示例只设置缓冲区中的第一个SSBO,因为data
是*t_pointer
并且永远不会更改。 更改您的代码以直接传递t_pointer
,更改回调的类型,然后您可以将其用作
MemoryMapper::effect_mmap<ObjectData>(allocator, frame().object_buffer, [&](ObjectData* data) {
for (auto& object : renderables) {
data->model_matrix = object.transform;
data++;
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.