Ryo*_*oku 5 c++ glsl vulkan spir-v
可以有一个专门化常量数组,这样 glsl 代码看起来类似于以下内容:
layout(constant_id = 0) const vec2 arr[2] = vec2[] (
vec2(2.0f, 2.0f),
vec2(4.0f, 4.0f)
);
Run Code Online (Sandbox Code Playgroud)
或者,或者:
layout(constant_id = 0) const float arr[4] = float[] (
2.0f, 2.0f,
4.0f, 4.0f
);
Run Code Online (Sandbox Code Playgroud)
据我所知,可以使用的专门化常量的数量没有限制,所以感觉很奇怪,这是不可能的,但是当我尝试上述操作时,SPIR-V 编译器通知我“constant_id”只能应用于标量。目前,我使用统一缓冲区来提供数据,但我想消除后备缓冲区以及在绘制之前绑定缓冲区的需要,并允许系统在管道创建期间优化代码(如果可能)。
着色语言(Vulkan-GLSL 和 SPIR-V)在着色器内专门化常量的定义和专门化这些常量的接口之间做了一些区分。但他们以不同的方式进行这个过程。
在这两种语言中,专门化常量的外部接口仅适用于标量值。也就是说,虽然您可以将多个常量设置为值,但您设置的每个常量都是一个标量。
SPIR-V 允许您声明一个复合常量(数组/向量/矩阵)。但是,该组合的组件必须是专门化常量或常量值。如果这些组件是标量专门化常量,则可以OpDecorate使用外部代码将访问的 ID 来对它们进行操作。
Vulkan(和 OpenGL)GLSL 的处理方式与原始 SPIR-V 略有不同。在 GLSL 中,const带 a 的限定值constant_id是专门化常量。这些必须是标量。
但是,您还可以拥有const由常量表达式或专门化常量的值初始化的 - 限定值。您不需要使用 来限定这些,但是您可以从具有constant_id如此限定条件的事物构建它们:
layout(constant_id = 18) const int scX = 1;
layout(constant_id = 19) const int scZ = 1;
const vec3 scVec = vec3(scX, 1, scZ); // partially specialized vector
Run Code Online (Sandbox Code Playgroud)
const从专门化常量初始化的限定值称为“部分专门化”。当此 GLSL 转换为 SPIR-V 时,这些将转换为OpSpecConstantComposite值。
| 归档时间: |
|
| 查看次数: |
1040 次 |
| 最近记录: |