一、本文关注的问题:
• Shader and program 对象介绍
•创建并编译一个Shader对象
• 创建并链接一个Program对象
• 获取并设置uniforms
• 获取并设置attributes
在OpenGL ES中,每个program对象有且仅有一个Vertex Shader对象和一个Fragment Shader对象连接到它。
Shader:类似于C编译器
Program:类似于C链接器
glLinkProgram操作产生最后的可执行程序,它包含最后可以在硬件上执行的硬件指令。
二、Shader和Program编程概述
1. 创建Shader
1)编写Vertex Shader和Fragment Shader源码。
2)创建两个shader 实例:GLuint glCreateShader(GLenum type);
3)给Shader实例指定源码。 glShaderSource
4)在线编译shaer源码 void glCompileShader(GLuint shader)
2. 创建Program
1)创建program GLuint glCreateProgram(void)
2)绑定shader到program 。 void glAttachShader(GLuint program,GLuint shader)。每个program必须绑定一个Vertex Shader 和一个Fragment Shader。
3)链接program 。 void glLinkProgram(GLuint program)
4)使用porgram 。 void glUseProgram(GLuint program)
对于使用独立shader编译器编译的二进制shader代码,可使用glShaderBinary来加载到一个shader实例中。
三、Shading Language中的数据类型与变量
1. Uniforms and Attributes
Uniforms 是一个program 中统一分配的,vertext 和fragment中同名的Uniform必须同类型。对应于不经常变化的变量(用于存储只读常量值的变量)。
Attributes 变化率高的变量。主要用来定义输入的每个点属性。
Uniforms and Attributes 在shader中通过location 和 name 来对应的。
2. 数据类型
1)三类基本数据类型:float,int,boolean
2)复合类型:浮点、整型、布尔向量 vec2,vec3,vec4。vector访问方式有以下两种:
(1).操作:数学{x,y,z,w},颜色{r,g,b,a}或 纹理坐标{s,t,r,q},但不能混用,举例如下:
vec3 myVec3 = vec3(0.0,1.0,2.0); // myVec3 = {0.0,2.0}
vec3 temp;
temp = myVec3.xyz; // temp = {0.0,2.0}
temp = myVec3.xxx; // temp = {0.0,0.0,0.0}
temp = myVec3.zyx; // temp = {2.0,0.0}
(2)[ ]操作:[0]对应x,[1]对应y,[2]对应z,[3]对应w。[ ]中只能为常量或uniform变量,不能为整数量变量(如:i,j,k)。
3)矩阵:mat2,mat3,mat4 (按列顺序存储)
mat3 myMat3 = mat3(1.0,// 第一列
0.0,// 第二列
0.5,1.0); // 第三列
可用[ ]或.操作符来访问:
mat4 myMat4 = mat4(1.0);// Initialize diagonal to 1.0 (identity)
vec4 col0 = myMat4[0];// Get col0 vector out of the matrix
float m1_1 = myMat4[1][1];// Get element at [1][1] in matrix
float m2_2 = myMat4[2].z; // Get element at [2][2] in matrix
4)常量
const float zero = 0.0;
const float pi = 3.14159;
const vec4 red = vec4(1.0,1.0);
const mat4 identity = mat4(1.0);
5)结构体: 用基本类型和复合类型构建结构体。
struct fogStruct
{
vec4 color;
float start;
float end;
} fogVar;
fogVar = fogStruct(vec4(0.0,0.0),// color
0.5,// start
2.0); // end
vec4 color = fogVar.color;
float start = fogVar.start;
float end = fogVar.end;
6)数组:类似于C语言,索引从0开始。在创建时不能被初始化,索引只能为常量或uniform变量。
float floatArray[4];
vec4 vecArray[2];
7)操作
支持的操作有:*,/,+,-,++,--,=,+=,-=,*=,/=,==,!=,<,>,<=,>=,&&,^^,||
- floatmyFloat;
- vec4myVec4;
- mat4myMat4;
- myVec4=myVec4*myFloat;//MultiplieseachcomponentofmyVec4
- //byascalarmyFloat
- myVec4=myVec4*myVec4;//together(e.g.,myVec4^2)
- myVec4=myMat4*myVec4;//Doesamatrix*vectormultiplyof
- //myMat4*myVec4
- myMat4=myMat4*myMat4;//Doesamatrix*matrixmultiplyof
- //myMat4*myMat4
- myMat4=myMat4*myFloat;//Multiplieseachmatrixcomponentby
- //thescalarmyFloat
前面矩阵的行数就是结果矩阵的行数,后面矩阵的列数就是结果矩阵的列数。
8)自定义函数: