微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我最近开始学习通过 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 举报,一经查实,本站将立刻删除。