GLSL声明

GLSL声明,glsl,Glsl,我正在阅读GLSL规范,并在语法部分的第9章中注意到声明只能由类型限定符组成。这让我相信规范允许这样的声明: const; 常数a; 常数a,b; 但当我使用glslangValidator检查时,这显示为语法错误: test.vert ERROR: 0:1: 'a' : identifier not previously declared ERROR: 1 compilation errors. No code generated. 这些类型的声明被认为是有效的吗?它是不是应该是“ty

我正在阅读GLSL规范,并在语法部分的第9章中注意到声明只能由类型限定符组成。这让我相信规范允许这样的声明:

const;
常数a;
常数a,b;
但当我使用glslangValidator检查时,这显示为语法错误:

test.vert
ERROR: 0:1: 'a' : identifier not previously declared 
ERROR: 1 compilation errors.  No code generated.
这些类型的声明被认为是有效的吗?它是不是应该是“type\u说明符”而不是“type\u限定符”,这只是一个错误

以下是规范中的相关位:

invariant_qualifier :
  INVARIANT

interpolation_qualifier :
  SMOOTH
  FLAT
  NOPERSPECTIVE

layout_qualifier :
  LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN

layout_qualifier_id_list :
  layout_qualifier_id
  layout_qualifier_id_list COMMA layout_qualifier_id

layout_qualifier_id :
  IDENTIFIER
  IDENTIFIER EQUAL constant_expression
  SHARED

storage_qualifier :
  CONST
  IN
  OUT
  INOUT
  CENTROID
  PATCH
  SAMPLE
  UNIFORM
  BUFFER
  SHARED
  COHERENT
  VOLATILE
  RESTRICT
  READONLY
  WRITEONLY
  SUBROUTINE
  SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN

precise_qualifier :
  PRECISE

type_qualifier :
  single_type_qualifier
  type_qualifier single_type_qualifier

single_type_qualifier :
  storage_qualifier
  layout_qualifier
  precision_qualifier
  interpolation_qualifier
  invariant_qualifier
  precise_qualifier

declaration :
  function_prototype SEMICOLON
  init_declarator_list SEMICOLON
  PRECISION precision_qualifier type_specifier SEMICOLON
  type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE SEMICOLON
  type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER SEMICOLON
  type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER array_specifier SEMICOLON
  type_qualifier SEMICOLON
  type_qualifier IDENTIFIER SEMICOLON
  type_qualifier IDENTIFIER identifier_list SEMICOLON

是指向完整规范的链接。

语言不仅仅是其语法结构。你可以写一个符合英语语法规则的句子,但它实际上没有任何意义

这里也一样。仅使用类型限定符在语法上是合法的。但这并不意味着在语义上对每个类型限定符都有效。甚至是大多数

因此,宣言:

const;
尽管在语法上是合法的,但在语义上没有意义

请注意,
类型限定符
允许一系列限定符。请注意,在限定符中有存储限定符
in
out
统一
缓冲区

通过允许
类型限定符分号
,标准允许这种语法:

layout(std140) uniform;

这在语法上和意义上都是有效的。它将此语句后面的所有统一块的默认布局设置为
std140

,其中称为“语法”错误?这是一个“语义”错误。谢谢!这是有道理的。但是为什么没有提到类型说明符呢?规范中提到的其他地方
vec3是合法的,但是我在声明语法中没有看到它的模式。事实上,我甚至没有看到
vec3a匹配。我收回<代码>初始化声明器列表
匹配得很好。在C标准中,
init_declarator_list
不包含类型模式,因此我认为GLSL应该是相同的,不必考虑它。