Program和Shader对象
Program相当于当前渲染管线所使用的程序,是Shader得容器,可以挂载多个Shader.
Shader相当于一个C模块,首先需要对Shader脚本进行编译,然后将编译好的Shader挂载到Program上,在OpenGL的渲染中使用Program来使Shader生效。
Vertex Shader负责将顶点数据进一步处理 ,Fragment Shader将像素数据进一步处理。所以Vertex Shader中的代码针对每个点都会调用一次,Fragment Shader中的代码针对每个像素都会调用一次。
创建Shader的流程如下:
1、调用glCreateShader()创建一个Shader对象;
2、调用glShaderSource()创建加载Shader脚本源码;
3、调用glCompileShader()编译Shader脚本;
创建Program的流程如下:
1、调用glCreateProgram()创建一个Program对象;
2、调用glAttachShader()将创建好的Shader进行挂载;
3、调用glLinkProgram()执行链接操作;
4、最后在需要使用Shader时,调用glUseProgram()应用当前Shader;
着色(Shader)语言:
着色语言是一种类C的编程语言,但不支持double,byte,short,long,并且取消了C中的union,enum,unsigned以及位运算等特性。着色语言中有许多内建的原生数据类型以及构建数据类型,如:浮点型(float)、布尔型(bool)、整型(int)、矩阵型(matrix)以及向量型(vec2、vec3等)等。总体来说,这些数据类型可以分为标量、向量、矩阵、采样器、结构体以及数组等。
支持的数据类型如下:
float bool int 基本数据类型
Vec2 包含了2个浮点数的向量
Vec3 包含了3个浮点数的向量
Vec4 包含了4个浮点数的向量
Ivec2 包含了2个整数的向量
ivec3 包含了3个整数的向量
ivec4 包含了4个整数的向量
bvec2 包含了2个布尔数的向量
bvec3 包含了3个布尔数的向量
bvec4 包含了4个布尔数的向量
mat2 2*2维矩阵
mat3 3*3维矩阵
mat4 4*4维矩阵
sampler1D 1D纹理采样器
sampler2D 2D纹理采样器
sampler3D 3D纹理采样器
Vertex Shader的语法
变量类型 + 变量数据类型 + 变量名
变量类型有三种:
1、attribute: 就是顶点数据(Vertex Data)包含的属性,位置,颜色或其他,顶点数据包含多少属性,这里就可以写多少,通过glEnableVertexAttribArray和glVertexAttribPointer激活和传值。
2、varying: 传递给Fragment Shader的变量,Fragment Shader是无法直接接受顶点数据的,因为它处理的是像素级别的数据。传递给Fragment Shader的值是根据像素位置差值计算之后的值。
3、uniform: 可以理解为全局变量,所有顶点处理程序共享这个变量。
变量数据类型有(见上面数据类型介绍)
顶点着色器介绍
1.1 顶点着色器示例代码
uniform mat4 uMVPMatrix; //应用程序传入顶点着色器的总变换矩阵
Attribute vec4 aPosition; //应用程序传入顶点着色器的顶点位置
Attribute vec2 aTextureCoord;//应用程序传入顶点着色器的顶点纹理坐标
Attribute vec4 aColor; //应用程序传入顶点着色器的顶点颜色变量
varying vec4 vColor; //用于传递给片元着色器的顶点颜色数据
Varying vec2 vTextureCoord; //用于传递给片元着色器的顶点纹理数据
void main()
{
gl_Position = uMVPMatrix * aPosition; //根据总变换矩阵计算此次绘制此顶点位置
vColor = aColor; //将顶点颜色数据传入片元着色