Ich möchte Array von Ubo-Objekt in meiner CPU zu aktualisieren, aktualisieren Sie es und laden Sie es dann auf die GPU in einem Anruf so. (Für das Beispiel haben wir zum Beispiel nur zwei Objekte).Array von Ubo erstellen und jeweils auf einmal zu seinem Shader
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);
Ich habe einen Puffer mit der Größe von zwei Ubo erstellt. (Das Erstellen funktioniert, weil es mit UBO in der Größe 1 funktioniert).
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);
und als i ein in der Deskriptorenmenge Schaffung Offset gesetzt:
vk::DescriptorBufferInfo bufferInfo;
bufferInfo.buffer = uniformBuffer;
bufferInfo.offset = offsetForUBO;
bufferInfo.range = sizeof(UniformBufferObject);
der Offset ist die Größe der UniformBufferObject * der Index des Objekts.
jedes Objekt haben wird eigener descriptorsetLayout aber die samepipline
wenn ich versuche, den Deskriptorenmenge i die Fehler zu aktualisieren:
könnte nicht ich irgendwelche aligment Enum finden, die festlegen, dass Information.
Wenn jemand weiß, wie es geht, wird es viel helfen.
danke.
wie kann ich dieses alinment bekommen? Sein Verbindungsfehler mit der normalen Methode und wenn ich versuche zu verwenden: auto func = (PFN_vkGetPhysicalDeviceProperties2KHR) vkGetDeviceProcAddr (* dies, "vkGetPhysicalDeviceProperties2KHR"); es funktioniert auch nicht. –
@OriYampolsky: Vielleicht unterstützt Ihre Implementierung diese Erweiterung nicht. Die Kernfunktion heißt 'vkGetPhysicalDeviceProperties'. –
@OriYampolsky die 2KHR-Version benötigt eine Instanzerweiterung "VK_KHR_get_physical_device_properties2" –