我想在我的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但是相同的线条
当我尝试更新描述符集时,我得到错误:
我无法找到指定该信息的任何aligment枚举。
如果有人知道该怎么做,那将有很多帮助。
感谢。
答案 0 :(得分:2)
我无法找到指定该信息的任何aligment枚举。
Vulkan不是OpenGL;你没有使用枚举来查询限制。限制由VkPhysicalDeviceLimits
结构定义,通过vkGetPhysicalDeviceProperties/2KHR
查询。
错误告诉您确切违反了哪个限制:minUniformBufferOffsetAlignment
。您的实现将此设置为0x100,但您提供的偏移量不足以满足此要求。
此外,您不应该在帧的中间映射缓冲区。 Vulkan中的所有映射都是&#34; persistent&#34 ;;将它映射到并保持这种状态,直到您准备好删除内存为止。