我有一个渲染图像的计算着色器。图像基本上是完成的帧。
我想在屏幕上呈现所述图像。最明显的方法是不是渲染到这个图像,而是直接渲染到frambuffer。然而,有人告诉我,这需要在帧缓冲区上设置storage
位,这在我的机器上不是这样。
然后,最好的事情是将图像复制到帧缓冲区。这需要在帧缓冲区图像上设置target
位,幸运的是在我的机器上就是这种情况。
但是,当我尝试复制到帧缓冲区时,Vulkan会给出一个访问错误,说帧缓冲区没有初始化。
AccessError {
error: ImageNotInitialized { requested: PresentSrc },
command_name: "vkCmdCopyImage",
command_param: "destination", command_offset: 4
}
如果重要,我正在使用Rust bindings给Vulkan。代码非常笨重,整个内容都可以在GitLab上找到。命令缓冲区创建如下:
let command_buffer = AutoCommandBufferBuilder::new(queue.device().clone(), queue.family())?
.clear_color_image(image.clone(), ClearValue::Float([1.0, 0.0, 0.0, 1.0]))?
.dispatch(
[(WIDTH / 16) as u32, (HEIGHT / 16) as u32, 1],
compute_pipeline.clone(),
set.clone(),
(),
)?
.copy_image(
image.clone(),
[0, 0, 0],
0,
0,
render_manager.images[next_image_index].clone(),
[0, 0, 0],
0,
0,
[WIDTH as u32, HEIGHT as u32, 1],
1,
)?
.build()?;
我知道我可以渲染到图像上的四边形,这就是我现在正在做的事情,但它是很多庞大的代码并没有做太多。