顶点着色器、片源着色器
没有语法提示;
纯文本字符串,无法调试;
处理逻辑简单,计算重的特性;
顶点着色器
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); }
|