从计算着色器访问帧缓冲区

时间:2018-04-01 15:29:24

标签: graphics rust shader vulkan compute-shader

我有一个渲染图像的计算着色器。图像基本上是完成的帧。

我想在屏幕上呈现所述图像。最明显的方法是不是渲染到这个图像,而是直接渲染到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()?;

我知道我可以渲染到图像上的四边形,这就是我现在正在做的事情,但它是很多庞大的代码并没有做太多。

1 个答案:

答案 0 :(得分:2)

docImageNotInitialized

  

尝试使用图像而不将其转换为" undefined"或"预先初始化"布局首先。