创建ubo数组并一次向其着色器呈现每个ubo

时间:2017-08-20 16:08:56

标签: vertex-shader vulkan uniform

我想在我的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的缓冲区。 (创建工作因为它与大小为1的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但是相同的线条

当我尝试更新描述符集时,我得到错误:

enter image description here

我无法找到指定该信息的任何aligment枚举。

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

感谢。

1 个答案:

答案 0 :(得分:2)

  

我无法找到指定该信息的任何aligment枚举。

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

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

此外,您不应该在帧的中间映射缓冲区。 Vulkan中的所有映射都是&#34; persistent&#34 ;;将它映射到并保持这种状态,直到您准备好删除内存为止。