GPGPU基础(一):一些基本概念
1.数据类型
GLSL特性与C/C++类似,包括它的数据类型。GLSL有三种基本数据类型:float,int和bool,以及有这些数据类型组成的数组和结构体。GLSL不支持指针。同时,GLSL将向量和矩阵作为基本数据类型。向量类型包括由上述三种基本数据类型构成的二维,三维和四维向量,矩阵类型包括浮点型的2X2,3X3和4X4的方阵。如,浮点型3三维向量类型为vec3,整型四维向量类型为ivec4,而3X3的矩阵为mat3。
vec3 v; //声明三位浮点型向量v
mat4 m; //声明四维浮点型方阵m
v[1]=3.0; //给向量v的第二个元素赋值
m[2][3]=2.0; //给方阵的第三行、第四列赋值
除了用索引,还可以使用选择运算符来使用向量。选择运算符时对向量各个元素(最多4个)约定俗成的名称。用小写拉丁字母表示。表示顶点位置可以用x、y、z、w;表示颜色可以用r、g、b、a;表示纹理可以用s、t、r、g。可以任选,相同等效。如对于向量v,v[0]、v.r、v.x、v.s都指向量v的第一个元素。
vec4 v1=vec4(1.0, 2.0, 3.0, 4.0); //声明初始化四维浮点型向量v1
vec4 v2;
v2.xy=v1.yz; //将v1的第二个和第三个元素复制给v2的第一个和第二个元素
v2.z=2.0; //给v2的第三个元素赋值
v2.xy=v1.yx; //将v1的头两个元素互换,再复制给v2的头两个元素中 ???
2.限定符
GLSL由4种限定符。
const:被标记变量不可更改
attribute:全局变量,该变量对于某一顶点不可更改,但不同的顶点可以有不同取值。该变量用作从OpenGL应用程序向顶点着色器中传参数,因此该限定符只能作用于顶点着色器。
uniform:全局变量,该变量对于一个图元(primitive)不可更改。图元指的是应用程序中的一个完整几何模型,如:圆,多边形,球体;其次也可以指离散的像素实体,如一幅图。uniform对于不同图元可以取不同的值。同样由OpenGL传参。
varying:定义着色器中的变量,由顶点着色器向片段着色器中传递数据。
3.运算符和数学函数
GLSL支持标准运算符,而且这些运算符也支持向量和矩阵。
注意:矩阵乘法不支持交换律。
4.流经着色器
弱国用户不使用自定义着色器,OpenGL会使用默认的着色器,实现基本渲染功能。但用户也可以自己编写一个与最小着色器有相同功能的着色器实现默认渲染功能。但是,一旦用户自己定义了着色器,就必须保证它的完整性。比如,如果定义了着色器修改顶点的颜色,那么就还必须完成顶点的模型视图变换和投影变换。
这样的最小着色器称为流经着色器,意为数据不做任何修改下流过着色器。
流经顶点着色器
void main(){
//option1 gl_Position=gl_ProjectionMatrix*gl_ModelViewMatrix*gl_Vertex;
//option2 gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex;
//option3 gl_Position=ftransform();
}
当前顶点的坐标被保存在gl_Position中。
流经片段着色器
void main(){
gl_FragColor=gl_FrontColor;
}
以上表示保留当前模型颜色。gl_FragColor是O喷GL内建变量,表示当前片段的颜色。gl_FrontColor保存了由应用程序或顶点着色器生成的颜色。5.着色器对象
着色器程序一般都保存在单独的文本中,通过读取文本编译获得shader对象。在程序末尾或不再使用时,可以使用函数glDeleteShader()删除。
6.程序对象
在使用着色器之前,需要建立程序对象,然后将着色器附着给程序对象。
Gluint p;
p=glCreateProgram();
glAttachShader(p,v);
glAttachShader(p,f);
glLinkProgram(p);
glUseProgram(p);
使用完成后可以使用glDeleteProgram删除程序对象。
整体流程如图: