【笔记】《WebGL编程指南》学习-第6章着色器语言(1-基础)

来源:互联网 发布:mac 印象笔记插件下载 编辑:程序博客网 时间:2024/05/22 01:54

基础

就像很多其他语言一样,使用 GLSL ES 编写着色器程序时,应该注意以下两点:

  • 程序是大小写敏感的。
  • 每一个语句都应该以一个英文分号结束。

执行次序

对JS而言,一旦脚本加载完成,就从第1行逐行执行解释了。但是着色器程序和C语言更接近,它从 main()函数开始执行的。着色器程序必须有且仅有一个 main()函数,而且该函数不能接受任何参数。

main()函数前的 void 关键字表示这个函数不返回任何值。在JS中,不管一个函数会不会有返回值,你都是直接用 function 关键字来定义它。而在 GLSL ES 中,如果一个函数没有返回值,就必须在定义函数时明确得指定返回值的类型,如果函数没有返回值,也需要用viod 来明确表示这个函数没有返回值。


注释

在着色器程序中,你可以添加注释,而且注释的格式和JS中的注释格式是相同的,所以,GLSL ES 支持以下两种形式的注释。

  • 单行注释:// 后直到换行处的所有字符为注释。
  • 多行注释:/* 和 */ 之间的所有字符为注释。

数据值类型(数值和布尔值)

GLSL 支持两种数据值类型。

  • **数值类型:**GLSL ES 支持整型数(比如0、1、2)和浮点数(比如3.14、29.98、0.23571)。没有小数点的值被认为是整型数,而有小数点的值则认为是浮点数。
  • **布尔值类型:**GLSL ES 支持布尔值类型,包括true 和 false 两个布尔常量。

GLSL ES 不支持字符串类型,虽然字符串对三维图形语言来说还是有一定意义的。


变量

前面已经说过,你可以使用任何变量名,只要该变量名符合:

  • 只包括 a-z,A-Z,0-9和下划线。
  • 变量名的首字母不能使数字
  • 不能是下表中所列出的关键字,也不能是下下表中的保留字。但是,你的变量名的一部分可以使它们。比如,变量名 if 是不合法的,但是变量名 iffy 却可以使用。
  • 不能以 gl_、webgl_或webgl 开头,这些前缀已经被 OpenGL ES 保留了。

这里写图片描述

这里写图片描述


GLSL ES 是强类型语言

GLSL ES 不像 JS,使用 var 关键字来声明所有变量。GLSL ES 要求你具体地指明变量的数据类型,我们在示例程序中用了这种方式声明变量:

<类型> <变量名>
如 vec4 a_Position。

我们知道,在定义如 main()函数这类函数的时候,必须指定函数的返回值。同样,在进行赋值操作(=)的时候,等号左右两侧的数据类型也必须一样,否则就会出错。

因此,GLSL ES被成为强类型语言,你必须时刻注意变量的类型。


基本类型

GLSL ES 支持的基本类型如下表所示。

这里写图片描述

为变量指定类型有利于 WebGL 系统检查代码错误,提高程序的运行效率。下面是一些声明基本类型变量的例子:

这里写图片描述

赋值和类型转换

使用等号可以将值赋给变量。我们说过,GLSL ES是强类型语言,所以如果等号左侧的变量类型与等号右侧的值类型不一致,就会出错。

这里写图片描述

在语义上,8和8.0其实是一个数值。但是,当你将8赋值给浮点型变量 f1 时,确实会出错。而且,你将会看到如下的错误信息:

这里写图片描述

要将一个整型数值赋值给浮点型变量,需要将整型数转换成浮点数,这个过程成为 类型转换。比如,我们可以使用内置的函数 float()来将整型数转换为浮点数,如下所示:

int i = 8;float f1 = float(i); //将8转换为8.0并赋值给f1float f2 = float(8); //同上

GLSL ES 支持以下几种用于类型转换的内置函数,如下表所示:

这里写图片描述

运算符

GLSL ES 支持的原酸类型与JS类似,如下表所示:

这里写图片描述
这里写图片描述

阅读全文
0 0
原创粉丝点击