在命令缓冲区执行之间清除非瞬态图像

问题描述

我最近开始学习通过 Vulkano crate 将 Vulkan 与 Rust 结合使用,并且遇到了一些对我来说没有多大意义的事情。

在 Mandlebrot Set 图像创建示例中,作者构建了一个命令缓冲区,该缓冲区调度计算着色器,然后将 StorageImage内容复制到缓冲区,然后将其保存到图像中:

    let mut builder = AutoCommandBufferBuilder::new(device.clone(),queue.family()).unwrap();
    builder
        .dispatch(
            [1024 / 8,1024 / 8,1],compute_pipeline.clone(),set.clone(),(),vec![],)
        .unwrap()
        .copy_image_to_buffer(image.clone(),buf.clone())
        .unwrap();
    let command_buffer = builder.build().unwrap();

    let finished = command_buffer.execute(queue.clone()).unwrap();
    finished
        .then_signal_fence_and_flush()
        .unwrap()
        .wait(None)
        .unwrap();

    let buffer_content = buf.read().unwrap();
    let image = ImageBuffer::<Rgba<u8>,_>::from_raw(1024,1024,&buffer_content[..]).unwrap();
    image.save("image.png").unwrap();

(我必须自己添加 vec![],看起来 dispatch() 在编写示例时少了一个参数)。

我不明白以下代码有何不同:

    let mut builder = AutoCommandBufferBuilder::new(device.clone(),vec![]
        )
        .unwrap();
    let command_buffer = builder.build().unwrap();

    let finished = command_buffer.execute(queue.clone()).unwrap();
    finished
        .then_signal_fence_and_flush()
        .unwrap()
        .wait(None)
        .unwrap();

    let mut builder = AutoCommandBufferBuilder::new(device.clone(),queue.family()).unwrap();
    builder
        .copy_image_to_buffer(image.clone(),&buffer_content[..]).unwrap();
    image.save("image.png").unwrap();

我所做的只是将命令执行分为两部分:首先是计算着色器,然后是副本。

然而,第二个代码示例的结果是一个空图像,而第一个示例给出了预期的结果。由于 StorageImage 是明确的非“瞬态”,我想不出图像在命令执行之间似乎被清除的原因。

如果有人有任何想法,我们将不胜感激,我刚刚开始使用图形方面的东西,这一切都非常令人困惑。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)