从最高层开始,处理的过程是这样的:每次你调用类似于drawArrays的函数时,WebGL会处理你之前传递给它的数据,这些数据都是以属性(Attribute)(比如用到的顶点位置数组)和Uniform变量(用来储存模型视图矩阵和投影矩阵)的形式存在的,然后WebGL会把这些数据传递给顶点着色器。
每次当相应顶点的属性建立完成后,都会调用一次顶点着色器;而Uniform变量,就像它的名字一样,在调用过程中并不发生任何改变,顶点着色器只是需要这些数据——这些数据代表着模型视图矩阵和投影矩阵,使得顶点可以被放置到透视中并且调整到当前的模型视图状态下——然后顶点着色器把处理的结果储存在称为“Varying变量”(Varying Variable)的变量中。顶点着色器通常会输出一系列的Varying变量,其中有个特别的也是必须的变量,那就是gl_Position,它储存着经过顶点着色器处理过的顶点坐标。
在顶点着色器处理完成之后,WebGL将会神奇般的将这些Varying变量中描述的3D图形转换为2D图片,然后为图片中的每个像素调用片元着色器(这就是为什么在有些3D图形系统中你会听到他们把片元着色器称为“像素着色器”的原因了)。当然,确切的说是为那些非顶点位置的像素调用片元着色器,而在那些顶点位置上的像素则已经建立好了顶点。这个过程“填充”了各顶点间限定的空间,从而显示出一个可见的形状。片元着色器的作用是返回每个内插点的颜色,并储存在称为gl_FragColor的Varying变量中。
当片元处理器工作完毕后,WebGL会再处理一下它输出的结果,然后放到Frame Buffer(帧缓冲)中,也就是最终显示在屏幕上的东西。
变量初始化。可以由简单类型初始化复杂类型。
可以通过常量下标访问矩阵,变量数组,向量中的分量。
操作与C语言类似。
函数。传参指定in out 或者inout。
if else 流控制。
for循环。只支持常数循环次数。
无论下标,还是循环变量,都只能使用编译时可确定的常数。
生成的fragment是具有(x,y,z)坐标的,其中x,y是在窗口中显示的位置。Z是深度坐标。Blending是指当Fragment要显示在窗口中时,如果使能了blend,那么当前fragment的颜色要经过指定的blend方法去与屏幕中已经存在于(x,y)坐标上的颜色进行混合。
基本的混合模式是Cfinal = (fsource *Csource )op (fdestingation*Cdestination) Csource 和Cdestination是源和目的颜色,fsource和fdestination是源和目的的系数。也就是最终的颜色将是源和目的的颜色乘以各自的系数然后OP操作进行混合。
void glBlendFunc(GLenum sfactor, GLenum dfactor);指定对于源和目的都采用什么系数模式。
void glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
对于源和目的采用分开的系数模式。即alpha部分与RGB部分独立指定。
void glBlendEquation(GLenum mode); 指定OP操作。
void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);对于RGB部分和Alpha部分分开指定OP操作。