问题标签 [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.
c++ - 如何将 Vulkan 与 MinGW 一起使用?(R_X86_64_32 错误)
我正在尝试设置一个简单的程序来使用 Vulkan。我安装了 LunarG SDK。我有一个小程序,基本上只调用vkCreateInstance
. 我用这一行编译:
我使用 64 位 mingw (MSYS2) 得到这个编译器错误:
我该怎么办?我是否链接到正确的库?
c++ - 如何在 Vulkan 中绘制图元?
假设 Vulkan 已经初始化,您正在录制到命令缓冲区,您有一个帧缓冲区和一个渲染通道,如何使用 Vulkan 绘制原始 2D 几何形状?
c# - 通过 c# 中的 pInvoke 调用 vkEnumeratePhysicalDevices 时出现 AccessViolationException
我有一个敏锐的想法,用 c# 为 Vulkan 编写一个包装器。不幸的是,Vulkan API 的第二次调用已经无法解释地失败了。下面的代码取自 Sascha Willems 的 Vulkan 示例并转换为 c# 代码:
和
我的怀疑是 Vk.Instance 应该不仅仅是一个空类。VkInstance 在官方的 vulkan.h 中定义为typedef struct VkInstance_T* VkInstance
. 不幸的是,我对这条线的理解非常有限。我已经尝试过交换类型Vk.Instance
,IntPtr
但object
没有成功。
论文是来自的重要部分vulkan.h
c++ - Vulkan 示例:vkQueueSubmit 后面总是跟着 vkWaitForFences?
在 Vulkan 附带的API-Samples中,似乎在调用vkWaitForFences
之后总是有调用vkQueueSubmit
,直接或通过execute_queue_command_buffer
(在 util_init.hpp 中)。调用vkWaitForFences
将阻塞 CPU 执行,直到 GPU 完成前面的所有工作vkQueueSubmit
。这实际上不允许同时构建多个帧,这(理论上)极大地限制了性能。
是否需要这些调用,如果需要,是否有另一种方法不要求 GPU 在构建新帧之前处于空闲状态?
c - 为什么在 vulkan.h 中不可调度的对象总是被定义为 64 位?
看着 vulkan.hi 看到这个:
有谁知道为什么是 64 位?对我来说,总是使用 ifdef 的第一种情况似乎更合理
c# - P/Invoke vkGetPhysicalDeviceFeatures 访问冲突
我正在为 C# 开发一个 Vulkan 包装器(就像我相信很多人一样),我遇到了一些问题,vkGetPhysicalDeviceFeatures
要么不返回数据,要么抛出访问冲突
未管理的一面 - 签名:
规范的签名是这样的:
VkPhysicalDevice
是一个handle
定义为的对象:
这只是一个指针和其他使用IntPtr
或SafeHandle
包装此形状对象的导入。
托管端 - DLL 导入:
预期的 DLL 导入(但失败):
这类似于其他工作导入。注意:PhysicalDeviceHandle
派生自SafeHandle
应该编组到IntPtr
,我有其他使用这种模式的导入。上面调用时会引发访问冲突。
平台:
- 视窗 10 (x64)
- Nvidia 驱动程序:(
356.43-vkonly
最新)
更新
@V。克拉夫琴科是正确的
上面的导入没有任何问题。我的问题实际上与vkEnumeratePhysicalDevices
通话有关。
首先我有导入错误,正确的导入看起来像:
其次,我实际上错误地使用了该功能。你需要打vkEnumeratePhysicalDevices
两次电话。第一次调用获取设备数量,第二次调用填充设备数组:
注意:这在函数文档的描述/有效用法部分中有概述,我只是在第一次通读时没有正确解释它。
一旦我终于有了正确的句柄值,EnumeratePhysicalDevices
我的最后一次调用就GetPhysicalDeviceFeatures
按预期工作了。的最终导入GetPhysicalDeviceFeatures
看起来像:
注意Handle
:名称中带有的任何变量都是SafeHandle
.
c++ - 对 vkCreateInstance 的未定义引用
最终编辑:这是 TDM_GCC 的编译器/链接器错误。见答案。
编辑:据我所知,这不是重复的。问题似乎是一个简单的菜鸟错误,但事实并非如此。我已经使用 TDM-GCC-64(Windows 的 GCC/MinGW 工具包)链接到正确的 Vulkan 库“vulkan-1.lib”,并使用了 VulkanSDK 示例中的示例代码。本页如何将 Vulkan 与 MinGW 一起使用?(R_X86_64_32 错误)还确认它可以在 MinGW 上运行,这与 TDM-GCC-64 应该没有什么不同,因为它使用了 MinGW 的一部分。如果这是一个简单答案的重复,那么我很抱歉问,但到目前为止没有人解决这个“简单”问题。
EDIT2:这是我的项目文件。只需根据需要编辑生成文件并运行“BUILD.bat”。http://www.filedropper.com/vulkanapp_1
我已经下载并安装了 LunarG Vulkan SDK v1.0.3.1。我有一个非常简单的程序,它试图创建一个 Vulkan 实例并退出。
当我尝试使用 g++ 构建程序时得到的输出是:
C:\VulkanSDK\1.0.3.1\Bin32/vulkan-1.lib: error adding symbols: File in wrong format collect2.exe: error: ld returned 1 exit status
我的生成文件如下所示:
VulkanApp: main.obj g++ -m32 -LC:\VulkanSDK\1.0.3.1\Bin32 main.obj -o VulkanApp.exe -lvulkan-1 main.obj: main.cpp g++ -m32 -IC:\VulkanSDK\1.0.3.1\Include -c main.cpp -o main.obj clean: del *.exe *.obj
我究竟做错了什么?我正在链接正确的图书馆,对吗?
这是我的程序代码:
glsl - Vulkan 中的实例化 GLSL 着色器?
这是我能想到的(最简单的)实例化着色器,它基本上只是转换了一堆 2D 基元:
如果我尝试使用 Vulkan SDK 附带的 glslangValidator 将其编译为 SPIR-V,我会得到:
如果我删除该#extension GL_ARB_draw_instanced
行,我仍然会收到gl_InstanceID
错误消息。是否可以编写实例化 GLSL 并将它们编译为 SPIR-V?如果是这样,我做错了什么?
c++ - `VkDescriptorSetLayout` 中未使用的绑定的含义?
我有两个片段着色器(用 GLSL 编写),都带有一组采样器。其他绑定是相同的,但是,两者之间的数组大小不同:
对比
我可以创建一个VkDescriptorSetLayout
与VkDescriptorSetLayoutBinding
此参数匹配的:
创建的VkDescriptorSetLayout
将正确绑定到两个着色器。
两个问题:
未使用的描述符的唯一含义是任何VkDescriptorSet
大于必要的(在第一个着色器数组的情况下)?额外分配的描述符是一个很大的性能和/或内存问题吗?
c++ - Vulkan:转储当前分配的对象?
每当 Vulkan 中的对象被销毁、VK_LAYER_LUNARG_object_tracker
层启用并安装调试报告时,它将报告销毁调用并通过回调给出剩余对象的总数。例如:
有什么方法可以获取有关仍然分配的对象的信息吗?
编辑:检查 object_tracker 层的来源(https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/layers/object_tracker.h),似乎有一个原型objTrackGetObjectsOfTypeCount
,但似乎没有就像他们在任何地方都有实现一样。这个功能是否可以访问?