OpenGL Shading Language Specification -- Shading Language Grammar

Shading Language Grammar

该语法由词法分析的输出提供输入。词法分析返回的记号(Token)如下:

记号名称(Token Name)GLSL 关键字 / 符号
CONSTconst
BOOLbool
FLOATfloat
INTint
UINTuint
DOUBLEdouble
BVEC2bvec2
BVEC3bvec3
BVEC4bvec4
IVEC2ivec2
IVEC3ivec3
IVEC4ivec4
UVEC2uvec2
UVEC3uvec3
UVEC4uvec4
VEC2vec2
VEC3vec3
VEC4vec4
MAT2mat2
MAT3mat3
MAT4mat4
MAT2X2mat2x2
MAT2X3mat2x3
MAT2X4mat2x4
MAT3X2mat3x2
MAT3X3mat3x3
MAT3X4mat3x4
MAT4X2mat4x2
MAT4X3mat4x3
MAT4X4mat4x4
DVEC2dvec2
DVEC3dvec3
DVEC4dvec4
DMAT2dmat2
DMAT3dmat3
DMAT4dmat4
DMAT2X2dmat2x2
DMAT2X3dmat2x3
DMAT2X4dmat2x4
DMAT3X2dmat3x2
DMAT3X3dmat3x3
DMAT3X4dmat3x4
DMAT4X2dmat4x2
DMAT4X3dmat4x3
DMAT4X4dmat4x4
CENTROIDcentroid
INin
OUTout
INOUTinout
UNIFORMuniform
PATCHpatch
SAMPLEsample
BUFFERbuffer
SHAREDshared
COHERENTcoherent
VOLATILEvolatile
RESTRICTrestrict
READONLYreadonly
WRITEONLYwriteonly
NOPERSPECTIVEnoperspective
FLATflat
SMOOTHsmooth
LAYOUTlayout
ATOMIC_UINTatomic_uint
SAMPLER2Dsampler2D
SAMPLER3Dsampler3D
SAMPLERCUBEsamplerCube
SAMPLER2DSHADOWsampler2DShadow
SAMPLERCUBESHADOWsamplerCubeShadow
SAMPLER2DARRAYsampler2DArray
SAMPLER2DARRAYSHADOWsampler2DArrayShadow
ISAMPLER2Disampler2D
ISAMPLER3Disampler3D
ISAMPLERCUBEisamplerCube
ISAMPLER2DARRAYisampler2DArray
USAMPLER2Dusampler2D
USAMPLER3Dusampler3D
USAMPLERCUBEusamplerCube
USAMPLER2DARRAYusampler2DArray
SAMPLER1Dsampler1D
SAMPLER1DSHADOWsampler1DShadow
SAMPLER1DARRAYsampler1DArray
SAMPLER1DARRAYSHADOWsampler1DArrayShadow
ISAMPLER1Disampler1D
ISAMPLER1DARRAYisampler1DArray
USAMPLER1Dusampler1D
USAMPLER1DARRAYusampler1DArray
SAMPLER2DRECTsampler2DRect
SAMPLER2DRECTSHADOWsampler2DRectShadow
ISAMPLER2DRECTisampler2DRect
USAMPLER2DRECTusampler2DRect
SAMPLERBUFFERsamplerBuffer
ISAMPLERBUFFERisamplerBuffer
USAMPLERBUFFERusamplerBuffer
SAMPLERCUBEARRAYsamplerCubeArray
SAMPLERCUBEARRAYSHADOWsamplerCubeArrayShadow
ISAMPLERCUBEARRAYisamplerCubeArray
USAMPLERCUBEARRAYusamplerCubeArray
SAMPLER2DMSsampler2DMS
ISAMPLER2DMSisampler2DMS
USAMPLER2DMSusampler2DMS
SAMPLER2DMSARRAYsampler2DMSArray
ISAMPLER2DMSARRAYisampler2DMSArray
USAMPLER2DMSARRAYusampler2DMSArray
IMAGE2Dimage2D
IIMAGE2Diimage2D
UIMAGE2Duimage2D
IMAGE3Dimage3D
IIMAGE3Diimage3D
UIMAGE3Duimage3D
IMAGECUBEimageCube
IIMAGECUBEiimageCube
UIMAGECUBEuimageCube
IMAGEBUFFERimageBuffer
IIMAGEBUFFERiimageBuffer
UIMAGEBUFFERuimageBuffer
IMAGE2DARRAYimage2DArray
IIMAGE2DARRAYiimage2DArray
UIMAGE2DARRAYuimage2DArray
IMAGECUBEARRAYimageCubeArray
IIMAGECUBEARRAYiimageCubeArray
UIMAGECUBEARRAYuimageCubeArray
IMAGE1Dimage1D
IIMAGE1Diimage1D
UIMAGE1Duimage1D
IMAGE1DARRAYimage1DArray
IIMAGE1DARRAYiimage1DArray
UIMAGE1DARRAYuimage1DArray
IMAGE2DRECTimage2DRect
IIMAGE2DRECTiimage2DRect
UIMAGE2DRECTuimage2DRect
IMAGE2DMSimage2DMS
IIMAGE2DMSiimage2DMS
UIMAGE2DMSuimage2DMS
IMAGE2DMSARRAYimage2DMSArray
IIMAGE2DMSARRAYiimage2DMSArray
UIMAGE2DMSARRAYuimage2DMSArray
STRUCTstruct
VOIDvoid
WHILEwhile
BREAKbreak
CONTINUEcontinue
DOdo
ELSEelse
FORfor
IFif
DISCARDdiscard
RETURNreturn
SWITCHswitch
CASEcase
DEFAULTdefault
SUBROUTINEsubroutine
IDENTIFIER标识符(Identifiers)
TYPE_NAME标识符(Identifiers)
FLOATCONSTANT浮点数(Floats)
INTCONSTANT整数(Integers)
UINTCONSTANT整数(Integers)
BOOLCONSTANT布尔值(Booleans)
DOUBLECONSTANT浮点数(Floats)
FIELD_SELECTION标识符(Identifiers)
LEFT_OP<<
RIGHT_OP>>
INC_OP++
DEC_OP--
LE_OP<=
GE_OP>=
EQ_OP==
NE_OP!=
AND_OP&&
OR_OP||
XOR_OP^^
MUL_ASSIGN*=
DIV_ASSIGN/=
ADD_ASSIGN+=
MOD_ASSIGN%=
LEFT_ASSIGN<<=
RIGHT_ASSIGN>>=
AND_ASSIGN&=
XOR_ASSIGN^=
OR_ASSIGN|=
SUB_ASSIGN-=
LEFT_PAREN(
RIGHT_PAREN)
LEFT_BRACKET[
RIGHT_BRACKET]
LEFT_BRACE{
RIGHT_BRACE}
DOT.
COMMA,
COLON:
EQUAL=
SEMICOLON;
BANG!
DASH-
TILDE~
PLUS+
STAR*
SLASH/
PERCENT%
LEFT_ANGLE<
RIGHT_ANGLE>
VERTICAL_BAR|
CARET^
AMPERSAND&
QUESTION?
INVARIANTinvariant
PRECISEprecise
HIGH_PRECISIONhighp
MEDIUM_PRECISIONmediump
LOW_PRECISIONlowp
PRECISIONprecision

以下内容基于上述记号描述 OpenGL 着色语言(OpenGL Shading Language)的语法。起始规则为 translation_unit。空着色器(预处理后无待解析记号的着色器)是合法的,不会产生编译时错误,尽管下文的语法未定义用于接受空记号流的规则。


语法规则定义

variable_identifier :
variable_identifier :
    IDENTIFIER
primary_expression :
primary_expression :
    variable_identifier
    INTCONSTANT
    UINTCONSTANT
    FLOATCONSTANT
    BOOLCONSTANT
    DOUBLECONSTANT
    LEFT_PAREN expression RIGHT_PAREN
postfix_expression :
postfix_expression :
    primary_expression
    postfix_expression LEFT_BRACKET integer_expression RIGHT_BRACKET
    function_call
    postfix_expression DOT FIELD_SELECTION
    postfix_expression INC_OP
    postfix_expression DEC_OP

语法说明FIELD_SELECTION 包含结构体中的成员、向量的分量选择,以及用于 length() 方法的 length 标识符。

integer_expression :
integer_expression :
    expression
function_call :
function_call :
    function_call_or_method
function_call_or_method :
function_call_or_method :
    function_call_generic
function_call_generic :
function_call_generic :
    function_call_header_with_parameters RIGHT_PAREN
    function_call_header_no_parameters RIGHT_PAREN
function_call_header_no_parameters :
function_call_header_no_parameters :
    function_call_header VOID
    function_call_header
function_call_header_with_parameters :
function_call_header_with_parameters :
    function_call_header assignment_expression
    function_call_header_with_parameters COMMA assignment_expression
function_call_header :
function_call_header :
    function_identifier LEFT_PAREN

语法说明:构造函数(Constructors)在形式上类似函数,但词法分析会将其中大部分识别为关键字。如今这些构造函数通过 type_specifier 识别。方法(如 .length)、子例程数组调用以及标识符均通过 postfix_expression 识别。

function_identifier :
function_identifier :
    type_specifier
    postfix_expression
unary_expression :
unary_expression :
    postfix_expression
    INC_OP unary_expression
    DEC_OP unary_expression
    unary_operator unary_expression

语法说明:不支持传统形式的类型转换(type casts)。

unary_operator :
unary_operator :
    PLUS
    DASH
    BANG
    TILDE

语法说明:无 *& 一元运算符。着色器不支持指针(Pointers)。

multiplicative_expression :
multiplicative_expression :
    unary_expression
    multiplicative_expression STAR unary_expression
    multiplicative_expression SLASH unary_expression
    multiplicative_expression PERCENT unary_expression
additive_expression :
additive_expression :
    multiplicative_expression
    additive_expression PLUS multiplicative_expression
    additive_expression DASH multiplicative_expression
shift_expression :
shift_expression :
    additive_expression
    shift_expression LEFT_OP additive_expression
    shift_expression RIGHT_OP additive_expression
relational_expression :
relational_expression :
    shift_expression
    relational_expression LEFT_ANGLE shift_expression
    relational_expression RIGHT_ANGLE shift_expression
    relational_expression LE_OP shift_expression
    relational_expression GE_OP shift_expression
equality_expression :
equality_expression :
    relational_expression
    equality_expression EQ_OP relational_expression
    equality_expression NE_OP relational_expression
and_expression :
and_expression :
    equality_expression
    and_expression AMPERSAND equality_expression
exclusive_or_expression :
exclusive_or_expression :
    and_expression
    exclusive_or_expression CARET and_expression
inclusive_or_expression :
inclusive_or_expression :
    exclusive_or_expression
    inclusive_or_expression VERTICAL_BAR exclusive_or_expression
logical_and_expression :
logical_and_expression :
    inclusive_or_expression
    logical_and_expression AND_OP inclusive_or_expression
logical_xor_expression :
logical_xor_expression :
    logical_and_expression
    logical_xor_expression XOR_OP logical_and_expression
logical_or_expression :
logical_or_expression :
    logical_xor_expression
    logical_or_expression OR_OP logical_xor_expression
conditional_expression :
conditional_expression :
    logical_or_expression
    logical_or_expression QUESTION expression COLON assignment_expression
assignment_expression :
assignment_expression :
    conditional_expression
    unary_expression assignment_operator assignment_expression
assignment_operator :
assignment_operator :
    EQUAL
    MUL_ASSIGN
    DIV_ASSIGN
    MOD_ASSIGN
    ADD_ASSIGN
    SUB_ASSIGN
    LEFT_ASSIGN
    RIGHT_ASSIGN
    AND_ASSIGN
    XOR_ASSIGN
    OR_ASSIGN
expression :
expression :
    assignment_expression
    expression COMMA assignment_expression
constant_expression :
constant_expression :
    conditional_expression
declaration :
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_list SEMICOLON
identifier_list :
identifier_list :
    IDENTIFIER
    identifier_list COMMA IDENTIFIER
function_prototype :
function_prototype :
    function_declarator RIGHT_PAREN
function_declarator :
function_declarator :
    function_header
    function_header_with_parameters
function_header_with_parameters :
function_header_with_parameters :
    function_header parameter_declaration
    function_header_with_parameters COMMA parameter_declaration
function_header :
function_header :
    fully_specified_type IDENTIFIER LEFT_PAREN
parameter_declarator :
parameter_declarator :
    type_specifier IDENTIFIER
    type_specifier IDENTIFIER array_specifier
parameter_declaration :
parameter_declaration :
    type_qualifier parameter_declarator
    parameter_declarator
    type_qualifier parameter_type_specifier
    parameter_type_specifier
parameter_type_specifier :
parameter_type_specifier :
    type_specifier
init_declarator_list :
init_declarator_list :
    single_declaration
    init_declarator_list COMMA IDENTIFIER
    init_declarator_list COMMA IDENTIFIER array_specifier
    init_declarator_list COMMA IDENTIFIER array_specifier EQUAL initializer
    init_declarator_list COMMA IDENTIFIER EQUAL initializer
single_declaration :
single_declaration :
    fully_specified_type
    fully_specified_type IDENTIFIER
    fully_specified_type IDENTIFIER array_specifier
    fully_specified_type IDENTIFIER array_specifier EQUAL initializer
    fully_specified_type IDENTIFIER EQUAL initializer

语法说明:无 enum(枚举)或 typedef(类型定义)关键字。

fully_specified_type :
fully_specified_type :
    type_specifier
    type_qualifier type_specifier
invariant_qualifier :
invariant_qualifier :
    INVARIANT
interpolation_qualifier :
interpolation_qualifier :
    SMOOTH
    FLAT
    NOPERSPECTIVE
layout_qualifier :
layout_qualifier :
    LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN
layout_qualifier_id_list :
layout_qualifier_id_list :
    layout_qualifier_id
    layout_qualifier_id_list COMMA layout_qualifier_id
layout_qualifier_id :
layout_qualifier_id :
    IDENTIFIER
    IDENTIFIER EQUAL constant_expression
    SHARED
precise_qualifier :
precise_qualifier :
    PRECISE
type_qualifier :
type_qualifier :
    single_type_qualifier
    type_qualifier single_type_qualifier
single_type_qualifier :
single_type_qualifier :
    storage_qualifier
    layout_qualifier
    precision_qualifier
    interpolation_qualifier
    invariant_qualifier
    precise_qualifier
storage_qualifier :
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
type_name_list :
type_name_list :
    TYPE_NAME
    type_name_list COMMA TYPE_NAME
type_specifier :
type_specifier :
    type_specifier_nonarray
    type_specifier_nonarray array_specifier
array_specifier :
array_specifier :
    LEFT_BRACKET RIGHT_BRACKET
    LEFT_BRACKET conditional_expression RIGHT_BRACKET
    array_specifier LEFT_BRACKET RIGHT_BRACKET
    array_specifier LEFT_BRACKET conditional_expression RIGHT_BRACKET
type_specifier_nonarray :
type_specifier_nonarray :
    VOID
    FLOAT
    DOUBLE
    INT
    UINT
    BOOL
    VEC2
    VEC3
    VEC4
    DVEC2
    DVEC3
    DVEC4
    BVEC2
    BVEC3
    BVEC4
    IVEC2
    IVEC3
    IVEC4
    UVEC2
    UVEC3
    UVEC4
    MAT2
    MAT3
    MAT4
    MAT2X2
    MAT2X3
    MAT2X4
    MAT3X2
    MAT3X3
    MAT3X4
    MAT4X2
    MAT4X3
    MAT4X4
    DMAT2
    DMAT3
    DMAT4
    DMAT2X2
    DMAT2X3
    DMAT2X4
    DMAT3X2
    DMAT3X3
    DMAT3X4
    DMAT4X2
    DMAT4X3
    DMAT4X4
    ATOMIC_UINT
    SAMPLER2D
    SAMPLER3D
    SAMPLERCUBE
    SAMPLER2DSHADOW
    SAMPLERCUBESHADOW
    SAMPLER2DARRAY
    SAMPLER2DARRAYSHADOW
    SAMPLERCUBEARRAY
    SAMPLERCUBEARRAYSHADOW
    ISAMPLER2D
    ISAMPLER3D
    ISAMPLERCUBE
    ISAMPLER2DARRAY
    ISAMPLERCUBEARRAY
    USAMPLER2D
    USAMPLER3D
    USAMPLERCUBE
    USAMPLER2DARRAY
    USAMPLERCUBEARRAY
    SAMPLER1D
    SAMPLER1DSHADOW
    SAMPLER1DARRAY
    SAMPLER1DARRAYSHADOW
    ISAMPLER1D
    ISAMPLER1DARRAY
    USAMPLER1D
    USAMPLER1DARRAY
    SAMPLER2DRECT
    SAMPLER2DRECTSHADOW
    ISAMPLER2DRECT
    USAMPLER2DRECT
    SAMPLERBUFFER
    ISAMPLERBUFFER
    USAMPLERBUFFER
    SAMPLER2DMS
    ISAMPLER2DMS
    USAMPLER2DMS
    SAMPLER2DMSARRAY
    ISAMPLER2DMSARRAY
    USAMPLER2DMSARRAY
    IMAGE2D
    IIMAGE2D
    UIMAGE2D
    IMAGE3D
    IIMAGE3D
    UIMAGE3D
    IMAGECUBE
    IIMAGECUBE
    UIMAGECUBE
    IMAGEBUFFER
    IIMAGEBUFFER
    UIMAGEBUFFER
    IMAGE1D
    IIMAGE1D
    UIMAGE1D
    IMAGE1DARRAY
    IIMAGE1DARRAY
    UIMAGE1DARRAY
    IMAGE2DRECT
    IIMAGE2DRECT
    UIMAGE2DRECT
    IMAGE2DARRAY
    IIMAGE2DARRAY
    UIMAGE2DARRAY
    IMAGECUBEARRAY
    IIMAGECUBEARRAY
    UIMAGECUBEARRAY
    IMAGE2DMS
    IIMAGE2DMS
    UIMAGE2DMS
    IMAGE2DMSARRAY
    IIMAGE2DMSARRAY
    UIMAGE2DMSARRAY
    struct_specifier
    TYPE_NAME
precision_qualifier :
precision_qualifier :
    HIGH_PRECISION
    MEDIUM_PRECISION
    LOW_PRECISION
struct_specifier :
struct_specifier :
    STRUCT IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE
    STRUCT LEFT_BRACE struct_declaration_list RIGHT_BRACE
struct_declaration_list :
struct_declaration_list :
    struct_declaration
    struct_declaration_list struct_declaration
struct_declaration :
struct_declaration :
    type_specifier struct_declarator_list SEMICOLON
    type_qualifier type_specifier struct_declarator_list SEMICOLON
struct_declarator_list :
struct_declarator_list :
    struct_declarator
    struct_declarator_list COMMA struct_declarator
struct_declarator :
struct_declarator :
    IDENTIFIER
    IDENTIFIER array_specifier
initializer :
initializer :
    assignment_expression
    LEFT_BRACE initializer_list RIGHT_BRACE
    LEFT_BRACE initializer_list COMMA RIGHT_BRACE
initializer_list :
initializer_list :
    initializer
    initializer_list COMMA initializer
declaration_statement :
declaration_statement :
    declaration
statement :
statement :
    compound_statement
    simple_statement

语法说明:仅 SWITCH 支持带标签的语句(labeled statements);不支持 goto 语句。

simple_statement :
simple_statement :
    declaration_statement
    expression_statement
    selection_statement
    switch_statement
    case_label
    iteration_statement
    jump_statement
compound_statement :
compound_statement :
    LEFT_BRACE RIGHT_BRACE
    LEFT_BRACE statement_list RIGHT_BRACE
statement_no_new_scope :
statement_no_new_scope :
    compound_statement_no_new_scope
    simple_statement
compound_statement_no_new_scope :
compound_statement_no_new_scope :
    LEFT_BRACE RIGHT_BRACE
    LEFT_BRACE statement_list RIGHT_BRACE
statement_list :
statement_list :
    statement
    statement_list statement
expression_statement :
expression_statement :
    SEMICOLON
    expression SEMICOLON
selection_statement :
selection_statement :
    IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement
selection_rest_statement :
selection_rest_statement :
    statement ELSE statement
    statement
condition :
condition :
    expression
    fully_specified_type IDENTIFIER EQUAL initializer
switch_statement :
switch_statement :
    SWITCH LEFT_PAREN expression RIGHT_PAREN LEFT_BRACE switch_statement_list
    RIGHT_BRACE
switch_statement_list :
switch_statement_list :
    /* 空 */
    statement_list
case_label :
case_label :
    CASE expression COLON
    DEFAULT COLON
iteration_statement :
iteration_statement :
    WHILE LEFT_PAREN condition RIGHT_PAREN statement_no_new_scope
    DO statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON
    FOR LEFT_PAREN for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope
for_init_statement :
for_init_statement :
    expression_statement
    declaration_statement
conditionopt :
conditionopt :
    /* 空 */
    condition
for_rest_statement :
for_rest_statement :
    conditionopt SEMICOLON
    conditionopt SEMICOLON expression
jump_statement :
jump_statement :
    CONTINUE SEMICOLON
    BREAK SEMICOLON
    RETURN SEMICOLON
    RETURN expression SEMICOLON
    DISCARD SEMICOLON // 仅片段着色器(Fragment shader)支持

语法说明:无 goto 语句。着色器不支持 goto 跳转。

translation_unit :
translation_unit :
    external_declaration
    translation_unit external_declaration
external_declaration :
external_declaration :
    function_definition
    declaration
    SEMICOLON
function_definition :
function_definition :
    function_prototype compound_statement_no_new_scope

总体而言,上述语法描述了 OpenGL 着色语言的一个超集。某些仅在语法层面合法的语法结构,会被本规范其他章节的说明所禁用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值