OpenGL着色器语言 4-4.1.3

4 变量和类型

所有的变量和函数在被使用之前都需被定义。变量和函数的名称是标识符。


没有默认的类型。所有的变量和函数声明必须有一个声明类型,还有可选的修饰符。一个变量通过指定其类型和其后用的一个或其后用逗号分隔开的名字被声明。

在很多情况下,一个变量可以再声明时使用等于号进行初始化。


用户自定义类型可以通过使用struct 将一组存在的类型集合在一起,形成一个名字,来定义。


OpenGL着色器语言是类型安全的。类型之间存在一潜在的转换规则。

确切的如何转换,何时发生转换,将会在4.1.10节“潜在类型转换”中进行描述。


4.1 基本类型

OpenGL着色器语言支持一下基本数据类型,。

透明类型




浮点型不透明类型



有符号整型不透明类型



无符号整型不透明类型



另外,一个着色器可以通过数组和结构体组合这些类型的数据以构建更复杂的类型。

没有指针类型。


4.1.1 Void

没有返回值的函数必须被声明为void类型。没有默认的函数返回类型。 void关键字不可以在其它定义中使用(除了实参列表和empty formal),否则会报一个编译错误。


4.1.2 布尔类型

为了使代码中的条件触发更容易表达,而支持布尔类型的变量。不要指望硬件可以直接支持这种类型的变量。它是真正的布尔类型,只允许有 true或false这两个值。true和false这两个关键字可以被用于字面布尔类型常量。布尔类型变量的定义和潜在的初始化如下:

bool success; // 声明“success” 为布尔类型
bool done = false; // 声明并且初始化“done”
等号右边的表达式必须是bool类型的。

用于跳转条件的表达式必须是布尔类型的(if, for, ?:,while, do-while);

4.1.3 整型

有符号和无符号整型变量是被完全支持的。在此文档中,interger的意思通常包含有符号和无符号整型。无符号整形有32位精度。有符号整型使用32位,包括二进制补码形式的一个符号位。加法,剪发,和位运算造成的溢出或下溢将不会引起任何异常,也不会达到饱和值,而是只“包装”结果中的低32位。除法和乘法造成的上溢或下溢也将不会引起任何异常,但是会得到一个未定义(undefined)的值。


定义和初始化整型的方式如下:

int i, j = 42; // 默认的整型字面类型是int
uint k = 3u; // “u”指定其类型为unit

字面整型常量可以使用十进制,八进制和十六进制表示,方法如下:

 整型常量:

十进制常量 整型后缀(可选)

八进制常量 整型后缀(可选)

十六进制常量 整型后缀(可选)

整形后缀:u U中的一个

十进制常量:

非零-数字

  十进制常量 数字

八进制常量:

0

八进制常量 八进制数字

十六进制常量

0x 十六进制-数字

0X十六进制-数字

十六进制常量 十六进制-数字

数字:

        0

非零数字

非零数字:1 2 3 4 5 6 7 8 9 中的一个

八进制数字:0 1 2 3 4 5 6 7 中的一个

十六进制数字:0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F中的一个


数字和整型常量之间不允许存在空格,包括以0和0x或0X开头的常量,或者再u或U之前都不允许存在空格。当符号化时,在下一个新符号开始之前,上面中的最大的符号将被识别。当后缀u或U出现,字面量的类型为unit,否则为int型。以减号开头的被解释为数学上的负值,不是常量的一部分。所以,字面量本身总是以非负的语法表达,尽管他们的结果可以为一个负值。

当一个整型的字面值的位图不适应32位时,将会产生一个编译期错误。字面量的位图总是不会被修改的。所以当一个有符号字面量的位图包含一组符号位时,会建立一个负值。例如:

int a = 0xffffffff; // 32 位, a得到的值为 -1
int b = 0xffffffffU; // 错误: unit类型不能转换为整型
uint c = 0xffffffff; // 32 位, c得到的值为 0xFFFFFFFF
uint d = 0xffffffffU; // 32位, d 得到的值为 0xFFFFFFFF
int e = -1; // 字面量为 “1”, 算作负值,
// 并且结果为32位有符号<span style="font-family: Arial, Helvetica, sans-serif;">无字面量</span>
// 位图0xFFFFFFFF被赋值上去, 使e的结果为-1
uint f = -1u; // 字面量是 “1u”, 然后负值被执行,
// 得到无字面量的32位无符号值
// 位图 0xFFFFFFFF 被赋值上去, 使f得到的值为<span style="font-family: Arial, Helvetica, sans-serif;">0xFFFFFFFF</span>
int g = 3000000000; // 一个32位有符号十进制字面量,
// 设置符号位, g得到的值为-1294967296
int h = 0xA0000000; // 可以, 32-bit 有符号 16进制
int i = 5000000000; // 错误: 超过了32位
int j = 0xFFFFFFFFF; //错误: 超过了32位
int k = 0x80000000; // k 得到 -2147483648 == 0x80000000
int l = 2147483648; // l 得到 -2147483648 (字面量设置符号位)

尽管所有的例子都初始化了变量,字面量被识别和赋值、类型时独立于它们的上下文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值