在 Vulkan 中调试黑色图像
Debugging a black image in Vulkan
我正在尝试在 Vulkan 中将场景渲染成图像,我想在该场景中某处漂浮的四边形上进行采样。
我的方法基本上是执行与将场景渲染成演示图像相同的步骤,只是我只有一个 RGBA8 格式的图像,而不是特定于演示的格式。然而,我所看到的只是一片黑暗。验证层打开并且不报告任何内容。使用 RenderDoc 调试时,数据似乎是正确的。它显示了场景图像作为绘制命令的输入(请参见下面的屏幕截图)。
但是,如您所见,表面上的图像只是黑色(右侧图像的中心)。那么我将如何着手调试这类问题呢? RenderDoc 数据似乎是我所期望的,但结果却不是。验证层没有报告任何东西,所以我必须至少做一些模糊有效的事情。
如果您想深入了解,可以在 Main.cpp
和 VulkanHelpers.cpp
中的 GitHub 上找到此特定示例的完整源代码。寻找 Vulkan.RenderTarget2
.
在 RenderDoc 中捕获时,我得到的结果与您的结果不完全相同 - 我只有一个颜色通道,写入后备缓冲区,但也有一个黑色四边形 (What I get when I capture)。
这似乎与 github 上的代码一致。 Vulkan.RenderTarget2.DrawCommandBuffer
中的绘图命令缓冲区被记录到 VulkanBuildDrawCommands
函数中,但它永远不会被提交。对 vkQueueSubmit
的唯一调用是针对每个后备缓冲区的命令缓冲区和 pre/post- 当前命令缓冲区在 VK_PRESENT_SRC_KHR
.
之间的转换
假设您可能有提交该命令缓冲区的本地更改,据我所知,剩余的问题实际上是由验证层报告的,即使除了打开它们之外没有对代码进行任何修改:
Err: [DS] Code 52: DS 0x4a encountered the following validation error at
vkCmdDrawIndexed() time: Descriptor in binding #10 at global descriptor
index 2 requires an image view of type VK_IMAGE_VIEW_TYPE_2D but got VK_IMAGE_VIEW_TYPE_1D.
这是因为为 RenderTarget2
创建的图像视图(我不能 link 那个特定的代码,因为我没有“10 声望”?不知道那个 BS 是什么)未设置图像视图类型,并且 1D 是默认初始化的值“0”。
如果您没有收到该消息,您应该检查您使用的是最新的 SDK。我还收到其他几条消息,其中一条提到布局问题。这是因为上面的 linked 录制功能似乎已经为屏幕外目标切换了布局,它在渲染之前从 COLOR_ATTACHMENT_OPTIMAL
过渡到 SHADER_READ_ONLY_OPTIMAL
(OldImageLayout 是第一个参数),然后返回 COLOR_ATTACHMENT_OPTIMAL
。我认为应该反过来,或者更好的是从 UNDEFINED
过渡到 COLOR_ATTACHMENT_OPTIMAL
,然后再回到 SHADER_READ_ONLY_OPTIMAL
。
因为您在渲染到屏幕外目标时也使用相同的记录助手,这意味着它会尝试从 屏幕外目标读取来绘制四边形。这可能不是你想要的,所以你可能需要检测这种情况并跳过四边形,或者绑定另一个纹理,或其他东西。
我正在尝试在 Vulkan 中将场景渲染成图像,我想在该场景中某处漂浮的四边形上进行采样。
我的方法基本上是执行与将场景渲染成演示图像相同的步骤,只是我只有一个 RGBA8 格式的图像,而不是特定于演示的格式。然而,我所看到的只是一片黑暗。验证层打开并且不报告任何内容。使用 RenderDoc 调试时,数据似乎是正确的。它显示了场景图像作为绘制命令的输入(请参见下面的屏幕截图)。
但是,如您所见,表面上的图像只是黑色(右侧图像的中心)。那么我将如何着手调试这类问题呢? RenderDoc 数据似乎是我所期望的,但结果却不是。验证层没有报告任何东西,所以我必须至少做一些模糊有效的事情。
如果您想深入了解,可以在 Main.cpp
和 VulkanHelpers.cpp
中的 GitHub 上找到此特定示例的完整源代码。寻找 Vulkan.RenderTarget2
.
在 RenderDoc 中捕获时,我得到的结果与您的结果不完全相同 - 我只有一个颜色通道,写入后备缓冲区,但也有一个黑色四边形 (What I get when I capture)。
这似乎与 github 上的代码一致。 Vulkan.RenderTarget2.DrawCommandBuffer
中的绘图命令缓冲区被记录到 VulkanBuildDrawCommands
函数中,但它永远不会被提交。对 vkQueueSubmit
的唯一调用是针对每个后备缓冲区的命令缓冲区和 pre/post- 当前命令缓冲区在 VK_PRESENT_SRC_KHR
.
假设您可能有提交该命令缓冲区的本地更改,据我所知,剩余的问题实际上是由验证层报告的,即使除了打开它们之外没有对代码进行任何修改:
Err: [DS] Code 52: DS 0x4a encountered the following validation error at
vkCmdDrawIndexed() time: Descriptor in binding #10 at global descriptor
index 2 requires an image view of type VK_IMAGE_VIEW_TYPE_2D but got VK_IMAGE_VIEW_TYPE_1D.
这是因为为 RenderTarget2
创建的图像视图(我不能 link 那个特定的代码,因为我没有“10 声望”?不知道那个 BS 是什么)未设置图像视图类型,并且 1D 是默认初始化的值“0”。
如果您没有收到该消息,您应该检查您使用的是最新的 SDK。我还收到其他几条消息,其中一条提到布局问题。这是因为上面的 linked 录制功能似乎已经为屏幕外目标切换了布局,它在渲染之前从 COLOR_ATTACHMENT_OPTIMAL
过渡到 SHADER_READ_ONLY_OPTIMAL
(OldImageLayout 是第一个参数),然后返回 COLOR_ATTACHMENT_OPTIMAL
。我认为应该反过来,或者更好的是从 UNDEFINED
过渡到 COLOR_ATTACHMENT_OPTIMAL
,然后再回到 SHADER_READ_ONLY_OPTIMAL
。
因为您在渲染到屏幕外目标时也使用相同的记录助手,这意味着它会尝试从 屏幕外目标读取来绘制四边形。这可能不是你想要的,所以你可能需要检测这种情况并跳过四边形,或者绑定另一个纹理,或其他东西。