繁体   English   中英

Vulkan 存储缓冲区内存映射

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM