Debugging 在Vulkan中调试黑色图像

Debugging 在Vulkan中调试黑色图像,debugging,vulkan,Debugging,Vulkan,我试图在Vulkan中将一个场景渲染成一个图像,我想在场景中某个地方浮动的四元体上采样 我的方法基本上是执行与将场景渲染为演示图像相同的步骤,不同的是我只有一个RGBA8格式的图像,而不是特定于演示的格式。不过,我看到的只是黑暗。验证层处于打开状态,不报告任何内容。使用RenderDoc进行调试时,数据似乎是正确的。它显示场景的图像,作为“绘制”命令的输入(请参见下面的屏幕截图) 但是,如您所见,曲面上的图像仅为黑色(图像中心位于右侧)。那么我将如何调试这种问题呢?RenderDoc数据似乎符

我试图在Vulkan中将一个场景渲染成一个图像,我想在场景中某个地方浮动的四元体上采样

我的方法基本上是执行与将场景渲染为演示图像相同的步骤,不同的是我只有一个RGBA8格式的图像,而不是特定于演示的格式。不过,我看到的只是黑暗。验证层处于打开状态,不报告任何内容。使用RenderDoc进行调试时,数据似乎是正确的。它显示场景的图像,作为“绘制”命令的输入(请参见下面的屏幕截图)

但是,如您所见,曲面上的图像仅为黑色(图像中心位于右侧)。那么我将如何调试这种问题呢?RenderDoc数据似乎符合我的预期,但结果并非如此。验证层没有报告任何内容,所以我必须至少做一些模糊有效的事情



如果您想深入了解,可以在
Main.cpp
vulkanhelopers.cpp
中找到此特定示例的完整源代码。查找
Vulkan.RenderTarget2

在RenderDoc中捕获时,我没有得到与您完全相同的结果-我只有一个颜色过程,写入backbuffer,但也有一个黑色四元()

这似乎与github上的代码一致。
Vulkan.RenderTarget2.DrawCommandBuffer
中的draw命令缓冲区被记录到函数中,但它永远不会被提交。对
vkQueueSubmit
的唯一调用是针对per backbuffer命令缓冲区和从
VK\u present\u SRC\u 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
创建的图像视图(我无法链接到该特定代码,因为我没有“10信誉”?不知道BS是什么)没有设置图像视图类型,1D是默认初始化的值“0”

如果您没有收到该消息,您应该检查您是否使用了最新的SDK。我还收到了其他几条消息,其中一条提到布局问题。这是因为上面链接的录制功能似乎为屏幕外目标切换了布局,它在渲染之前从
COLOR\u ATTACHMENT\u OPTIMAL
转换为
SHADER\u READ\u OPTIMAL
(OldImageLayout是第一个参数),然后返回到
COLOR\u ATTACHMENT\u OPTIMAL
。我认为这应该是相反的,或者更好的是从
未定义的
过渡到
颜色\u附件\u优化的
,然后返回到
着色器\u只读\u优化的


因为在渲染到屏幕外目标时也使用相同的录制辅助对象,这意味着它尝试从屏幕外目标读取以绘制四边形。这可能不是您想要的,因此您可能需要检测这种情况并跳过四边形,或绑定另一个纹理或其他内容。

在RenderDoc中捕获时,我没有得到与您完全相同的结果-我只有一个颜色过程,写入backbuffer,但也有一个黑色四边形()

这似乎与github上的代码一致。
Vulkan.RenderTarget2.DrawCommandBuffer
中的draw命令缓冲区被记录到函数中,但它永远不会被提交。对
vkQueueSubmit
的唯一调用是针对per backbuffer命令缓冲区和从
VK\u present\u SRC\u 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
创建的图像视图(我无法链接到该特定代码,因为我没有“10信誉”?不知道BS是什么)没有设置图像视图类型,1D是默认初始化的值“0”

如果您没有收到该消息,您应该检查您是否使用了最新的SDK。我还收到了其他几条消息,其中一条提到布局问题。这是因为上面链接的录制功能似乎为屏幕外目标切换了布局,它在渲染之前从
COLOR\u ATTACHMENT\u OPTIMAL
转换为
SHADER\u READ\u OPTIMAL
(OldImageLayout是第一个参数),然后返回到
COLOR\u ATTACHMENT\u OPTIMAL
。我认为这应该是相反的,或者更好的是从
未定义的
过渡到
颜色\u附件\u优化的
,然后返回到
着色器\u只读\u优化的


因为在渲染到屏幕外目标时也使用相同的录制辅助对象,这意味着它尝试从屏幕外目标读取以绘制四边形。这可能不是您想要的,因此您可能需要检测这种情况并跳过四边形,或绑定另一个纹理或其他内容。

非常感谢您的输入!我将尝试你指出的事情,并尽快报告。是的,这是真的,我确实有一些本地更改,但还没有在GitHub上。令我羞愧的是,验证层也被关闭了,这解释了很多。也许在累的时候编码毕竟不是个好主意。。。将视图类型设置为2D后,我实际看到了预期的结果!现在验证层又打开了,我可以出去修复所有警告了@再次感谢你,你帮了我很多忙!非常感谢您的投入!我将尝试你指出的事情,并尽快报告。是的,这是真的,我确实有一些本地更改,但还没有在GitHub上。令我羞愧的是,验证层也被关闭了