我有一个呈现图像的计算着色器。图像基本上是成品框架。
我想在屏幕上渲染上述图像。做到这一点的最明显方法是直接渲染到Frambuffer而不是渲染此图像。但是,我被告知,这需要在机器上设置storage
位,这不是我的机器。
下一个最好的事情是将图像复制到Framebuffer。这需要在帧缓冲映像上设置target
位,幸运的是,这是我的机器上的情况。
但是,当我尝试将其复制到Framebuffer中时,Vulkan给出了访问错误,称Framebuffer未经初始化。
AccessError {
error: ImageNotInitialized { requested: PresentSrc },
command_name: "vkCmdCopyImage",
command_param: "destination", command_offset: 4
}
如果重要的话,我正在使用与Vulkan的Rust Bindings。代码非常笨重,整个内容都可以在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()?;
我知道我可以在图像上渲染四分之一,这是我现在正在做的事情,但是这是很多笨重的代码,这些代码却没有太大的作用。
Doc说有关ImageNotInitialized
:
尝试使用图像而不从"未定义"或"原始化"布局过渡。