如何解决在命令缓冲区执行之间清除非瞬态图像
我最近开始学习通过 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 举报,一经查实,本站将立刻删除。