问题描述
我最近开始学习通过 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 (将#修改为@)