我在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
希望您能帮助我:)
最诚挚的问候
像素