opengl es 第二课(无情的glsl语法提示)

顶点着色器、片源着色器

没有语法提示;
纯文本字符串,无法调试;
处理逻辑简单,计算重的特性;

顶点着色器
attributes(属性通道)
顶点数据、投影矩阵、模型矩阵
纹理坐标(映射关系)
uniform(统一批次,只设置一次的)
变换矩阵、
texture(一般不这么传递)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 接收 vec4 类型的值(如顶点坐标)
attribute vec4 position;

// 接收 vec2 类型的值(如纹理坐标)
attribute vec2 textCoordinate;

// 关联片源着色器里的属性(必须与片源着色器定义的一模一样)
varying lowp vec2 varyTextCoord;

void main()
{
// 往片源着色器传递
varyTextCoord = textCoordinate;

// 返回顶点数据
gl_Position = position;
}

片源着色器
varying 来自vsh顶点着色器
uniform *
*texture 纹理数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 声明float为高精度
precision highp float;
// 接受顶点着色器的传递的值(必须与顶点着色器定义的一模一样)
varying lowp vec2 varyTextCoord;
// 接收简单的2D纹理
uniform sampler2D colorMap;

void main()
{
//lowp vec4 temp = texture2D(colorMap, varyTextCoord);
//gl_FragColor = temp;

// 获取纹理颜色数据(根据纹理、纹理坐标)
gl_FragColor = texture2D(colorMap, varyTextCoord);

}

编译加载shader文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// 加载 shader 文件
-(GLuint)loadShaders:(NSString *)vert Withfrag:(NSString *)frag
{
//1.定义2个零时着色器对象
GLuint verShader, fragShader;
//创建program
GLint program = glCreateProgram();

//2.编译顶点着色程序、片元着色器程序
//参数1:编译完存储的底层地址
//参数2:编译的类型,GL_VERTEX_SHADER(顶点)、GL_FRAGMENT_SHADER(片元)
//参数3:文件路径
[self compileShader:&verShader type:GL_VERTEX_SHADER file:vert];
[self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:frag];

//3.创建最终的程序
glAttachShader(program, verShader);
glAttachShader(program, fragShader);

//4.释放不需要的shader
glDeleteShader(verShader);
glDeleteShader(fragShader);

return program;
}

// 编译 shader
- (void)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file{

//1.读取文件路径字符串
NSString* content = [NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil];
const GLchar* source = (GLchar *)[content UTF8String];

//2.创建一个shader(根据type类型)
*shader = glCreateShader(type);

//3.将着色器源码附加到着色器对象上。
//参数1:shader,要编译的着色器对象 *shader
//参数2:numOfStrings,传递的源码字符串数量 1个
//参数3:strings,着色器程序的源码(真正的着色器程序源码)
//参数4:lenOfStrings,长度,具有每个字符串长度的数组,或NULL,这意味着字符串是NULL终止的
glShaderSource(*shader, 1, &source,NULL);

//4.把着色器源代码编译成目标代码
glCompileShader(*shader);

}