微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

片段着色器的输出并不总是正确显示下面有很多详细信息找到了解决方案

如何解决片段着色器的输出并不总是正确显示下面有很多详细信息找到了解决方案

所以,这很重要:我正在研究游戏引擎,出于学习目的,这是一种爱好。该引擎使用OpenGL和Vulkan。我目前正在Vulkan中研究PBR渲染器。它工作了很长时间,直到我对其进行了重构。

这是问题:我有一些统一的缓冲区,我想测试一下是否正确接收了它们。但是其中一些只是不正确,例如浅色,伽玛等,其输出为深黑色,而另一些,例如正确显示的灯光位置,则以正确的颜色显示

所以我认为这可能是制服的问题。我启动了RenderDoc,结果发现,捕获帧时,不仅可以正确接收每个数据,而且在交换链映像上的结果是正确的,所以问题是:在演示过程中数据丢失了,还是我呈现不完整的图像,而RenderDoc只是等待了足够长的时间,以确保它是正确的。

所以我认为有同步问题。该系统的工作方式如下(几乎完全从vulkan-tutorial.com复制,但将其分解为类):

  • 我在等待当前框架的栅栏
  • 获取下一张图像,为此帧提供信号灯
  • 如有必要,我会重新创建交换链
  • 我记录了该帧的命令缓冲区(由于上下文是动态变化的,因此需要重新记录)
  • 我重置了该框架的围栏
  • 我使用等待和信号量提交工作
  • 我使用以前的信号量作为等待信号量来呈现结果
  • 增加当前帧

每个swapchain图像只有一个信号灯和围栏。

由于这很可能是驱动程序或操作系统问题,所以这是我的规格: 我正在使用Windows 10 Pro 64位(内部版本19041),GPU是GTX 1060 3 GB,我的驱动程序版本是456.71。该程序在Visual Studio 2019预览版中开发。我可以链接GitHub存储库或RenderDoc捕获。

快速回顾一下:我正确地接收了所有制服,但是其中一些显示为黑色(实际上是0,0,因为在其上加上0.5会产生灰色),其中一些可以正确显示,但是根据RenderDoc的说法,数据是正确的,并且捕获后的交换链图像正确,因此在演示过程中会出现问题。

有人知道什么会导致问题吗?真的是同步吗?还可以吗?我认为我不能给出一个最小的可复制示例,因为源代码非常大且复杂,但是如果您需要任何内容​​,请询问,然后我会添加详细信息。

编辑:这不是同步问题。更新统一缓冲区的代码覆盖了整个缓冲区,我不知道RenderDoc如何显示正确的数据,并且某些描述符仍然有效。因此,如果您遇到类似的问题,请仔细检查代码中的VkMapMemory(),memcpy()和VkUnmapMemory()部分。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。