问题标签 [vulkan]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2369 浏览

visual-studio - vkCreateDebugReportCallback EXT 没有链接,但 vulkan.h 中的所有其他函数都可以正常工作

所以我最近一直在尝试学习 Vulkan,在尝试让验证层工作时,我收到了错误 LNK2019:

现在奇怪的是 vulkan.h 中的所有其他函数都可以完美运行。

我链接了 vulkan-1.lib,并运行了 vulkan 的 AMD 实现。该库来自 Vulkan SDK。

0 投票
2 回答
701 浏览

vulkan - 是否可以在创建交换链后立即从交换链中获取所有图像?

这个问题是另一个问题的答案的副产品:https ://stackoverflow.com/a/37948367/3256878 。

创建交换链时,其图像位于VK_IMAGE_LAYOUT_UNDEFINED. 为了呈现,他们需要在VK_IMAGE_LAYOUT_PRESENT_SRC_KHR. vkAcquireNextImageKHR出于这个原因,在创建交换链之后,即在任何渲染发生之前,它们都可以通过多次调用立即用于应用程序,这似乎是合理的。

我假设由于图像在其中,VK_IMAGE_LAYOUT_UNDEFINED它们应该可供应用程序使用,因为演示引擎无法呈现它们,因此不应该被锁定,除非是由于简单的所有权。这个假设正确吗?我没有在规范中找到任何明确允许或不允许这样做的内容。

我想另一种问同样问题的方法是:交换链图像是否可以始终由应用程序获取,只要它位于VK_IMAGE_LAYOUT_UNDEFINED

0 投票
2 回答
1626 浏览

vulkan - 无法与渲染并行获取和呈现?

注意:我是自学 Vulkan,对现代 OpenGL 知之甚少。

阅读 Vulkan 规范,我可以看到非常好的信号量,它允许命令缓冲区和交换链同步。这是我理解的一种简单(但我认为效率低下)的做事方式:

  1. vkAcquireNextImageKHR用, 信号获取图像sem_post_acq
  2. 使用以下命令构建命令缓冲区(或使用预构建):
    • 将图像从其过渡离开的图像屏障VK_IMAGE_LAYOUT_UNDEFINED
    • 使成为
    • 将图像过渡到的图像屏障VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
  3. 提交到队列,等待sem_post_acq片段阶段和信令sem_pre_present
  4. vkQueuePresentKHR等待sem_pre_present

这里的问题是命令缓冲区中的图像屏障必须知道它们正在转换哪个图像,这意味着vkAcquireNextImageKHR必须在知道如何构建命令缓冲区(或提交哪个预先构建的命令缓冲区)之前返回。但vkAcquireNextImageKHR可能会睡很多(因为演示引擎很忙并且没有免费图像)。另一方面,命令缓冲区的提交本身是昂贵的,更重要的是,片段之前的所有阶段都可以运行,而无需知道最终结果将渲染到哪个图像。

从理论上讲,在我看来,像以下这样的方案将允许更高程度的并行性:

  1. 使用以下命令构建命令缓冲区(或使用预构建):
    • 将图像从其过渡离开的图像屏障VK_IMAGE_LAYOUT_UNDEFINED
    • 使成为
    • 将图像过渡到的图像屏障VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
  2. 提交到队列,等待sem_post_acq片段阶段和信令sem_pre_present
  3. vkAcquireNextImageKHR用, 信号获取图像sem_post_acq
  4. vkQueuePresentKHR等待sem_pre_present

从理论上讲,这将允许管道一直执行到片段着色器,而我们等待vkAcquireNextImageKHR. 这不起作用的唯一原因是既不能告诉命令缓冲区该图像将在以后确定(通过适当的同步),也不能向演示引擎询问特定图像。


我的第一个问题是:我的分析正确吗?如果是这样,在 Vulkan 中是否根本不可能进行这种优化,为什么不呢?


vkAcquireNextImageKHR我的第二个问题是:如果您能说出您想要获取的特定图像并自己迭代它们,那不是更有意义吗?这样,您可以提前知道您要请求哪个图像,并相应地构建和提交您的命令缓冲区。

0 投票
1 回答
977 浏览

vulkan - Vulkan 是否有等效的 TransformFeedback

Vulkan 是否支持保存管道阶段的顶点输出?我一直在寻找,但找不到任何示例或参考资料,也许其他人不知道?

0 投票
2 回答
1405 浏览

c++ - Vulkan:渲染时内存泄漏

我正在用 vulkan 做一个简单的程序,只是为了开始。我正在清除背面颜色,就是这样。问题是程序分配的每一帧内存越来越多,我不知道从哪里来。

这是另外两个函数,当它们未被调用时,程序的内存保持静止。

其他:

一开始我认为这是我分配而不是释放的一些 Vulkan 资源,但这是 Vulkan 调试层提供的:

那里的每一帧似乎只存在 2 个内部资源。我还重载了 new/new[]/delete/delete[] 运算符,并且在循环期间不会调用它们。

我一直在寻找的示例几乎相同,我尝试在每帧删除和创建主命令缓冲区,仍然得到相同的结果。

不调用 PrepareFrame() 和 SubmitFrame() 可以解决问题。为什么?

这个分配从哪里来?我怎么能追捕这种分配?

0 投票
2 回答
946 浏览

glsl - 在几何着色器中推动恒定限制?

我有一个带有以下推送常量块的几何着色器:

推送常量在管道布局中定义如下:

但是,Vulkan 验证层会抛出此错误:

这里的“不可访问”是什么意思?为什么不能访问它们?如果我将推送常量移动到不同的阶段(例如片段或顶点着色器),则不会发生错误。

此外,我只在 Nvidia GeForce GTX 650 Ti 上收到此错误。我也在 AMD 卡上试过,效果很好。

几何着色器的推送常量是否有某种限制?我检查了我的 Nvidia GPU 的限制,总最大推送常量大小为 256 字节,并且支持几何着色器。我在 Vulkan 规范中也找不到任何东西。

0 投票
1 回答
1125 浏览

graphics - D3D12 有类似 vkCmdBlitImage 的东西吗?

我想通过将基本图像blitting 到mip 级别来为2D 纹理创建mipmap 链。在 Vulkan 中,vkCmdBlitImage可用于在对图像进行线性过滤时执行此操作(请参阅另一个问题)。我怎样才能在 D3D12 中达到同样的效果?

0 投票
1 回答
10973 浏览

opengl - 我应该在统一缓冲区或着色器存储缓冲区对象中使用“vec3”吗?

vec3类型是一个非常好的类型。它只占用 3 个浮点数,而我的数据只需要 3 个浮点数。我想在 UBO 和/或 SSBO 的结构中使用一个:

然后,在我的 C 或 C++ 代码中,我可以这样做来创建匹配的数据结构:

这是一个好主意吗?

0 投票
3 回答
12980 浏览

c++ - 如何使用 glslang

我正在尝试使用 glslang 将 glsl 着色器代码编译为 SPIR-V 二进制文件。glslang 项目可以在这里找到:

https://github.com/KhronosGroup/glslang

它可以通过命令行中的 glslangValidator.exe 手动运行。但我想使用 c++ 接口。

我已经按照 github 页面上的描述构建了项目,现在我正在为如何实际使用该界面而苦苦挣扎。

我宁愿实际上不在我的解决方案中包含任何项目(我正在使用 Visual Studio),而是链接使用它所需的 .lib 和标头。我只是找不到我需要链接的那些。github页面只提到ShaderLang.h和StandAlone.cpp,还不够。

有人可以解释如何设置一个可以使用 glslang 的项目吗?我只需要将 glsl 着色器代码编译为 SPIR-V 二进制文件(带有有关着色器编译的调试信息)。我想对于已经做过或有更多经验的人来说,这将是一个非常简单的问题。

0 投票
1 回答
2439 浏览

c - VkApplicationInfo 的意义何在?

在新的 Vulkan API 中,需要一个结构来创建VkInstance: VkApplicationInfo。这是定义:

我认为必须传递应用程序名称、应用程序版本、引擎名称或引擎版本是没有用的。也许实现可以使用该pNext成员来做任何事情,或者检查实现是否支持apiVersion指定的。但除此之外,我不明白为什么要指定其他成员。Vulkan 规范说您甚至可以使用NULL而不是使用实际的VkApplicationInfo.,这使得它更加无用。以后可以通过使用(例如)avkGetAppInfo(instance)等在应用程序中检索此结构中的信息吗?这个结构背后有一个邪恶的总体计划吗?或者只是一个糟糕的设计?无论如何,我很好奇它为什么存在以及为什么我应该使用它。