问题标签 [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:`vkFlushMappedMemoryRanges` 线程层错误?
如果一个整体vkDeviceMemory
被映射(通过vkMapMemory
)并且它没有被分配VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
,则vkFlushMappedMemoryRanges
必须在对缓冲区进行任何修改后进行,以便设备查看写入(根据文档)。
我只修改大缓冲区的一小部分,因此只想刷新受影响的区域。因此,我创建了多个VkMappedMemoryRange
结构,具有不同的offset
和size
字段,但指向相同的vkDeviceMemory
. 这一切似乎都如我所料。但是,如果我启用VK_LAYER_LUNARG_threading
,我会收到一个错误:
如果我只使用一个刷新范围而不是数组调用vkFlushMappedMemoryRanges
多次,我不会收到错误消息。刷新同一缓冲区的多个子范围不是有效的用例吗?
windows - 为什么扩展函数的 vkGetInstanceProcAddr() 失败?
我能够获取指向所有 Vulkan 核心函数的指针,但获取指向 Vulkan 扩展函数的指针失败。
首先我得到一个指向 的指针vk_icdGetInstanceProcAddr()
,然后我得到指向全局 Vulkan 函数的指针(例如vkCreateInstance()
)。我在创建实例时启用VK_KHR_surface
和VK_KHR_win32_surface
扩展,它们被 vulkaninfo.exe 和vkEnumerateInstanceExtensionProperties()
. 创建 Vulkan 实例后,我获得了指向所有实例函数的指针vk_icdGetInstanceProcAddr()
和实例句柄。但是,例如,当尝试获取指向的指针时vkCreateWin32SurfaceKHR()
,会返回一个空指针。也一样vkDestroySurfaceKHR()
。
我安装了支持 Vulkan API 1.0.3 的 Nvidia 驱动程序 356.39。难道我做错了什么?
编码:
graphics - Vulkan 命令执行顺序
引用 Vulkan 1.0 规范文档,第 5 章(命令缓冲区)第 4 段,
“除非另有说明,并且没有明确的同步,通过命令缓冲区提交到队列的各种命令可以相对于彼此以任意顺序执行,和/或同时执行”
在第 2.1.1 章(队列操作)的第 1 段中,它还指出
“...提交到单个队列的命令缓冲区按照它们提交的顺序播放,每个缓冲区中的命令按照它们被记录的顺序播放”
第5章中的“任意顺序”是否意味着甚至是乱序?那么第2.1.1章“按提交顺序播放”的说法不冲突吗?还是命令只是按顺序“播放”但“执行”无序?
visual-studio - 在 VS 2015 中加载调试层 (VK_ERROR_LAYER_NOT_PRESENT)
我目前正试图强制 Visual Studio 使用 Vulkan 的调试层 dll,但不知何故它无法加载库。我的步骤是:
- 克隆https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/BUILD.md
- 为 Visual Studio 2015 构建(发布和调试)
- 在我的 Vulkan 应用程序中,我将其放入环境变量(对于 x64 - 调试)(项目设置 - > 调试):
VK_LAYER_PATH=F:\Projects\Vulkan-LoaderAndValidationLayers\build\layers\Debug
当我启动我的应用程序时,它会一直运行,直到它尝试创建实例,然后它会返回VK_ERROR_LAYER_NOT_PRESENT
,我可以在 Visual Studio 的输出窗口中看到 dll 确实根本没有加载。如果我只是将 Vulkan 二进制文件的“正常”路径放在上面的路径中,它就会再次正常工作。我已经检查过是否还有 .json 文件。如果我尝试使用 LoaderAndValidationLayers 文件夹中的 Release-DLL,也会出现此问题。
我究竟做错了什么?有谁知道如何使这项工作?
编辑:我发现这VK_LAYER_LUNARG_threading
似乎是问题所在。如果我使用VK_LAYER_LUNARG_standard_validation
它不会加载任何东西。如果我只是指定手动包含的所有层(在此处描述:https ://vulkan.lunarg.com/app/docs/v1.0.3.1/layers )而没有该VK_LAYER_LUNARG_threading
层它可以正常工作。知道为什么会这样吗?
c++ - Vulkan 未能清除深度
在过去的几周里,我一直在与 Vulkan 合作,我遇到了一个只发生在 AMD 卡上的问题。特别是 AMD 7970M。我在 GTX 700 和 900 系列卡上运行我的项目没有问题。我什至在 Windows 上运行了带有 Nvidia 卡的 Linux(Steam OS),没有任何问题。这个问题只出现在 AMD 卡上,而且只出现在我的项目中;Sascha Willems的所有示例和项目都没有问题。
现在我正在绘制一个有纹理的 Raptor 模型并将其旋转到位。我将其渲染为纹理,然后将该纹理应用于全屏三角形;基本的离屏渲染。但是,我的 7970M 上的深度似乎无法正确清除。相反,我得到了这个奇怪的伪影,比如深度没有被正确清除:
当然,我尝试使用 RenderDoc 进行深入研究,但深度完全错误。猛禽和它所绘制的全屏三角形都是一团糟:
我尝试将我的代码与 Sascha Willems 的 Offscreen 示例进行比较,我似乎确实以相同的方式做几乎所有事情。我认为我创建深度的方式可能有问题,但与我见过的所有示例相比,它似乎还不错。
以下是我在哪里创建深度图像和视图的一些调试视图:
这是整个方法:
如果有人想了解有关代码的更多信息,请随时询问,我会提供。这个项目有很多代码行,所以我不希望每个人都必须费力地完成所有工作。如果您愿意,可以在http://github.com/thirddegree/HatchitGraphics/tree/dev找到所有代码
编辑:经过更多的探索,我发现即使颜色也不是很清楚。RenderDoc 显示每个帧只渲染猛禽的切口,并不会清除帧的其余部分。这是驱动问题吗?
编辑:更多信息。我发现如果我什么都不画,只是开始和结束一个渲染通道,甚至不画我的全屏三角形,屏幕就会清除。但是,如果我只绘制三角形,深度是错误的(即使我没有从屏幕外粘贴任何东西或应用任何类型的纹理)。
编辑:更具体地说,颜色会清晰,但深度不会。如果我不画任何东西,深度将保持黑色;全为 0。为什么全屏三角形会导致奇怪的深度静态我不确定。
c++ - 在 Vulkan 中加载非二次幂纹理
如果我的纹理尺寸是 2 的幂次方,我的 2D 纹理加载器可以正常工作,但如果不是,则纹理数据显示为倾斜。我该如何解决?我认为这个问题与内存对齐和行间距有关。这是我的加载程序代码的相关部分:
vulkan - VkFormat 名称中的 PACK8/16/32 是什么意思?
我试图理解VkFormat
枚举中项目的名称,到目前为止,我想我得到了所有(非块)格式名称的所有结构,但我不知道什么时候它们的后缀为PACK8
, PACK16
, PACK32
。如果我将通道大小加起来,它们总是加起来 8、16 或 32,没有什么不规则的,所以我不明白对这些值进行位打包意味着什么,因为它们似乎是 100% 有效的,使用他们所有的位。
像往常一样,文档不是很有帮助,只是说格式是打包的,而没有说明这意味着什么。
c++ - 无法从压缩纹理数据 (S3TC) 创建图像
我一直在尝试在 Vulkan 中使用 S3TC (BC/DXT) 压缩加载压缩图像,但到目前为止我还没有多少运气。
以下是 Vulkan 规范对压缩图像的说明:
https://www.khronos.org/registry/dataformat/specs/1.1/dataformat.1.1.html#S3TC:
使用 S3TC 压缩图像格式存储的压缩纹理图像表示为 4×4 纹素块的集合,其中每个块包含 64 或 128 位的纹素数据。图像被编码为正常的 2D 光栅图像,其中每个 4×4 块被视为单个像素。
https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#resources-images:
对于使用线性平铺创建的图像,rowPitch、arrayPitch 和 depthPitch 描述了线性内存中子资源的布局。对于未压缩的格式,rowPitch 是相邻行中具有相同 x 坐标的纹素之间的字节数(y 坐标相差 1)。arrayPitch 是图像相邻数组层中具有相同 x 和 y 坐标的纹素之间的字节数(数组层值相差 1)。depthPitch 是 3D 图像相邻切片中具有相同 x 和 y 坐标的纹素之间的字节数(z 坐标相差 1)。用寻址公式表示,子资源中纹素的起始字节具有地址:
// (x,y,z,layer) 在纹理坐标中
address(x,y,z,layer) = layer arrayPitch + z depthPitch + y rowPitch + x texelSize + offset
对于压缩格式,rowPitch 是相邻行中压缩块之间的字节数。arrayPitch 是相邻数组层中块之间的字节数。depthPitch 是 3D 图像相邻切片中块之间的字节数。
// (x,y,z,layer) 在块坐标中
address(x,y,z,layer) = layer arrayPitch + z depthPitch + y rowPitch + x blockSize + offset;
对于未创建为数组的图像,arrayPitch 未定义。depthPitch 仅针对 3D 图像定义。
对于颜色格式,VkImageSubresource 的 aspectMask 成员必须是 VK_IMAGE_ASPECT_COLOR_BIT。对于深度/模板格式,aspect 必须是 VK_IMAGE_ASPECT_DEPTH_BIT 或 VK_IMAGE_ASPECT_STENCIL_BIT。在分别存储深度和模板方面的实现上,查询这些子资源布局中的每一个将返回不同的偏移量和大小,表示用于该方面的内存区域。在存储深度和模板方面交错存储的实现中,返回相同的偏移量和大小,并表示交错的内存分配。
我的图像是普通的 2D 图像(0 层,1 个 mipmap),所以没有arrayPitch或depthPitch。由于 S3TC 压缩是由硬件直接支持的,所以应该可以不用先解压缩就可以使用图像数据。在 OpenGL 中,这可以使用glCompressedTexImage2D来完成,这在过去对我有用。
在 OpenGL 中,我使用 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 作为图像格式,对于 Vulkan,我使用 VK_FORMAT_BC1_RGBA_UNORM_BLOCK,这应该是等效的。这是我用于映射图像数据的代码:
这是初始化图像的代码:
代码运行没有问题,但生成的图像不正确。这是源图像:
这是结果:
我确信问题在于我发布的第一个代码被剪断,但是,如果没有,我已经从 Vulkan SDK 编写了一个三角形演示的小改编,它产生了相同的结果。可以在这里下载。包含源代码,我从三角形演示中更改的只是 tri.c 中的“demo_prepare_texture_image”函数(第 803 到 903 行)以及“dds.cpp”和“dds.h”文件。“dds.cpp”包含加载 dds 和映射图像内存的代码。
我正在使用gli加载 dds-data(它应该“与 Vulkan 完美配合”),它也包含在上面的下载中。要构建项目,必须将 Vulkan SDK 包含目录添加到“tri”项目中,并且必须更改 dds 的路径(tri.c,第 809 行)。
源图像(项目中的“x64/Debug/test.dds”)使用 DXT1 压缩。我也在不同的硬件上进行了测试,结果相同。
任何用于初始化/映射压缩图像的示例代码也会有很大帮助。
c++ - VK_KHR_WIN32_SURFACE_EXTENSION_NAME 未定义,在 Vulkan 代码中
我正在尝试编写一个简单的基于 vulkan 的应用程序,但是在尝试将表面扩展添加到启用的扩展列表时,如下所示:
Visual Studio 抱怨这VK_KHR_WIN32_SURFACE_EXTENSION_NAME
是未定义的。
当我右键单击它并转到定义时,它会打开 vulkan.h。经过检查,VK_USE_PLATFORM_WIN32_KHR
我发现这也是未定义的,这阻止了VK_KHR_WIN32_SURFACE_EXTENSION_NAME
. 有人可以解释如何解决这个问题吗?