2017-08-20 13 views
-1

私のCPUにuboオブジェクトの配列を作成して、そのような呼び出しでGPUにアップロードします。 (例では、私は2つだけのオブジェクトを持っていると言うことができます)。uboの配列を作成し、それぞれのシェーダに一度に表示する

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

私は2つのuboのサイズのバッファを1つ作成しました。 (それはサイズ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ですが、私は記述子セットを更新しようとすると、samepipline

私はエラーを取得:

enter image description here

私はそれを指定する任意のaligment列挙型を見つけるcouldntの情報。

誰かがそれを行う方法を知っていれば、それは大いに役立つでしょう。

ありがとうございました。

答えて

2

この情報を指定する任意の列挙型列挙型を見つけることができませんでした。

VulkanはOpenGLではありません。クエリの制限にenumを使用しません。制限は、vkGetPhysicalDeviceProperties/2KHRによって照会されたVkPhysicalDeviceLimits構造体によって定義されます。

このエラーは、違反した制限を正確に示しています。minUniformBufferOffsetAlignment。あなたの実装はこれを0x100に設定しましたが、あなたの提供されたオフセットはこれには不十分でした。

また、フレームの途中でバッファをマップしないでください。 Vulkanのすべてのマッピングは「永続的」です。 を一度にマップし、メモリを削除する準備が整うまでそのままにしておきます。

+0

どのように私はこの人格を得ることができますか?通常のメソッドとそのリンクエラーと私が使用しようとすると:auto func =(PFN_vkGetPhysicalDeviceProperties2KHR)vkGetDeviceProcAddr(* this、 "vkGetPhysicalDeviceProperties2KHR");その仕事も –

+0

@OriYampolsky:実装がその拡張機能をサポートしていない可能性があります。コア関数の名前は 'vkGetPhysicalDeviceProperties'です。 –

+1

@OriYampolsky 2KHR版にはインスタンス拡張子「VK_KHR_get_physical_device_properties2」が必要です –

関連する問題