[英]Is it possible to assign a storage buffer to a variable in glsl shader?
我通过以下方式在 GLSL 着色器中定义了一个缓冲区描述符:
layout(set = 1, binding = 0) buffer ShadowMapData { ShadowMapItem items[]; }
uShadowMapDataRegister[];
有没有办法从这个描述符的索引全局创建一个变量。 我尝试了以下但它抛出语法错误:
ShadowMapData uShadowMap = uShadowMapDataRegister[6];
错误:'':语法错误,意外的标识符,需要 LEFT_BRACE 或 COMMA 或 SEMICOLON
ShadowMapData
不是类型名称; 它只是描述符的名称。 就 GLSL 而言, uShadowMapDataRegister[x]
没有“类型”。
SPIR-V 其实比这个更具体。 对于 SPIR-V,SSBO 数组中的条目确实解析为某种特定类型,您可以访问其中的元素。 也就是说,每个 SSBO 都有一个为其定义的实际类型,其中包含其成员声明。 因此,如果您直接在 SPIR-V 中工作,您可以(某种程度上)做到这一点。
话虽这么说,你试图做的具体事情(声明一个变量并从缓冲区初始化它)是一个坏主意。 这会导致将该缓冲区的合法副本复制到本地 memory。这不会便宜。 虽然编译器可能会通过各种方式避免复制,但最好不要一开始就要求制作这样的副本。 GLSL 没有引用的概念,所以你只需要拼写出来。
此外,它甚至不能在 SPIR-V 中工作。 无界数组只能在有限的情况下创建,例如在缓冲区中作为缓冲区变量主要类型的最后一个成员。 所以你不能创建一个无限数组大小的局部变量。
经过一段时间尝试找出执行此操作的方法,因为我已经在使用预处理器指令,所以我使用#define
来简化它,同时仍然内联检索值:
// Make sure to not add ";" at the end of this
#define uShadowMap uShadowMapDataRegister[6]
void main() {
uShadowMap.items[1];
}
由于这些预处理器指令的工作方式类似于它们在 C 中的工作方式,因此也可以从中创建“函数”:
// Make sure to not add ";" at the end of this
#define getShadowMap(index) uShadowMapDataRegister[6].items[(index)]
void main() {
getShadowMap(uSceneData.shadowMapIndex)...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.