OpenGL shader
EGL (Embedded Graphics Library )
- OpenGL ES 命令需要渲染上下文和绘制表面才能完成图形图像的绘制. 渲染上下文: 存储相关OpenGL ES 状态.
- 绘制表面: 是⽤于绘制图元的表面,它指定渲染所需要的缓存区类型,例例如颜⾊缓存 区,深度缓冲区和模板缓存区.
- OpenGL ES API 并没有提供如何创建渲染上下文或者上下文如何连接到原⽣窗⼝系统. EGL 是Khronos 渲染API(如OpenGL ES) 和原生窗⼝系统之间的接口. 唯⼀⽀持 OpenGL ES 却不支持EGL的平台是iOS
EGL的主要功能如下:
- 和本地窗⼝系统(native windowing system)通讯;
- 查询可⽤的配置;
- 创建OpenGL ES可用的“绘图表面”(drawing surface);
- 同步不同类别的API之间的渲染,⽐如在OpenGL ES和OpenVG之间同步,或者在OpenGL和本地窗⼝口的绘图命令之间;
- 管理“渲染资源”,⽐如纹理映射(rendering map)。
GLSL语法基本
向量数据类型
向量数据类型.png矩阵数据类型 mat列x行
矩阵数据类型变量存储限定符
变量存储限定符
三种数据修饰类型
-
uniform
:从代码中传递到顶点和片元着色器 变量。
如果需要吧uniform
传递到客户端再传递到顶点/片元着色器,就需要在顶点/片元着色器中进行一样的声明。
一般传递各种矩阵:视图矩阵、投影矩阵、投影矩阵等不常变化的量。
可以使用glUniform***
创建
uniform mat4 viewProMatrix;
-
attribute
:特点:只能从客户端传递给顶点着色器,只能在顶点着色器中使用。
一般修饰顶点坐标、纹理坐标、颜色、法线等坐标相关的。
可以使用glVertex**
创建。
attribute vec4 position;
attribute vec4 color;
attribute vec4 texCoord;
-
varying
:纹理坐标和顶点着色器没有关系,attribute没办直接传递到片元着色器,可以通过varying修饰符间接传递过去。
varying lowp vec2 varyTextCoord
着⾊器与程序
- 需要创建2个基本对象才能用着⾊器进⾏渲染: 着⾊器对象和程序对象.
- 获取链接后着⾊器对象的⼀般过程包括6个步骤:
- 创建⼀个顶点着⾊器对象和⼀个⽚段着⾊器对象
- 将源代码链接到每个着⾊器对象
- 编译着⾊器对象
- 创建⼀个程序对象
- 将编译后的着⾊器对象连接到程序对象
- 链接程序对象
着色器创建
创建和编译:
GLuint glCreateShader(GLenum type);
type创建着色器的类型:GL_VERTEX_SHADER 或者
GL_FRAGMENT_SHADER
返回值是一个着色器句柄
void glDeleteShader(GLuint shader);
shader — 删除着色器对象句柄
void glShaderSource(GLuint shader , GLSizei count ,const GLChar * const *string, const GLint *length);
shader — 指向着色器的句柄
count — 着色器源字符串数量,着色器可以由多个源字符串组成 但只有一个main函数.
string — 指向保存数量的count的着色器源字符串的数组指针。
length — 指向保存每个着色器字符串大小且元素数量为count的整数数组指针。
void glCompileShader(GLuint shader);
void glGetShaderiv(GLuint shader , GLenum pname , GLint *params );
pname获取的参数信息,可以为: GL_COMPILE_STATUS/GL_DELETE_STATUS/GL_INF O_LOG_LENGTH/GL_SHADER_SOURCE_LENGTH/ GL_SHADER_TYPE
params — 指向查询结果的整数存储位置的指针
void glGetShaderInfolog(GLuint shader , GLSizei maxLength, GLSizei *length , GLChar *infoLog);
shader — 需要获取信息⽇志的着⾊器对象句柄
maxLength— 保存信息⽇志的缓存区⼤小
length — 写⼊入的信息日志的⻓度(减去null 终⽌止符); 如果不需要知道⻓度. 这个参数可以为Null infoLog — 指向保存信息⽇志的字符缓存区的指针.
创建与连接程序:
GLUint glCreateProgram( )
创建一个程序对象
返回值: 返回一个执⾏新程序对象的句柄
void glDeleteProgram( GLuint program )
program : 指向需要删除的程序对象句句柄
//着⾊器与程序连接/附着
void glAttachShader( GLuint program , GLuint shader );
program : 指向程序对象的句柄
shader : 指向程序连接的着⾊器对象的句柄
//断开连接
void glDetachShader(GLuint program);
program : 指向程序对象的句柄
shader : 指向程序断开连接的着⾊器对象句柄
glLinkProgram(GLuint program)
program: 指向程序对象句柄
链接程序之后, 需要检查链接是否成功. 你可以使用
glGetProgramiv
检查链接状态:
void glGetProgramiv (GLuint program,GLenum pname, GLint *params);
program: 需要获取信息的程序对象句柄 pname : 获取信息的参数,可以是:
GL_ACTIVE_ATTRIBUTES GL_ACTIVE_ATTRIBUTES_MAX_LENGTH GL_ACTIVE_UNIFORM_BLOCK GL_ACTIVE_UNIFORM_BLOCK_MAX_LENGTH GL_ACTIVE_UNIFROMS GL_ACTIVE_UNIFORM_MAX_LENGTH GL_ATTACHED_SHADERS GL_DELETE_STATUS
GL_INFO_LOG_LENGTH
GL_LINK_STATUS GL_PROGRAM_BINARY_RETRIEVABLE_HINT GL_TRANSFORM_FEEDBACK_BUFFER_MODE GL_TRANSFORM_FEEDBACK_VARYINGS GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH GL_VALIDATE_STATUS
params : 指向查询结果整数存储位置的指
从程序信息⽇志中获取信息
void glGetPorgramInfoLog( GLuint program ,GLSizei maxLength, GLSizei *length , GLChar *infoLog )
program : 指向需要获取信息的程序对象句柄
maxLength : 存储信息⽇志的缓存区⼤小
length : 写⼊的信息⽇志⻓度(减去null 终⽌止符),如果不需要知道⻓度,这个参数可以为Null. infoLog : 指向存储信息⽇志的字符缓存区的指针
void glUseProgram(GLuint program)
program: 设置为活动程序的程序对象句柄
流程总结:
- 创建⼀一个顶点着⾊色器器对象和⼀一个⽚片段着⾊色器器对象
- 将源代码链接到每个着⾊色器器对象
- 编译着⾊色器器对象
- 创建⼀一个程序对象
- 将编译后的着⾊色器器对象连接到程序对象
- 链接程序对象
顶点着⾊器输入:
- 着⾊器程序—描述顶点上执行操作的顶点着⾊器程序源代码/可执⾏行文件
- 顶点着⾊器输⼊入(属性) — ⽤顶点数组提供每个顶点的数据
- 统一变量(uniform)—顶点/⽚元着⾊器使⽤的不变数据
- 采样器—代表顶点着⾊器使⽤纹理的特殊统⼀一变量量类型
输出:gl_Position
gl_PointSize
顶点着⾊色器器 业务:
- 矩阵变换位置
- 计算光照公式⽣生成逐顶点颜⾊色
- ⽣生成/变换纹理理坐标
执⾏自定义计算,实施新的变换,照明或者传统的固定功能所不允许 的基于顶点的效果.
待续…