OpenGL着色器语言 4-4.1.3
2015-08-03 23:04
211 查看
4 变量和类型
所有的变量和函数在被使用之前都需被定义。变量和函数的名称是标识符。
没有默认的类型。所有的变量和函数声明必须有一个声明类型,还有可选的修饰符。一个变量通过指定其类型和其后用的一个或其后用逗号分隔开的名字被声明。
在很多情况下,一个变量可以再声明时使用等于号进行初始化。
用户自定义类型可以通过使用struct 将一组存在的类型集合在一起,形成一个名字,来定义。
OpenGL着色器语言是类型安全的。类型之间存在一潜在的转换规则。
确切的如何转换,何时发生转换,将会在4.1.10节“潜在类型转换”中进行描述。
4.1 基本类型
OpenGL着色器语言支持一下基本数据类型,。
透明类型
浮点型不透明类型
有符号整型不透明类型
无符号整型不透明类型
另外,一个着色器可以通过数组和结构体组合这些类型的数据以构建更复杂的类型。
没有指针类型。
4.1.1 Void
没有返回值的函数必须被声明为void类型。没有默认的函数返回类型。 void关键字不可以在其它定义中使用(除了实参列表和empty formal),否则会报一个编译错误。
4.1.2 布尔类型
为了使代码中的条件触发更容易表达,而支持布尔类型的变量。不要指望硬件可以直接支持这种类型的变量。它是真正的布尔类型,只允许有 true或false这两个值。true和false这两个关键字可以被用于字面布尔类型常量。布尔类型变量的定义和潜在的初始化如下:
用于跳转条件的表达式必须是布尔类型的(if, for, ?:,while, do-while);
4.1.3 整型
有符号和无符号整型变量是被完全支持的。在此文档中,interger的意思通常包含有符号和无符号整型。无符号整形有32位精度。有符号整型使用32位,包括二进制补码形式的一个符号位。加法,剪发,和位运算造成的溢出或下溢将不会引起任何异常,也不会达到饱和值,而是只“包装”结果中的低32位。除法和乘法造成的上溢或下溢也将不会引起任何异常,但是会得到一个未定义(undefined)的值。
定义和初始化整型的方式如下:
字面整型常量可以使用十进制,八进制和十六进制表示,方法如下:
整型常量:
十进制常量 整型后缀(可选)
八进制常量 整型后缀(可选)
十六进制常量 整型后缀(可选)
整形后缀: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位时,将会产生一个编译期错误。字面量的位图总是不会被修改的。所以当一个有符号字面量的位图包含一组符号位时,会建立一个负值。例如:
尽管所有的例子都初始化了变量,字面量被识别和赋值、类型时独立于它们的上下文。
所有的变量和函数在被使用之前都需被定义。变量和函数的名称是标识符。
没有默认的类型。所有的变量和函数声明必须有一个声明类型,还有可选的修饰符。一个变量通过指定其类型和其后用的一个或其后用逗号分隔开的名字被声明。
在很多情况下,一个变量可以再声明时使用等于号进行初始化。
用户自定义类型可以通过使用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 (字面量设置符号位)
尽管所有的例子都初始化了变量,字面量被识别和赋值、类型时独立于它们的上下文。
相关文章推荐
- Jetty 和 tomcat的比较
- tomcat配置文件server.xml详解
- Linux 开关中断系列函数探究
- Unix/linux进程及线程间同步技术总结【学习总结,请勿吐槽。。。】
- 基于Calabash-andriod的UI自动化测试(1)-环境和原理
- Linux写时拷贝技术(copy-on-write)
- myeclipse+tomcat+数据库配置
- tomcat配置外部应用
- centos 6实现ssh无密码登录的简便方法
- OpenCV第一课
- Xshell下中文乱码问题
- CentOS下使用文件构建swap
- Nginx 笔记与总结(6)Location:精准匹配
- Storm入门教程 第二章 构建Topology[转]
- 运维常用表格
- Apache DS UML
- shell脚本学习笔记之sed命令用法
- codeblocks opengl的配置
- 架构学习资源
- 嵌入式linux之块设备驱动程序概念,框架