2017-08-20 5 views
-1

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:

enter image description here

könnte nicht ich irgendwelche aligment Enum finden, die festlegen, dass Information.

Wenn jemand weiß, wie es geht, wird es viel helfen.

danke.

Antwort

2

Ich konnte keine Alignment enum finden, die diese Informationen angeben.

Vulkan ist nicht OpenGL; Sie verwenden keine Enums, um Limits abzufragen. Grenzen werden durch die Struktur definiert, abgefragt über vkGetPhysicalDeviceProperties/2KHR.

Der Fehler sagt Ihnen genau, welche Einschränkung Sie verletzt haben: minUniformBufferOffsetAlignment. Ihre Implementierung setzte dies auf 0x100, aber der von Ihnen bereitgestellte Offset war dafür nicht ausreichend.

Außerdem sollten Sie keine Puffer in der Mitte eines Rahmens zuordnen. Alle Kartierungen in Vulkan sind "hartnäckig"; map es einmal und lassen Sie es so, bis Sie bereit sind, den Speicher zu löschen.

+0

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. –

+0

@OriYampolsky: Vielleicht unterstützt Ihre Implementierung diese Erweiterung nicht. Die Kernfunktion heißt 'vkGetPhysicalDeviceProperties'. –

+1

@OriYampolsky die 2KHR-Version benötigt eine Instanzerweiterung "VK_KHR_get_physical_device_properties2" –

Verwandte Themen