流程控制
OpenGL ES 着色语言提供了3种流程控制的方式,分别是if-else、while(do-while)循环、与for循环。这些控制语句的语法基本与Java一样,所以接受起来很简单。
1. if-else语句
if语句的基本语法是:
int tempx = 1;
if (tempx == 0) {
//执行处理逻辑
}
2. while(do-while)循环
while循环的基本语法是:
int tempx = 1;
while (tempx > 0) {
//执行处理逻辑
}
do-while循环的基本语法是:
int tempx = 1;
do {
//执行处理逻辑
} while(tempx > 0);
3. for循环
for (int i = 0; i < 13; i++) {
//执行处理逻辑
}
4. break和continue
与Java形同,break控制循环中断,continue控制进入下一次循环。
函数的声明与使用
函数的语法为:
<返回类型> 函数名称 ([<参数序列>]){
/*函数体*/
}
内建变量
着色器代码的开发中会用到很多变量,其中大部分可能是由开发人员根据需求自定义的,但着色器中也提供了一些用来满足特定需求的内建变量。这些内建变量不需要声明就可以使用,一般用来实现渲染管线固定功能部分与自定义顶点或片元着色器之间的信息交互。
1. 顶点着色器中的内建变量
顶点着色器中的内建变量主要是输出变量,包括gl_Position、gl_PointSize等。在顶点着色器中应该根据需要给这些内建变量赋值,以便由渲染管线中的图元装配与光栅化等后续固定功能阶段进行进一步的操作。
gl_Position:顶点着色器从应用程序中获得原始的顶点位置的数据,这些原始的顶点数据在顶点着色器中经过平移、旋转、缩放等数学变换后,生成新的顶点位置。
gl_PointSize:顶点着色器中可以计算一个点的大小(单位为像素),并将其赋值给gl_PointSize(标量,float类型)以传递给渲染管线,如果没有明确赋值的话,就是采用默认值1,gl_PointSize的值一般只有在采用了点绘制方式之后才有意义。
2. 片元着色器中的内建变量
片元着色器中的内疚按输入变量主要有gl_FragCoord以及gl_FrontFacing,这两个内建变量都是只读的,由渲染管线中片元着色器之前的阶段生成。其具体含义如下:
gl_FragCoord:vec4类型,其中含有当前片元相对于窗口位置的坐标值X,Y,Z。如下图所示:
gl_FrontFacing:布尔型内建变量,通过读取内建变量的值可以判断正在处理的片元是否属于在光栅化阶段生成此片元的对应图元的正面。如果属于正面,那么该值为true,否则为false。