获取此 GLSL 示例代码:
layout(set = 0, binding = 0) uniform BlockName {
mat4 someMtx;
} instanceName;
在此上下文中“BlockName”的用途是什么?
我知道您可以使用 block 名称来匹配管道阶段的输入/输出。但 Vulkan 中统一 block 的用途是什么?
最佳答案
目的是 GLSL 需要它。
GLSL 是为 OpenGL 制作的。它可以与 Vulkan 一起使用,但 GLSL 的实际功能是为了满足 OpenGL 的需求而设计的。由于 Vulkan 是一个非常不同的 API,这意味着您有时会拥有残留的功能。
像这些。
在 OpenGL 中,资源是通过名称来识别和查询的。如果两个资源使用相同的名称,则它们是相同的资源(它们还必须与其他属性匹配或出现错误结果,但名称匹配是必需的)。因此, block 名称成为 GLSL interface blocks 语法的一部分。 。您不能不将它们放在任何接口(interface) block 上(UBO 是接口(interface) block 的子集)。
Vulkan(和 SPIR-V)不关心名称。对于接口(interface)变量,该名称仍然有用,因为 GLSL 代码本身在想要访问该变量时使用该名称。但 block 名称仅由外部 API 使用; GLSL 代码本身从未使用过它们。
因此,当您使用仅接口(interface)名称的 GLSL 构造来提供不关心接口(interface)名称的 API 时,您会得到 block 名称:一个需要存在的名称,因为 GLSL需要它,但实际上并没有做 GLSL 期望的事情。
关于glsl - Vulkan GLSL 中 block 名称有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75338016/