首页
学习
活动
专区
圈层
工具
发布

GLSL声明
EN

Stack Overflow用户
提问于 2020-10-26 15:06:50
回答 1查看 76关注 0票数 2

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

代码语言:javascript
复制
const;
const a;
const a, b;

但是,当我用glslangValidator检查它时,这会显示为语法错误:

代码语言:javascript
复制
test.vert
ERROR: 0:1: 'a' : identifier not previously declared 
ERROR: 1 compilation errors.  No code generated.

这些声明应该是有效的吗?它应该是"type_specifier“而不是"type_qualifier”,而这只是一个错误吗?

以下是规范中的相关位元:

代码语言:javascript
复制
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

这里是到完整规范的链接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-26 15:23:10

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

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

因此,宣言:

代码语言:javascript
复制
const;

在语义上没有意义,尽管语法上是合法的。

注意,type-qualifier允许一系列限定符。请注意,这些限定符包括存储限定符inoutuniformbuffer

通过允许type-qualifier SEMICOLON,标准允许这样的语法:

代码语言:javascript
复制
layout(std140) uniform;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64539761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档