问题标签 [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.
vulkan - Vulkan 和透明窗口
我目前正在使我的个人引擎适应 Vulkan,并且我想重新实现透明窗口,这在 OpenGL 中已经有了。
我认为我需要做的就是选择正确的颜色格式(带有 alpha 通道)并将compositeAlpha
属性设置VkSwapchainCreateInfoKHR
为VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR
。
但是,用完全透明的颜色清除窗口并不能提供预期的结果。它是完全不透明的。
当然,我的窗口系统(自从我拥有 OpenGL 以来没有改变)支持它,当我禁用渲染时,我也无法在窗口的假定位置单击,这告诉我它就在那里。
是否有任何其他必要的更改来完成这项工作?
一些信息
图像格式和我在Sascha Willems 示例VK_FORMAT_B8G8R8A8_UNORM
中找到的 vulkan 设置。
c++ - 在 renderPass 中更新 VkDescriptorSet
假设我有多个要使用不同材质渲染的网格。我知道我可以使用push constants
这个例子,但这个问题更多的是理解 vkDescriptorset 是如何工作的。
我只在创建数据缓冲区后才调用vkUpdateDescriptorSets
。_descriptorBufferInfo
一切正常。
我测试了另一种解决方案。我不是vkDescriptorset
每种材料都有一个,而是所有材料都只有一个。而里面rendepass
我要求vkUpdateDescriptorSets
的每一种材料VkDescriptorBufferInfo
。
但是当我这样做时,它不起作用。验证层说你必须在调用我渲染的第二个网格beginCommandBuffer
的任何命令之前调用vkCmdBindDescriptorSets
,vkCmdBindPipeline
等等。
那么这里的问题是什么,我不能在多个 VkDescriptorBufferInfo 之间共享一个 vkDescriptorset,还是不能在 renderPass 中更新它?
c++ - Vulkan 层可以在运行时更改吗?
所以我想做一个库来让 Vulkan 编程更容易。你可以在Github上看到它,但不要指望很快会有什么大事 ;)。我想创建一个函数getInstanceLayerProperties
,它返回所有图层属性(显然)。看到这可能会更慢,我想优化它。我的想法很简单:将其存储为预先计算的数组。我只需要知道:Vulkan 层可以在运行时更改吗?例如,假设我缓存了vkEnumerateInstanceLayerProperties
. 是否可以删除、添加或更改新的图层属性,以便如果我再次调用该函数,我会得到不同的结果?
vulkan - 多线程渲染与命令池
毕竟,能够并行构建命令缓冲区是 Vulkan 的卖点之一。
规格(5.1 命令池)(强调我的):
命令池是应用程序同步的,这意味着不能在多个线程中同时使用命令池。这包括通过在从 pool 分配的任何命令缓冲区上记录命令来使用,以及分配、释放和重置命令缓冲区或池本身的操作。
当涉及到并行记录时,这种方式不会扼杀命令池的全部目的吗?如果您打算并行记录,那么您最好不要为每个线程设置一个单独的池,不是吗?
如果您预先记录从同一个池(在一个线程中)分配的所有命令缓冲区,然后并行执行它们,我会理解它。这具有摊销资源创建成本以及并行执行的优势。但是,并行记录和命令池似乎不太匹配。
我个人不知道您为什么不预先录制所有内容。那么为什么需要并行构建命令缓冲区呢?然后你真的必须每个线程使用一个池吗?
c++ - Vulkan SDK 可再发行组件
我在 LunarG 上发布了以下问题,即 Issue #565,关于 Vulkan SDK 可再发行部分,用于使用 Vulkan 开发的即用型应用程序。我想与 Stack Overflow 开发人员分享它。
假设我有 Vulkan 应用程序演示并希望将其发送给潜在客户,以便对其进行评估。如果我使用 SDK 开发它,部署它的正确方法是什么:
a) 在多重安装过程中包含兼容的 SDK 安装程序?
b) 包括一些 SDK 的 dll 和伴随文件?哪个 ?
它还提出了另一个问题:我可以重新分发 SDK 文件吗?
windows - Vulkan 在 linux 上找不到物理设备
我一直想使用 Vulkan,新的图形 API,并且在 Windows 7 上启动并运行没有问题。但是我无法让 Vulkan 在 linux 上工作。当我尝试运行任何 LunarG 示例,甚至我自己的代码时,vkEnumeratePhysicalDevices
总是说没有物理设备。这是我的设置:
我想知道是否有我的 GPU 需要设置环境变量的文件,但我真的不知道。正如我之前所说,这在 Windows 7 上完美运行,但我似乎无法让它在上述配置中运行。我能够使用 LunarG 标准验证层和正确的扩展创建一个实例,但vkEnumeratePhysicalDevices
没有找到任何物理设备。它没有给出错误,只是说它找不到任何物理设备。这真的让我很难过,我真的很感激你的帮助。谢谢!
c++ - 具有 3 个组件的 Vulkan vkCreateImage
我正在尝试使用vkCreateImage
3 分量图像 ( rgb
)。但是所有rgb
格式都给出:
vkCreateImage format parameter (VK_FORMAT_R8G8B8_xxxx) is an unsupported format
这是否意味着我必须重塑内存中的数据?所以在每个 3 之后添加一个空字节,然后将其加载为RGBA
? R8
我也注意到R8G8
格式确实有效,所以我猜唯一的原因RGB
是不支持,因为 3 不是 2 的幂。
在我实际对数据进行这种重塑之前,我想确定这是唯一的方法,因为它对性能不是很好,并且可能在某处有一些偏移或填充值有助于将RGB
数据加载到RGBA
格式。那么有人可以确认重塑为RGBA
加载RGB
格式的必要步骤(尽管有 33% 的开销)?
提前致谢。
vulkan - 附件与附件描述的关系
渲染通道有一个帧缓冲区,其图像视图用作附件。渲染通道也有一个数组VkAttachmentDescriptions
,提供有关其附件的信息。
但是规范没有明确说明附件与描述的关系。即不是说第一个VkAttachmentDescription
对应第一个附件,第二个描述对应第二个附件,以此类推。
规范中的文本是:
pAttachments 指向描述附件属性的 VkAttachmentDescription 结构的 attachmentCount 数量的数组,如果 attachmentCount 为零,则为 NULL。
我们可以假设渲染通道的附件和它的附件描述之间总是存在一一对应的关系吗?
谢谢。
c++ - vulkan-1.lib:添加符号时出错:GCC 中的文件格式错误
错误:
C:\VulkanSDK\1.0.17.0\Bin/vulkan-1.lib:添加符号时出错:文件格式错误
或者
C:\VulkanSDK\1.0.17.0\Bin32/vulkan-1.lib:添加符号时出错:文件格式错误
我使用 Eclipse 版本:Neon Release (4.6.0) Build id: 20160613-1800
编译器:
Cygwin 2.5.2(0.297/5/3)
MinGW-w64 gcc(x86_64-posix-seh,由 MinGW-W64 项目构建)6.1.0
标志:-m64 或 -m32
有人可以指出我做错了什么,或者给我发送一个正确设置的示例工作区吗?
这是我的第一个跨平台项目,所以我可能做错了什么。
我选择 Eclipse 的原因很简单,在 Windows 和 Linux 上几乎相同。
c++ - Vulkan uniform shader data
What i'm used to from opengl was that inside the command buffer resources are bound to the shader, like glUniformMatrix4fv
.
Now as far I can see the only equivalent is vkCmdPushConstants
.
But there is also the option to create a large buffer with the data of all the objects. And then use vkCmdBindDescriptorSets
to change the offset so the shader gets uses the data for the corresponding object (correct me is something is wrong here, this is how i suppose it could be done).
But now what is the "right" way to get per-object data to your shader? And in what way does it depend on the amount of data the shader needs to change per object.
The the other question I have has to do with synchronized gpu and cpu.
You need to wait for a frame to be ready before you copy the data for the next frame onto the gpu.
So how can you let the buffer copy happen in a command buffer? something like vkFlushMappedMemoryRanges
that takes a command buffer Then you could set semaphores and wait for the usages of the data to be complete before overwriting the old data on the gpu with new data for the next frame from RAM. And in RAM use a separate buffer for each image in the swapchain so you can already start writing the data for the next frames (upto the swapchain image count).
If you cannot synchronize that buffer copy it seems to me you would need a buffer on the gpu with per-object data for each swpachain image. And that seems like a waste of space to me.
The problem that i see a bit explained, if there is only 1 buffer containing shader data both in RAM on on GPU memory, and if you do not want for the gpu to be idle after each frame (I think you only want to wait if you already submitted the command buffers for all the frames that fit in the swapchain)
- cpu pushes objects positions for frame 0 to the gpu
- cpu commits the command buffer for frame 1
- gpu starts rendering frame 0
- cpu pushes object positions for frame 1 to the gpu
- cpu commits the command buffer for frame 1
- gpu finishes frame 0
- gpu starts frame 1
- gpu finishes frame 1
In the example the data for frame 1 is allready pushed to the gpu while it is still rendering frame 0, and this corrupts frame 0.
I'm sorry if my post is a bit incoherent or vague, but it's hard to explain a problem that you do not fully understand.
EDIT: per-vertex should have been per-object.
A function i would be looking for is: VkCmdFillGpuMemory(VkCommandBuffer commandbuffer, VkDeviceMemory myMemory, void* ramData). Preferrably also with a range option to copy only a part of the data (so there is the option to copy data only for objects whose data changed)