2017-08-20 4 views
-1

je veux créer un tableau de l'objet ubo dans mon CPU le mettre à jour, puis le télécharger sur le GPU dans un appel comme ça. (pour l'exemple disons que je n'ai que deux objets).créer tableau de ubo et présenter chacun à la fois à son 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); 

J'ai créé un tampon de la taille de deux ubo. (la création fonctionne, car elle fonctionne avec ubo en taille 1).

 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); 

et que je mets un décalage dans la création de jeu de descripteur:

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

le décalage est la taille de UniformBufferObject * l'indice de l'objet.

chaque objet ont est propre descriptorsetLayout mais le samepipline

lorsque je tente de mettre à jour l'ensemble de descripteurs je reçois l'erreur:

enter image description here

je ne pourrais pas trouver enum Aligement qui précisent que information.

Si quelqu'un sait comment faire cela, cela aidera beaucoup.

merci.

Répondre

2

Je n'ai trouvé aucune énumération d'aligment spécifiant cette information.

Vulkan n'est pas OpenGL; vous n'utilisez pas d'enums pour interroger les limites. Les limites sont définies par la structure VkPhysicalDeviceLimits, interrogée via vkGetPhysicalDeviceProperties/2KHR.

L'erreur vous indique exactement quelle limite vous avez violée: minUniformBufferOffsetAlignment. Votre implémentation a défini cette valeur sur 0x100, mais l'offset fourni était insuffisant pour cela.

De même, vous ne devez pas mapper des tampons au milieu d'une image. Toute cartographie dans Vulkan est "persistante"; Mappez-le une fois et laissez-le ainsi jusqu'à ce que vous soyez prêt à supprimer la mémoire.

+0

comment puis-je obtenir cet alinment? son erreur de lien avec la méthode normale et quand j'essaie d'utiliser: auto func = (PFN_vkGetPhysicalDeviceProperties2KHR) vkGetDeviceProcAddr (* this, "vkGetPhysicalDeviceProperties2KHR"); Ce n'est pas non plus un travail. –

+0

@OriYampolsky: Votre implémentation ne prend peut-être pas en charge cette extension. La fonction principale s'appelle 'vkGetPhysicalDeviceProperties'. –

+1

@OriYampolsky la version 2KHR a besoin d'une extension d'instance "VK_KHR_get_physical_device_properties2" –