创建 ubo 数组并一次将每个呈现给它的着色器

create array of ubo and present each at a time to its shader

我想在我的 cpu 中创建 ubo 对象数组更新它,然后像那样在一次调用中将它上传到 gpu。 (例如,假设我只有两个对象)。

    std::vector<UniformBufferObject> ubo(m_allObject.size());

    int index = 0;
    for (RenderableObject* rendObj : m_allObject)
    {
        ubo[index].proj = m_camera->getProjection();
        ubo[index].view = m_camera->getView();
        ubo[index].model = rendObj->getTransform().getModel();
        ubo[index].proj[1][1] *= -1;
        index++;
    }

    int size = sizeof(UniformBufferObject) *m_allObject.size();
    void* data;
    m_instance->getLogicalDevice().mapMemory(ykEngine::Buffer::m_uniformBuffer.m_bufferMemory, 0, size , vk::MemoryMapFlags(), &data);
    memcpy(data, ubo.data(), size);
    m_instance->getLogicalDevice().unmapMemory(ykEngine::Buffer::m_uniformBuffer.m_bufferMemory);

我创建了一个大小为两个 ubo 的缓​​冲区。 (create 确实有效,因为它确实适用于大小为 ubo 的情况)。

        vk::DeviceSize bufferSize = sizeof(UniformBufferObject) * 2;

        createBuffer(logicalDevice, bufferSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, m_uniformBuffer.m_buffer, m_uniformBuffer.m_bufferMemory);

然后我在描述符集创建中添加了一个偏移量:

    vk::DescriptorBufferInfo bufferInfo;
    bufferInfo.buffer = uniformBuffer;
    bufferInfo.offset = offsetForUBO;
    bufferInfo.range = sizeof(UniformBufferObject);

偏移量是UniformBufferObject的大小*对象的索引。

每个对象都有自己的 descriptorsetLayout 但相同的管道

当我尝试更新描述符集时出现错误:

我找不到任何指定该信息的对齐枚举。

如果有人知道该怎么做,那将大有帮助。

谢谢。

i couldnt find any aligment enum that specify that information.

Vulkan 不是 OpenGL;您不使用枚举来查询限制。限制由 VkPhysicalDeviceLimits 结构定义,通过 vkGetPhysicalDeviceProperties/2KHR.

查询

该错误准确地告诉您您违反了哪个限制:minUniformBufferOffsetAlignment。您的实现将其设置为 0x100,但您提供的偏移量不足以满足此要求。

此外,您不应在帧中间映射缓冲区。 Vulkan 中的所有映射都是 "persistent";将其映射 一次 并保持这种状态,直到您准备好删除内存。