在Vulkan中创建统一缓冲区

时间:2019-02-05 22:50:51

标签: graphics vulkan

我在Vulkan中绘制网格时遇到问题。 我想将以下形式的UniformBufferObject绑定到对象。

void mainLoop() {
     ..
     vulkanDrawing.Draw();
     plane.UpdateUniformBuffers();
     ..
}

要获取currentImage,我创建了一个方法SetCurrentImage(uint32_t currentImage)。 SetCurrentImage是从VulkanDrawing :: Draw()方法设置的。 当前图像在UpdateUniformBuffers()中使用。 如果运行此应用程序,则只会显示黑屏。 从那以后,我想看一个正方形。 过去,我在VulkanDrawing :: Draw()中使用imageIndex参数调用UpdateUniformBuffers方法。 我认为这可能是栅栏或信号灯的问题。但是我不知道该如何解决。 最终我会使用错误的体系结构吗?

我附上了重要的方法:

void CVulkanDrawing::Draw()
{
    vkWaitForFences(m_LogicalDevice.getDevice(), 1, &inFlightFences[currentFrame], VK_TRUE, std::numeric_limits<uint64_t>::max());
    vkResetFences(m_LogicalDevice.getDevice(), 1,inFlightFences[currentFrame]);

    uint32_t imageIndex;
    vkAcquireNextImageKHR(m_LogicalDevice.getDevice(), m_Presentation.GetSwapChain(), std::numeric_limits<uint64_t>::max(), imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);

    for(unsigned int i = 0; i < m_VulkanMesh.size(); i++)
    {
        //m_VulkanMesh.at(i).UpdateUniformBuffers(imageIndex);
        m_VulkanMesh.at(i).SetCurrentImage(imageIndex);
    }

    VkSubmitInfo submitInfo = {};

    ...

    currentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT;
}

void CVulkanMesh::UpdateUniformBuffers()
{
    ...

    vkMapMemory(m_LogicalDevice.getDevice(), uniformBuffersMemory[this->m_CurrentImage], 0, sizeof(ubo), 0, &data);
    memcpy(data, &ubo, sizeof(ubo));
    vkUnmapMemory(m_LogicalDevice.getDevice(), uniformBuffersMemory[this->m_CurrentImage]);
}

void CVulkanMesh::SetCurrentImage(uint32_t currentImage)
{
     this->m_CurrentImage = currentImage;
}

我另外创建了一个分支,名为:https://github.com/dekorlp/VulkanWrapper/tree/VulkanTest

希望您能帮助我:)

最诚挚的问候

像素

0 个答案:

没有答案