OpenGL着色器基本语法收集整理

一、简介

OpenGL着色语言(OpenGL Shading Language)又叫GLSL,是用来在OpenGL中着色编程的语言,是一种面向过程的语言,基本的语法和C/C++基本相同,他们是在图形卡的GPU (Graphic Processor Unit图形处理单元)上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。比如:视图转换、投影转换等。GLSL(GL Shading Language)的着色器代码分成2个部分:Vertex Shader(顶点着色器)和Fragment(片断着色器)。

二、基本数据类型

数据类型主要分为标量、向量、矩阵、采样器、结构体、数组、空类型七种类型:

1.标量:

标量表示的是只有大小没有方向的量,在GLSL中标量只有bool、int和float三种。对于int,和Java一样,可以写为十进制(16)、八进制(020)或者十六进制(0x10)。对于标量的运算,我们最需要注意的是精度,防止溢出问题。

2. 向量:

向量我们可以看做是数组,在GLSL通常用于储存颜色、坐标等数据,针对维数,可分为二维、三维和四位向量。针对存储的标量类型,可以分为bool、int和float。共有vec2、vec3、vec4,ivec2、ivec3、ivec4、bvec2、bvec3和bvec4九种类型,数组代表维数、i表示int类型、b表示bool类型。需要注意的是,GLSL中的向量表示竖向量,所以与矩阵相乘进行变换时,矩阵在前,向量在后(与DirectX正好相反)。向量在GPU中由硬件支持运算,比CPU快的多。

作为颜色向量时,用rgba表示分量,就如同取数组的中具体数据的索引值。三维颜色向量就用rgb表示分量。比如对于颜色向量vec4 color,color[0]和color.r都表示color向量的第一个值,也就是红色的分量。其他相同。

作为位置向量时,用xyzw表示分量,xyz分别表示xyz坐标,w表示向量的模。三维坐标向量为xyz表示分量,二维向量为xy表示分量。

作为纹理向量时,用stpq表示分量,三维用stp表示分量,二维用st表示分量。

3. 矩阵:

在GLSL中矩阵拥有22、33、4*4三种类型的矩阵,分别用mat2、mat3、mat4表示。我们可以把矩阵看做是一个二维数组,也可以用二维数组下表的方式取里面具体位置的值。

4.采样器:

采样器是专门用来对纹理进行采样工作的,一个采样器变量表示一副或者一套纹理贴图。所谓的纹理贴图可以理解为我们看到的物体上的皮肤。

5.结构体:

和C语言中的结构体相同,用struct来定义结构体,关于结构体参考C语言中的结构体。

6.数组:

数组知识也和Java中类似。

7.空类型:

空类型用void表示,仅用来声明不返回任何值得函数。

三、运算符

运算符有(越靠前,运算优先级越高):

1.索引:[]

2.前缀自加和自减:++,–

3.一元非和逻辑非:~,!

4.加法和减法:+,-

5.等于和不等于:==,!=

6.逻辑异或:^^

7.三元运算符号,选择:?:

8.成员选择与混合:.

9.后缀自加和自减:++,–

10.乘法和除法:*,/

11.关系运算符:>,<,=,>=,<=,<>

12.逻辑与:&&

13.逻辑或:||

14.赋值预算:=,+=,-=,*=,/=

四、类型转化

比如float a=1;就是一种错误的写法,必须严格的写成float a=1.0,也不可以强制转换,即float a=(float)1;也是错误的写法,但是可以用内置函数来进行转换,如float a=float(1);还有float a=float(true);(true为1.0,false为0.0)等,值得注意的是,低精度的int不能转换为低精度的float。

五、限定符

GLSL中的限定符号主要有:

attribute:一般用于各个顶点各不相同的量。如顶点颜色、坐标等。

uniform:一般用于对于3D物体中所有顶点都相同的量。比如光源位置,统一变换矩阵等。

varying:表示易变量,一般用于顶点着色器传递到片元着色器的量。

const:常量。

限定符与java限定符类似,放在变量类型之前,并且只能用于全局变量。在GLSL中,没有默认限定符一说。

五、流程控制

GLSL中的流程控制与Jave中基本相同,主要有:

if(){}、if(){}else{}、if(){}else if(){}else{}

while(){}和do{}while()

for(;;){}

break和continue

你可能感兴趣的:(OpenGL着色器基本语法收集整理)