标签: vulkan

在Vulkan中启用VSync

如何在Vulkan中使用vsync?我在Windows上,但代码也适用于Linux.它是通过插入栅栏来实现的vkAcquireNextImageKHR吗?

c c++ vsync vulkan

10
推荐指数
1
解决办法
3899
查看次数

vulkan 浮点行为问题

我尝试在 GLSL Vulkan 计算着色器中实现Alma College 的 Andrew Thall 所著的论文Extended-Precision Floating-Point Numbers for GPU Computation。我需要这个,因为我的一些设备不支持双精度。

我的问题出在 quickTwoSum 函数中

vec2 quickTwoSum( float a , float b) {
    float s = a + b;
    float t = s - a;
    float e = b - t;
    return vec2(s, e);
}
Run Code Online (Sandbox Code Playgroud)

例如

a = 114251.609
b = -0.00107500004
Run Code Online (Sandbox Code Playgroud)

然后发生这种情况

s = 114251.609 // this is correct because b is to small
t = -0.00107500004 // <= why? (s - a) …
Run Code Online (Sandbox Code Playgroud)

floating-point precision glsl vulkan

10
推荐指数
0
解决办法
446
查看次数

Vulkan 交换链格式 UNORM 与 SRGB?

在 Vulkan 程序中,片段着色器通常向每个红/蓝/绿通道输出 0.0 到 1.0 范围内的单精度浮点颜色,然后将这些颜色写入(混合到)交换链图像中,然后呈现在屏幕上。根据交换链图像的格式(创建交换链时指定),浮点值被编码为位。

当我将交换链格式从 更改为 时,VK_FORMAT_B8G8R8A8_UNORMVK_FORMAT_B8G8R8A8_SRGB观察到帧的整体亮度大大增加,并且还存在一些轻微的颜色变化。

我对 SRGB 格式的理解是,它很像 UNORM 格式,只是浮点值到 8 位整数的映射不同,因此它在某些区域具有更高的颜色分辨率,而在其他区域具有较低的颜色分辨率,但实际含义“预编码”RGB 浮点值的数量保持不变。

所以我对亮度的增加有点惊讶。难道我对SRGB编码的理解有误?和/或与 UNORM 相比,这种亮度增加是预期的吗?

或者也许我有一个错误并且亮度不会增加?

更新:

我观察到,如果我使用 SRGB 交换链图像以 VK_FORMAT_B8G8R8A8_SRGB 格式而不是 VK_FORMAT_B8G8R8A8_UNORM 加载图像/纹理,那么额外的亮度就会消失。它看起来就像我使用 VK_FORMAT_B8G8R8A8_UNORM 交换链图像并以 VK_FORMAT_B8G8R8A8_UNORM 格式加载图像/纹理一样。

另外,如果我将交换链图像放入 VK_FORMAT_B8G8R8A8_UNORM 格式,然后使用 VK_FORMAT_B8G8R8A8_SRGB 加载图像/纹理,则帧看起来特别暗/几乎是黑色。

弄清楚正在发生的事情会很有帮助。

vulkan

10
推荐指数
2
解决办法
6892
查看次数

vulkaninfo在docker中工作失败,无法识别NVIDIA GPU

问题描述

当我vulkaninfo在 docker 中运行时,它会抱怨:

Cannot create Vulkan instance.
This problem is often caused by a faulty installation of the Vulkan driver or attempting to use a GPU that does not support Vulkan.
ERROR at /build/vulkan-tools-1.3.204.0~rc3-1lunarg20.04/vulkaninfo/vulkaninfo.h:649:vkCreateInstance failed with ERROR_INCOMPATIBLE_DRIVER
Run Code Online (Sandbox Code Playgroud)

看来这个问题是驱动引起的,于是我跑去nvidia-smi检查:

Sun Apr 17 03:12:54 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.60.02    Driver Version: 510.60.02    CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute …
Run Code Online (Sandbox Code Playgroud)

ubuntu nvidia docker vulkan

10
推荐指数
0
解决办法
2010
查看次数

Vulkan:创建和利益管道衍生品

在福尔康,你可以使用vkCreateGraphicsPipelinevkCreateComputePipeline创建管道衍生物,具有basePipelineHandlebasePipelineIndex成员VkGraphicsPipelineCreateInfo/ VkComputePipelineCreateInfo.文档声明此功能可用于性能原因:

衍生管道的目标是使用父项作为起点创建它们更便宜,并且在同一父项的子项之间切换/绑定更有效(在主机或设备上).

这为我提出了很多问题:

  1. 有没有办法表明父管道和子管道之间共享哪个状态,或者实现是否决定?
  2. 有没有办法知道实现是否实际上从使用派生管道(除了分析)获得任何好处?
  3. 需要使用创建父管道VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT.始终使用此标志是否存在缺点(例如,如果您将来可能从此创建派生管道)?

c++ vulkan

9
推荐指数
2
解决办法
1509
查看次数

使用Vulkan渲染Qml

我有一个使用Open GL绘制的Qt应用程序。在某些时候,我正在使用与QQuickWindow关联的QQuickRenderControl方法将QML场景绘制到纹理中,以便稍后在最终图像中进行合成。

现在,我正在考虑将OpenGL移植到Vulkan,但不确定在此QML层是否可以这样做。

阅读Qt文档,我发现

QQuickWindow使用OpenGL顶部的场景图进行渲染。

您认为可以将其移植到Vulkan吗?也许是压倒一切的QQuickWindowQQuickRenderControl?我不是Qt专家,所以也许有人可以让我对问题有更好的了解。

qt qml qtquick2 vulkan

9
推荐指数
1
解决办法
1086
查看次数

为什么 vkCreateSwapchainKHR 会导致访问冲突为 0?

我正在尝试按照 vulkan-tutorial.com 的精彩教程学习 Vulkan,但在必须创建交换链时遇到了一些问题。如标题所述,vkCreateSwapchainKHR会产生以下错误:Access violation executing location 0x0000000000000000.

教程建议这可能与蒸汽覆盖层发生冲突。对我来说情况并非如此,因为从教程中复制了整个代码。

我试图找出我的代码出了什么问题,并学习如何调试此类问题,因为我将来不会有参考代码。有罪的线看起来是这样的:

if (vkCreateSwapchainKHR(device, &swapChainCreateInfo, nullptr, &swapChain) != VK_SUCCESS) {
    throw std::runtime_error("Could not create swap chain");
}
Run Code Online (Sandbox Code Playgroud)

我在这一行设置了一个断点,以将代码中的参数值与参考代码中的值进行比较。据我所知,没有区别。(当然地址不一样)

我应该在哪里查找代码中的问题?变量swapChainNULL预期的。一个错误的形成swapChainCreateInfo不应该使vkCreateSwapchainKHR崩溃。它只会让它返回一些不是的东西VK_SUCCESS。并且设备创建没有问题:

if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device) != VK_SUCCESS) {
    throw std::runtime_error("Failed to create logical device");
}
Run Code Online (Sandbox Code Playgroud)

编辑 - 我正在使用验证层VK_LAYER_LUNARG_standard_validation,我的createInfo设置如下。

// Useful functions and structures
VkPhysicalDevice physicalDevice;
VkSurfaceKHR surface;
VkSwapchainKHR swapChain;

struct QueueFamilyIndices {
    std::optional<uint32_t> graphicsFamily;
    std::optional<uint32_t> …
Run Code Online (Sandbox Code Playgroud)

c++ access-violation vulkan

9
推荐指数
1
解决办法
1976
查看次数

Vulkan中RenderPass和Pipeline是什么关系?

Vulkan中RenderPass和Pipeline的逻辑关系是什么?

如果忽略RenderPass,我对渲染过程的理解是先将应用层准备好的顶点数据,然后将纹理数据提交给驱动,然后通过各个阶段的管道,写入Framebuffer后,就可以完成一次渲染。

那么RenderPass的职责是什么?它是为渲染每个阶段(例如格式)提供元数据的抽象,还是有其他作用?

RenderPass 和 Pipeline 是靠感觉的吗?例如,每个流水线都属于一个子通道。或者依赖项,例如流水线的最后一个输出,由 RenderPass 处理。或者是别的什么?

vulkan

9
推荐指数
1
解决办法
1743
查看次数

Vulkan 可以做哪些 OpenGL 4.6+ 不能做的具体事情?

我正在研究继续使用 OpenGL 还是考虑使用 Vulkan 迁移来进行密集的瓶颈渲染对我来说是否更好。

但是,我不想在没有被告知的情况下进行跳跃。我一直在寻找 Vulkan 为我提供的好处,但是通过大量的谷歌搜索,我无法确切地找到可以提高性能的原因。人们会抛出诸如“OpenGL 慢,Vulkan 快得多!”之类的术语。或“低功耗!” 对这个话题不再多说。

因此,我很难评估我面临的问题是否是 Vulkan 可以帮助我解决的问题,或者我的问题是否是由于数量和计算造成的(在这种情况下,Vulkan 对我帮助不大) .

我假设 Vulkan 不会神奇地使管道中的事情变得更快(因为对于相同的缓冲区、制服和着色器,OpenGL 和 Vulkan 之间的三角形着色将大致相同)。我假设在 OpenGL 中导致悲伤的所有事情(例如:帧缓冲区和着色器程序更改)在任何一个 API 中都将同样痛苦。

我认为 Vulkan 提供了一些基于在线阅读无数内容的想法(我猜这肯定不是所有优点,或者这些是否属实):

  • 没有[多?任何?] 绑定(或者更确切地说是“无绑定纹理”的更好版本),当我切换到无绑定纹理时我注意到我获得了显着的性能提升,但如果无绑定纹理有效,这甚至可能不值得作为一个点这样做,因此我不确定 Vulkan 是否在这里添加了任何内容

  • 通过组合某种可以在 GPU 上执行而无需发送大量数据的命令列表来减少 CPU/GPU 通信

  • 能够以 OpenGL 无法实现的多线程方式进行接口

但是,我不知道人们在现实世界中遇到哪些需要这些的情况,以及 OpenGL 如何限制这些情况。到目前为止,网上的所有例子都说“你可以跑得更快!” 但我还没有看到人们如何使用它来跑得更快。

我在哪里可以找到回答这个问题的信息?或者你知道一些具体的例子可以为我回答这个问题吗?也许更好的问题是人们在使用 OpenGL(或 D3D)时导致 Vulkan 成为一种东西的典型痛点在哪里?

一个不令人满意的答案的例子是这样的回应

您可以多线程并更快地向 Vulkan 提交内容。

但更令人满意的回应将类似于

在 Vulkan 中,您可以多线程处理您对 GPU 的提交。在 OpenGL 中,您不能这样做,因为您依靠实现来代表您进行适当的锁定和放置围栏,这可能最终会造成瓶颈。一个简单的例子是[这里的简短示例,OpenGL 没有针对情况 X 切断它],而在 Vulkan 中,它由 [动作 Y] 解决。

上面的最后一段可能并不准确,但我试图举例说明我要寻找的内容,而不会试图写出非常错误的东西。

opengl vulkan

9
推荐指数
2
解决办法
1751
查看次数

归一化、缩放和整数 VkFormats 之间有什么区别?

我们以下面的6个VkFormats为例:

VK_FORMAT_R8_UNORM
VK_FORMAT_R8_SNORM
VK_FORMAT_R8_USCALED
VK_FORMAT_R8_SSCALED
VK_FORMAT_R8_UINT
VK_FORMAT_R8_SINT
Run Code Online (Sandbox Code Playgroud)

所有这些都指定了具有单个 8 位 R 分量的单分量 8 位格式。

格式的不同在于它们是否 (a)标准化,(b)缩放;或 (c)整数。这意味着什么?这三样东西有什么区别?哪里规定的?

8 位的所有 256 个可能值是否在所有六种格式中都有意义且有效?

(它们的不同之处还在于它们是signed还是unsigned。我认为这意味着它们的底层类型是像 C 类型int8_t还是uint8_t?)

vulkan

9
推荐指数
1
解决办法
1268
查看次数

标签 统计

vulkan ×10

c++ ×3

access-violation ×1

c ×1

docker ×1

floating-point ×1

glsl ×1

nvidia ×1

opengl ×1

precision ×1

qml ×1

qt ×1

qtquick2 ×1

ubuntu ×1

vsync ×1