在Vulkan中调试黑色图像

Man*_*zor 1 debugging vulkan

我正在尝试将一个场景渲染到Vulkan中的一个图像中,我想在四边形上进行采样,该四边形漂浮在该场景中的某个地方.

我的方法是基本上做我用来将场景渲染成演示图像的相同步骤,除了我只有RGBA8格式的单个图像而不是特定于表示的格式.但我所看到的只是黑暗.验证图层已启用,不会报告任何内容.使用RenderDoc进行调试时,数据似乎是正确的.它显示场景的图像作为绘图命令的输入(参见下面的屏幕截图).

RenderDoc的屏幕截图,捕获第二帧. 左侧的API跟踪,右侧第二次独立传递的渲染传递输入.

但是,正如您所看到的,表面上的图像只是黑色(右侧图像的中心).那我该如何调试这类问题呢?RenderDoc数据似乎是我所期望的,但结果却不是.验证层没有报告任何内容,所以我必须至少做一些模糊有效的事情.


如果你想挖,为这个特殊的例子完整的源代码可能被发现在GitHub上Main.cppVulkanHelpers.cpp.寻找Vulkan.RenderTarget2.

小智 8

在RenderDoc中捕获时,我没有得到与你相同的结果 - 我只有一个颜色传递,写入后备缓冲区,但也有黑色四边形(我捕获时得到的).

这似乎与github上的代码一致.绘图命令缓冲区in Vulkan.RenderTarget2.DrawCommandBuffer记录在VulkanBuildDrawCommands函数中,但它永远不会被提交.唯一的调用vkQueueSubmit是针对per-backbuffer命令缓冲区和pre/post-present命令缓冲区进行转换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.
Run Code Online (Sandbox Code Playgroud)

这是因为创建的图像视图RenderTarget2(我无法链接到该特定代码,因为我没有"10声誉"?不知道BS是什么)没有设置图像视图类型,1D是值'默认初始化为0'.

如果您没有收到该消息,则应检查您是否使用最新的SDK.我还得到了其他一些消息,包括一个提到布局问题.这是因为上面链接你的录音功能似乎已经布局切换为关闭屏幕的目标,从远离过渡COLOR_ATTACHMENT_OPTIMALSHADER_READ_ONLY_OPTIMAL渲染(该OldImageLayout是第一个参数),然后再回到之前COLOR_ATTACHMENT_OPTIMAL.我认为应该逆转,或者更好地过渡UNDEFINEDCOLOR_ATTACHMENT_OPTIMAL,然后回到SHADER_READ_ONLY_OPTIMAL.

因为在渲染到屏幕外目标时你也使用相同的录制助手,这意味着它试图屏幕外目标读取以绘制四边形.这可能不是你想要的,所以你可能需要检测这种情况并跳过四边形,或绑定另一个纹理,或其他东西.