3.4 注释
注释被限制在/*和*/之间,或者 //与新行之间。因为注释是不可以嵌套的,所以注释开始符(/*或//)在注释内是不会被认识的。一个/*注释要包括其结尾符号*/会注释掉这之间的内容,但是,一个//注释只注释其后的单行的内容,不会影响到下一行。
在注释内部,除了byte值为0之外,任何byte值都可以使用。主时钟的内容不会给出报错,而且注释中的内容也没有必要验证。
行取消号(\)的逻辑判断优先于注释符号。也就是,一个单行注释会在 取消行符号后,包含下一行后结束 。
//一个包含下一行的单行注释 \
a = b; // 这里仍然在第一个注释中。
3.5 符号
此语言,在预处理之后,变为一系列的GLSL符号。一个符号可以是:
符号:
关键字
标识符
整型常量
浮点型常量
操作符
;{}
3.6关键字
下面列出的就是这个语言的关键字,并且(在预处理之后)只能有次说明书中描述的这些关键字,否则会产生一个编译期错误:
attribute const uniform varying buffer shared
coherent volatile restrict readonly writeonly
atomic_uint
layout
centroid flat smooth noperspective
patch sample
break continue do for while switch case default
if else
subroutine
in out inout
float double int void bool true false
invariant precise
discard return
mat2 mat3 mat4 dmat2 dmat3 dmat4
mat2x2 mat2x3 mat2x4 dmat2x2 dmat2x3 dmat2x4
mat3x2 mat3x3 mat3x4 dmat3x2 dmat3x3 dmat3x4
mat4x2 mat4x3 mat4x4 dmat4x2 dmat4x3 dmat4x4
vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 dvec2 dvec3 dvec4
uint uvec2 uvec3 uvec4
lowp mediump highp precision
sampler1D sampler2D sampler3D samplerCube
sampler1DShadow sampler2DShadow samplerCubeShadow
sampler1DArray sampler2DArray
sampler1DArrayShadow sampler2DArrayShadow
isampler1D isampler2D isampler3D isamplerCube
isampler1DArray isampler2DArray
usampler1D usampler2D usampler3D usamplerCube
usampler1DArray usampler2DArray
sampler2DRect sampler2DRectShadow isampler2DRect usampler2DRect
samplerBuffer isamplerBuffer usamplerBuffer
sampler2DMS isampler2DMS usampler2DMS
sampler2DMSArray isampler2DMSArray usampler2DMSArray
samplerCubeArray samplerCubeArrayShadow isamplerCubeArray usamplerCubeArray
image1D iimage1D uimage1D
image2D iimage2D uimage2D
image3D iimage3D uimage3D
image2DRect iimage2DRect uimage2DRect
imageCube iimageCube uimageCube
imageBuffer iimageBuffer uimageBuffer
image1DArray iimage1DArray uimage1DArray
image2DArray iimage2DArray uimage2DArray
imageCubeArray iimageCubeArray uimageCubeArray
image2DMS iimage2DMS uimage2DMS
image2DMSArray iimage2DMSArray uimage2DMSArray
struct
以下的为未来使用而保留的关键字。使用这些关键字将会导致一个编译期错误:
common partition active
asm
class union enum typedef template this
resource
goto
inline noinline public static extern external interface
long short half fixed unsigned superp
input output
hvec2 hvec3 hvec4 fvec2 fvec3 fvec4
sampler3DRect
filter
sizeof cast
namespace using
另外,所有的包含两个连贯下划线的标识符(__)都是为底层软件层保留的。定义这样一个名字,它本身不会报错,但是会导致不确定的行为,以阻止一个名字有多个不同的定义。
3.7 标识符
标识符被用作变量的名字,函数的名字,结构体的名字,字段选择器(字段选择器像结构体选择成员一样选择组件和向量,此部分将在5.5“向量和标量组件”和5.6节“矩阵组件”中讨论)。标识符有如下形式
标识符
不含数字的标识符
标识符 无数字
标识符 数字
不含数字的标识符:下列字符的其中一个
_ a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
数字:0 1 2 3 4 5 6 7 8 9 中
的一个
以"gl_"开头的标识符是为OpenGL使用的变量保留的,在着色器中是不可以被声明的,否则会产生一个编译期错误。但是,就像说明书说过的,在某些场景下,前面定义的变量可以被重新定义,并且只有出于这些特殊的目的,预定义的“gl_”名字才允许被重定义,通常来说,使用gl_做为标识符的前缀,会导致一个编译期的报错。
3.8定义
语言一些规则如下:
3.8.1 静态使用
如果一个着色器包含一个变量x的静态使用,在预处理之后,着色器会包含一个读(或写)x的句子,无论运行时的控制流是否会触发这个句子。
3.8.2 一致和不一致的控制流
当在片元着色器中触发一个句子时,控制流从
统一控制流开始;所有片元从同一个控制路径进入main()。当不同的片元通过控制流语句(选择,迭代,和跳转)走不同的路径时,控制流变为 不统一的。之后返回的控制流经过这样不一致的子语句或跳转后变为统一的,直到遇到后面的不同控制路径。
例如:
main()
{
float a = ...;// 这里是统一控制流
if (a < b) { // 这个表达式在某些片元时为true,并非所有的
....; // 不统一控制流
} else {
....; // 不统一控制流
}
....; // 再一次进入统一控制流
}
3
.83 动态统一表达式
如果所有片元经过一个表达式后得到的值是相同的,这个片元着色器的表达式是动态统一的。对于循环来说,动态统一是对于同一次循环中的表达式中的值是相同的,对于函数来说,是在同一个调用点调用。
对于其他着色器来说,基于他们处理的每个实际的数据,动态统一的定义基本相同。
常量表达式是非常动态统一的。所以基于它们的循环计数器也是动态统一的。