OpenGL ES 的版本
OpenGL ES 1.X :针对固定功能流⽔水管线硬件
OpenGL ES 2.X :针对可编程流⽔水管线硬件
OpenGL ES 3.X :OpenGL ES 2.0的扩展
EGL (Embedded Graphics Library )
1.OpenGL ES 命令需要渲染上下文和绘制表面才能完成图形图像的绘制
2.渲染上下文: 存储相关OpenGL ES 状态
3.绘制表面: 是用于绘制图元的表面,它指定渲染所需要的缓存区类型,例如颜色缓存 区,深度缓冲区和模板缓存区.
4.OpenGL ES API 并没有提供如何创建渲染上下文或者上下文如何连接到原生窗口系 统. EGL 是Khronos 渲染API(如OpenGL ES) 和原生窗口系统之间的接口. 唯一⽀持 OpenGL ES 却不⽀持EGL 的平台是iOS
EGL的主要功能如下
- 和本地窗口系统(native windowing system)通讯
2.查询可用的配置
3.创建OpenGL ES可用的“绘图表面”(drawing surface)
4.同步不同类别的API之间的渲染,比如在OpenGL ES和OpenVG之间同步,或者在OpenGL和本地窗口的绘图命令之间;
5.管理“渲染资源”,⽐如纹理映射(rendering map)。
GLSL数据类型
基本数据类型
类型 | 描述 |
---|---|
整数 | 分为有符号(int)和无符号整数(uint) |
浮点型 | 一般都是使用单精度浮点型(float) |
布尔值 | bool |
bool bDone = false;//布尔值,真(true)或者假(false)
int iValue = 42;
uint uiValue = 32;
float fValue = 42.f;
向量数据类型
类型 | 描述 |
---|---|
vec2,vec3,vec4 | 2分量、3分量、4分量浮点向量 |
ivec2,ivec3,ivec4 | 2分量、3分量、4分量整型向量 |
uvec2,uvec3,uvec4 | 2分量、3分量、4分量无符号整型向量 |
bvec2,bvec3,bvec4 | 2分量、3分量、4分量bool型向量 |
1.向量类型可以像基本数据类型一样进行声明,
vec4 vVertexPos = vec4(39.f,10.f,20.f,1);
2.着色器语言的向量不是类,他们有自己的内建数据类型,向量可以被赋值给另一个向量,也可以相加,也可以用一个标量进行缩放
c += vec4(1.f,2.f,3.f,1.f);
vVertexPos = vVertexPos3;
vVertexPos *= 4.f;
3.OpenGL着色语言对一个向量的独立元素进行寻址的方式,我们用点号来确定多达4个向量元素的地址,可以使用下列3组标识符中的任意一组:xyzw,rgba,stpq,
vVertexPos.x = 3.f;
vVertexPos.xy = vec2(1.f,2.f);
vVertexPos.xyz = vNewPos.xyx;
vOupColor.r = 0.4f;
矩阵数据类型
类型 | 描述 |
---|---|
mat2,mat2x2 | 两⾏两列 |
mat3,mat3x3 | 三⾏三列 |
mat4,mat4x4 | 四⾏四列 |
mat2x3 | 三行两列 |
mat2x4 | 四⾏两列 |
mat3x2 | 两⾏三列 |
mat3x4 | 四⾏三列 |
mat4x2 | 两⾏四列 |
mat4x3 | 三⾏四列 |
mMat4Mode[2] = vec4(1.f,2.f,3.f,4.f);
vec4 vecModel = mMat4Mode[3];
vec3 vec3Mode = mMat4Mode[2].xyz;
mat4 mat4Mode = mat4(
1.f,2.f,3.f,4.f,
1.f,2.f,3.f,4.f,
1.f,2.f,3.f,4.f,
1.f,2.f,3.f,4.f,
);
变量存储限定符号
着色器语言变量声明也可以指定一个存储限定符,限定符用于将变量标记为输入变量(in或者uniform),输出变量(out)或者常量(const)
限定符 | 描述 |
---|---|
<none> | 只是普通的本地变量,外部不见,外部不可访问 |
const | ⼀个编译常量,或者说是一个对函数来说为只读的参数 |
in/varying | 从以前阶段传递过来的变量 |
in/varying centroid | ⼀个从以前的阶段传递过来的变量,使用质心插值 |
out/attribute | 传递到下一个处理阶段或者在一个函数中指定一个返回值 |
out/attribute centroid | 传递到下⼀个处理阶段,质心插值 |
uniform | ⼀个从客户端代码传递过来的变量,在顶点之间不做改变 |

自定义着色器过程
编写着色器
//顶点着色器
attribute vec4 position;
attribute vec2 textCoordinate;
varying lowp vec2 varyTextCoord;
void main()
{
varyTextCoord = vec2(1.0-textCoordinate.x,1.0-textCoordinate.y);
gl_Position = position;
}
//片元着色器
precision highp float;
varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
void main()
{
gl_FragColor = texture2D(colorMap, varyTextCoord);
}
编译连接着色器
//创建程序
GLint program = glCreateProgram();
//读取文件路径字符串
NSString* content = [NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil];
const GLchar* source = (GLchar *)[content UTF8String];
//创建一个shader(根据type类型)
//GL_VERTEX_SHADER顶点着色器
//GL_FRAGMENT_SHADER片元着色器
*shader = glCreateShader(type);
//将着色器源码附加到着色器对象上。
//参数1:shader,要编译的着色器对象 *shader
//参数2:numOfStrings,传递的源码字符串数量 1个
//参数3:strings,着色器程序的源码(真正的着色器程序源码)
//参数4:lenOfStrings,长度,具有每个字符串长度的数组,或NULL,这意味着字符串是NULL终止的
glShaderSource(*shader, 1, &source,NULL);
//把着色器源代码编译成目标代码
glCompileShader(*shader);
//创建最终的程序
glAttachShader(program, verShader);
glAttachShader(program, fragShader);
//释放不需要的shader
glDeleteShader(verShader);
glDeleteShader(fragShader);
//链接着色器
glLinkProgram(self.myPrograme);
GLint linkStatus;
//获取链接状态
glGetProgramiv(self.myPrograme, GL_LINK_STATUS, &linkStatus);
if (linkStatus == GL_FALSE) {
GLchar message[512];
glGetProgramInfoLog(self.myPrograme, sizeof(message), 0, &message[0]);
NSString *messageString = [NSString stringWithUTF8String:message];
NSLog(@"Program Link Error:%@",messageString);
return;
}
使用program
//使用program
glUseProgram(self.myPrograme);
设置attribute值
//获取Attrib位置
GLuint position = glGetAttribLocation(self.myPrograme, "position");
//(2).设置合适的格式从buffer里面读取数据
glEnableVertexAttribArray(position);
//(3).设置读取方式
//参数1:index,顶点数据的索引
//参数2:size,每个顶点属性的组件数量,1,2,3,或者4.默认初始值是4.
//参数3:type,数据中的每个组件的类型,常用的有GL_FLOAT,GL_BYTE,GL_SHORT。默认初始值为GL_FLOAT
//参数4:normalized,固定点数据值是否应该归一化,或者直接转换为固定值。(GL_FALSE)
//参数5:stride,连续顶点属性之间的偏移量,默认为0;
//参数6:指定一个指针,指向数组中的第一个顶点属性的第一个组件。默认为0
glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, NULL);
设置uniform值
//获取Uniform位置
GLuint location = glGetUniformLocation(self.myPrograme, "colorMap");
//设置纹理采样器 sampler2D
glUniform1i(location ,0);
网友评论