问题标签 [spir-v]

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 投票
0 回答
87 浏览

glsl - 通过 GL_KHR_vulkan_glsl 优化使用 push_constant 空间

我有一个 Vulkan 应用程序,其中着色器作为 GLSL 提供,并根据 GL_KHR_vulkan_glsl 规范使用 spirv cross 编译。我尝试通过 push_constant 块向着色器提供数据。然而,问题是如果没有布局/偏移限定符,顶点和片段阶段中的块似乎重叠。当然,我可以在片段阶段分配块,例如偏移 64,并将顶点阶段限制为该值。但是,如果顶点着色器需要超过 64 个字节并且我的 push_constant 空间非常有限(128 个字节),那么这是不灵活的。我的 GLSL 着色器是自动生成的。当然,我可以让生成器生成偏移量,但是我必须在片段着色器编译之前根据 std140/std430 计算顶点着色器 push_constant 的使用情况,这是我不习惯的。

首先,我尝试将来自顶点和片段阶段的推送常量组合到一个块中,该块在顶点和片段阶段都声明。但是,顶点阶段似乎优化了仅由片段阶段使用的推送常量,反之亦然,我得到一个 UNASSIGNED-CoreValidation-Shader-PushConstantOutOfRange 错误。

您能否向我推荐一种方法,如何避免顶点和片段着色器 push_const 块之间的重叠,同时仍以最佳方式共享 128 字节空间?

问候

0 投票
1 回答
127 浏览

vulkan - 确定输入附件在着色器中是否有效

对于片段着色器,可以将颜色附件索引设置为VK_ATTACHMENT_UNUSED(来自 C/C++ API);在这种情况下,对这些附件的写入将被丢弃。这很好,因为它允许我们编写无条件写入输出附件的着色器,并且写入可能会或可能不会被丢弃,具体取决于渲染器的决定。

也可以将输入附件索引设置为VK_ATTACHMENT_UNUSED,但我们不允许从此类附件中读取。这意味着如果输入附件可以VK_ATTACHMENT_UNUSED,着色器必须知道它是否应该从中读取。

是否有 glsl/spir-v 内置方法来检查输入附件是否绑定到有效的图像视图 vs 指向VK_ATTACHMENT_UNUSED?否则,应用程序必须将数据传递给着色器,以确定是否可以读取。那是一种痛苦。

内置的东西,如:

0 投票
1 回答
50 浏览

fragment-shader - 在顶点和片段着色器之间传递值时着色器值转换错误

我有以下片段和顶点着色器。

顶点:

分段:

但是在编译时,我收到以下错误:

无法从“浮动位置的 gl_Position 4 分量向量”转换为“布局(位置 = 0)平滑浮动的 highp 2 分量向量”

而且我不知道如何解决它。(这是我第一次做着色器编程)。
如果需要更多信息,请告诉我。

0 投票
1 回答
68 浏览

c++ - 如何使用 CMake 将文件放在目标文件位置旁边?

我想自动将 GLSL 着色器构建到 SPIR-V,然后使用 CMake 将它们复制到可执行目标的位置。为此,我创建了以下函数:

它需要一个目标名称和一个 GLSL 文件列表作为参数。我这样调用它:

我希望这能够编译basic.vert并编译到位于同一目录中的basic.frag相应文件。不幸的是,我收到以下错误:.spvmini-vk.exe

我不确定为什么没有“没有目标mini-vk”,因为它是在上面的行中创建的target_shaders

为清楚起见,如果我通过更改以下定义手动键入输出路径,则代码确实有效path_out

不过,我不想使用这个 hack。

0 投票
1 回答
572 浏览

vulkan - 是否有一个好的 HLSL 到 SPIR-V 编译器?

我正在用 C++ 编写体素引擎,并且正在实现 Vulkan 渲染器。我决定用 HLSL 编写着色器,并通过 SPIRV-Cross 翻译它们。然而,这给我带来了一个问题——glslang 的 HLSL 编译器不允许采样器。例如,这个像素着色器:

给出这个编译器输出:

我不知道我是否应该在 GLSL 中编写我的着色器,或者使用不同的库。任何帮助,将不胜感激。

0 投票
1 回答
42 浏览

glsl - vkCreateComputePipelines 耗时太长

我在编译 Vulkan 计算着色器时遇到了一个奇怪的问题。我有这个着色器(甚至没有那么复杂)

该函数ray_cast可能是这个着色器中最复杂的部分,但我也在许多其他即时编译的着色器中重用了这个完全相同的函数。我想知道是否GL_KHR_shader_subgroup_arithmetic可能会放慢速度vkCreateComputePipelines,但如果删除它没有任何区别。Vulkan 需要一分钟多的时间才能完成vkCreateComputePipelines。我还包含了一堆实用函数,但我只使用了其中的几个常量ray_cast,因此 90% 的代码未被使用,应该由 glslc 删除。会不会是 Vulkan 正在悄悄地尝试执行任何其他类型的优化并导致延迟?我认为所有的优化都是由 glslc 完成的,并且在 SPIR-V 上没有做太多的后处理。顺便说一句,我使用 Nvidia 和他们的专有驱动程序。

我真的很困惑为什么这个着色器创建起来这么慢,尽管我有其他着色器长十倍,更复杂,但它们会立即加载。

有什么方法可以描述这个吗?

0 投票
0 回答
42 浏览

c# - SPIRV-Cross 无法编译 DirectXShaderCompiler 编译的 hlsl 代码

我有这种使用dndxc将 hlsl 着色器编译为 SPIR-V 的方法:

这似乎生成了有效的 spirv 源,但是稍后在程序中将它传递给 SPIR-V cross(或者就此而言,通过命令行上的二进制文件)会产生这个错误:Compilation failed: SPIR-V instruction goes out of bounds.
我真的被这个错误难住了;任何帮助将非常感激。

0 投票
0 回答
21 浏览

glsl - 用于区分 3d 对象 SPIRV 上的面部的简单照明

我正在尝试编写一个着色器来提供 3d 场景的基本照明,以便对对象上的面进行不同的照明。

目标

这似乎是通过简单的全局照明来完成的。我尝试使用片段着色器(SPIRV)复制它,如下所示:

结果:我的着色器结果(大的白色斑点和蓝色背景)

所以有几件事。

  1. 我的数学显然不正确,它只是加法,实际上不会导致脸变黑。
  2. 性能很差。

我可以为每个三角形分配不同的颜色,但这需要我重新处理我的顶点和索引缓冲区以获得一致的外观,并且仍然适用于单个三角形而不是整个面。

有什么建议可以实现这种简单的外观吗?

0 投票
1 回答
93 浏览

glsl - 由 SPIR-V 的 SPIRV-cross 生成的 GLSL 是否违反了 std140 规则?

我把我的 HLSL 代码片段放在这里:https ://shader-playground.timjones.io/d9011ef7826a68ed93394792c2edb732

我使用 DXC 将 HLSL 编译为 SPIR-V,然后使用 SPIRV-Cross 获取 GLSL 代码。GLSL 常量缓冲区用 std140 标记,它包含 vec3 和 float。据我所知,这是行不通的。这里不应该使用 GL_EXT_scalar_block_layout 吗?常量块应该用标量而不是 std140 标记。我在这里遗漏了一些明显的东西吗?谢谢。

0 投票
1 回答
74 浏览

vulkan - 有没有办法强制 SPIR-V 汇编函数同时接受 Private 和 Function 存储类数组?

我正在为 SPIR-V 着色器编写二进制处理模块,以解决由于驱动程序错误而导致的 float4x3[6] 矩阵的对齐问题。现在我有:

  • 注入必要的适当 OpTypes 和 OpTypePointers。
  • 处理二进制文件以将常量缓冲区成员从 float4x3[6] 更改为 vec4[18]
  • 注入函数将 vec4[18] 正确解包到 float4x3[6] 中,接受 vec4[18] 作为指向统一数组 18 的指针。
  • 创建了私有存储限定符矩阵解包目标作为 OpVariables。(SPIR-V 中的私有只是意味着调用级全局......)。
  • 注入了关于复合提取和构造的序言来调用我的新函数。(因为我看到我们需要将参数从常量缓冲区复制到函数,所以这就是我所做的)。
  • 从入口点调用该函数,以便每个 float4x3[6] 成员在 main() 启动时准备好解包矩阵。
  • 更改了引用常量缓冲区中给定成员的 OpAccessChain 操作,并将它们与引用我的新私有目标的访问链交换。

但现在我遇到了麻烦。看起来 SPIR-V 中的函数可以接受 Private 或 Function 存储限定符指针。不是都。有什么办法可以告诉 SPIR-V “是的,你可以在这里将这两个存储类作为参数转储”?

或者我是否需要重新设计我的解决方案以利用函数存储类矩阵目标,并在每次将它们用于新函数时注入它们并调用以解压它们?这似乎不太优雅,因为那时可能会有更多的解包操作。而且更轻松,因为我必须分别扫描每个 OpFunction 块并将带有函数存储的 OpVariables 注入使用矩阵的每个块中。

我的问题是,在完成所有这些机器之后,我的目标是作为私有存储持续时间的 OpTypePointer 生活的。因此我不能在从 HLSL 生成的任何 SPIR-V 函数中使用它们,因为它们采用函数持续时间的 OpTypePointers。我的解包函数是唯一的例外,因为我直接将它逐字节地注入到 SPIR-V asm 中,并且能够精确地调整标头中的 OpFunctionParameters。