问题标签 [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 投票
1 回答
567 浏览

opencl - 截至 2018 年年中,NVIDIA SPIR 支持的状态如何?

这个问题:

NVidia 是否支持 OpenCL SPIR?

5年前被问到。从那时起,NVIDIA 对 Khronos OpenCL 的支持在此期间有所改进,并且它还采用了 Khronos Vulkan(我对此知之甚少),我想知道 SPIR(如果你愿意的话,相当于 PTX 的 Khronos 标准)是否发生了变化也是。

0 投票
1 回答
763 浏览

opengl - 用于数组大小的专业化常数

我正在尝试使用 SPIR-V专业化常量来定义统一块中数组的大小。

count = 0在着色器中声明,编译失败并显示:

使用count = 1和专业化 5,代码编译但在运行时链接失败,并抱怨别名:

似乎统一块的布局(每个成员的偏移量)在专业化期间不受影响,因此foo重叠bar

显式偏移也不起作用,并导致相同的链接错误:

这是预期的行为吗?俯瞰?可以使用专门化常量来定义数组的大小吗?

0 投票
3 回答
1691 浏览

clang - 如何使用 Clang 将 OpenCL 内核编译为 SPIR-V

我需要在 SPIR-V 中编译 OpenCL 内核才能与 Vulkan 一起使用,我尝试使用 Google CLSPV https://github.com/google/clspv,但是矢量化出现问题,像 vload8 这样的功能不起作用。所以我需要使用 clang 在 SPIR-V 中编译 OpenCL 内核。

0 投票
1 回答
603 浏览

opengl - 当一个着色器优化而另一个未优化时,为什么我的 GLSL 程序无法链接?

我正在使用着色器工具链,从 GLSL 开始,将其编译为 SPIRV,优化 SPIRV,然后使用 spirv-cross 生成优化的 GLSL。这在大多数情况下运作良好。

但是,我有一种机制,用户生成的片段可以通过文本替换注入到一些片段着色器中。发生这种情况时,将使用原始未优化的 GLSL,因为用于文本替换的标记无法通过 SPIRV 传输。

但是,我发现在某些情况下优化的顶点着色器和自定义的片段着色器都会编译,但程序不会链接,而是给出以下错误:

优化的顶点着色器和优化的片段着色器链接。两个链接的未优化版本。甚至未优化的顶点着色器和优化的片段着色器链接。

我已将问题缩小到以下声明,该声明出现在片段着色器中

在未将整个 UBO 优化为未使用的着色器的优化版本中,声明变为

如果我手动修改未优化的片段着色器以使用类似的机制来命名 UBO,链接错误就会消失(不管我如何命名 UBO),例如,对片段着色器的以下更改编译并成功链接。

我显然可以解决这个问题,但我不明白 UBO 声明的不同语法如何完全破坏我的程序的链接阶段。谁能提供一些见解?

此外,如果glslangValidator-> spirv-opt->中的某些spirv-cross内容正在更改我的着色器的链接接口,我是否应该认为这是一个错误并报告它?

0 投票
1 回答
2048 浏览

rust - 是否可以在运行时编译 Vulkano 着色器?

我一直在使用 Vulkano 来制作一些简单的 3D 图形。通常,我喜欢在文本中编写我的 GLSL 着色器并重新启动我的程序,甚至在程序运行时更改着色器。Vulkano 中给出的示例似乎使用宏将 GLSL 转换为某种形式的基于 SPIR-V 的着色器,并附加了 Rust 函数,但 GLSL 实际上被编译成二进制文件(即使使用文件路径)。

我已经设法让 crate shaderc 即时构建我的 SPIR-V:

到目前为止,一切都很好,我们已经ShaderModule迈出了第一步。但是,我们实际上需要的是一个GraphicsEntryPoint,然后我们可以将其放入我们的GraphicsPipeline. 显然,GraphicsPipeline这是我们将着色器、三角形和深度图以及所有可爱的东西串在一起的地方。

麻烦的是,我不知道执行此壮举的代码发生了什么:

具体来说,什么是VertInputVertOutput?我已经从示例中复制了它们。

这是我能找到的处理动态加载Shaders 的最接近的示例。它看起来Input并且Output正在寻找进入 SPIR-V 或其他东西的入口点,但我不知道该怎么做。我希望现有宏中的某处有一个函数可以为我解决这个问题。我已经走了这么远,但我似乎有点卡住了。

有没有其他人尝试在运行时加载着色器?

0 投票
1 回答
330 浏览

opengl - 在 OpenGL 4.6 中没有对我有用的 alpha 混合

我正在使用编译为 SPIR-V 的 OpenGL 和 460 版着色器开发粒子系统。

我的粒子基于带有 alpha 的 PNG 纹理,它实际上非常简单,我之前在早期的 OpenGL 版本上做过。

然而,输出窗口中的粒子仍然是一个正方形,边角是黑色的——也就是说,alpha 通道被绘制为黑色。我使用了不同的 PNG 文件,其中一个带有 alpha 上的灰色或黑色上的灰色的粒子。我在片段着色器中将第四个组件设置为 0.0 或 0.5 以查看任何变化,但没有任何变化。我尝试更改 loadTexture 函数中的格式,但还是一样。

我尝试了各种不同的混合模式并改变了线条的顺序。我在 RenderDoc 中注意到目标混合被禁用。但是将 glEnable(GL_BLEND) 更改为另一个位置并没有帮助。

我将衷心感谢您的帮助!

粒子纹理1粒子纹理2

这里是渲染帧中的输出和来自 RenderDoc 的信息:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

0 投票
1 回答
360 浏览

c++ - 一个粒子太多:生成 GL_INVALID_VALUE 错误。不满足着色器存储缓冲区的最低对齐要求

我的粒子系统出现一个奇怪的错误。我动态设置缓冲区的大小,并且可以根据需要更改粒子的数量。我玩的是 30k、40k 之类的数字以及介于两者之间的所有数字。最大值达到了 40800... 然后我从输出终端的标题中得到错误。

这是代码:

就像我说的那样,一切正常,除了在 40801 粒子处,我的日志中出现以下错误,并且我的一些缓冲区不再加载:

0 投票
1 回答
141 浏览

opengl - 是否必须为几何着色器中发射的每个顶点设置每个变量?

在我在 OpenGL 中使用的几何着色器中,在开始时设置一个变量,然后在不重置它的情况下发射顶点,但在 vulkan 中,如果我不在每个代码之间写入该变量,EmitVertex()我的代码将无法正常工作。

我在 glsl 规范中找不到任何关于此的内容,是否有针对此的规则,而第一种情况恰好有效?转向 spirv 有什么改变吗?

0 投票
1 回答
735 浏览

readonly - OpenGL ES 和 Spir-V 中的只读存储缓冲区

在 OpenGL ES 着色语言中,着色器存储缓冲区对象 (SSBO) 可以用限定符readonlywriteonly. OpenGL ES Shading Language 3.1 版规范
的第 4.9 节(内存访问限定符):

着色器存储块、在着色器存储块中声明的变量和声明为图像类型的变量(在其关键字中带有“image”的基本不透明类型)可以进一步使用以下一个或多个内存限定符进行限定:...(A table已列出)

所以我可以在 opengl es 着色器中有这样的东西:

但是如何在 spir-v中指定只读呢?
spir-v 规范的 3.18 部分,访问限定符中,它说:

由 OpTypeImage 和 OpTypePipe 使用。

这是否意味着,在 spir-v 中,SSBO 不能指定为只读?我不认为 SSBO 属于 OpTypeImage 或 OpTypePipe 类型。

0 投票
0 回答
32 浏览

glsl - 我想链接 glslang 和 SPIRV 时出现 LINK 错误

我想使用 glslang 和 SPIRV 库进行在线 glsl 转换和 spirv 生成,我能够通过 cmake 生成项目文件,并且能够成功构建项目 glslang.sln,构建过程产生了所有必需的库以及可执行文件,但是当我设置我的 VS 项目并尝试链接 glslang 和 SPIRV 时,我收到以下链接错误:

我正在使用的库是SPIRV.lib glslang.lib OGLCompiler.lib OSDependent.lib HLSL.lib

我的库文件夹包含以下库:

在此处输入图像描述

我正在使用 VS 2019 平台 x64