GLSL声明
我正在阅读GLSL规范,并在语法部分的第9章中注意到声明只能由类型限定符组成。这让我相信规范允许这样的声明: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
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应该是相同的,不必考虑它。