我read,那个
单个全局变量可以声明为SSBO
我尝试在几何着色器(buffer vec2 name[];
)中声明#version 440
。编译失败,说明如下:
OpenGL不允许在全局范围内声明缓冲区变量“name”。请改用缓冲区块。
那么,我错过了什么?
答案 0 :(得分:2)
由于GLSL 4.40更新中的规范发生变化,这似乎是Wiki中的一个错误。也就是说,GLSL 4.40的原始版本说:
显然,这是矛盾的。第一段建议声明裸缓冲变量是可以的。第二段说缓冲变量只能是缓冲区限定符可以与任何基本数据类型一起使用,或者在声明类型为结构的变量或其中任何一个的数组时使用。
缓冲区变量只能在接口块(第4.3.9节“接口块”)中声明,然后称为着色器存储块。在全局范围(块外)声明缓冲区变量是编译时错误。缓冲区变量不能有初始值设定项。
buffer
- 合格接口块的一部分。
对4.40的修订之一改为:
缓冲区限定符可用于声明接口块(第4.3.9节“接口” 块“),然后称为着色器存储块。声明缓冲区是编译时错误 全局范围内的变量(块外)。
很明显,有一次这是真的。 ARB_shader_storage_buffer_object规范仍然有旧的措辞。 Wiki只需要使用当前行为进行更新。
答案 1 :(得分:0)
根据GLSL 4.5 Specification (Section 4.3.7 Buffer Variables):
缓冲区限定符可用于声明接口块(第4.3.9节“接口块”),它们是 然后称为着色器存储块。在全局声明缓冲区变量是编译时错误 范围(块外)。