在几何着色器中将单个全局变量声明为SSBO会导致编译器错误

时间:2015-12-12 11:47:52

标签: opengl glsl shader

read,那个

  

单个全局变量可以声明为SSBO

我尝试在几何着色器(buffer vec2 name[];)中声明#version 440。编译失败,说明如下:

  

OpenGL不允许在全局范围内声明缓冲区变量“name”。请改用缓冲区块。

那么,我错过了什么?

2 个答案:

答案 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节“接口块”),它们是   然后称为着色器存储块。在全局声明缓冲区变量是编译时错误   范围(块外)。