OpenGL ES过错处理
假如不正确运用OpenGL ES命令,应用程序就会产生一个过错编码,这个过错编码将被记载,能够用glGetError查询。在应用程序用glGetError查第一个过错代码之前,不会记载其它过错代码,一旦查询到过错代码,当时过错代码便复位为GL_NO_ERROR。
GLenum glGetError(void)
OpenGL ES的版本
OpenGL ES 1.X :针对固定功能流⽔水管线硬件
OpenGL ES 2.X :针对可编程流⽔水管线硬件
OpenGL ES 3.X :OpenGL ES 2.0的扩展
着色器与程序
- 需求创立2个根本目标才干用着色器进行烘托:着色器目标和程序目标
- 获取链接后着色器目标的一般进程包括6个步骤:
- 创立一个极点着色器目标和一个片段着色器目标
- 将源代码链接到每个着色器目标
- 编译着色器目标
- 创立一个程序目标
- 将编译后的着色器目标衔接到程序目标
- 链接程序目标
关于GLSL编译
在OpenGL ES中,每个program
目标有且仅有一个Vertex shader
目标和一个Fragment Shader
目标衔接到它。
- Shader:类似于C编译器
- Program:类似于C链接器
- glLInkProgram:操作产生最终的可履行程序,它包括最终能够在硬件上履行的硬件指令。
Shader和Program编程概述
- 创立Shader
- 编写
Vertex Shader
和Fragment Shader
源码 - 创立两个
shader
实例:glCreateShader
- 给
shader
实例指定源码:glShaderSource
- 编译
shader
源码:glCompileShader
- 创立Program
- 创立
program
:glCreateProgram
- 绑定
shader
到program
:glAttachShader(GLuint program, GLuint shader)
;每个program
有必要绑定一个Vertex Shader
和一个Fragment Shader
- 链接
program
:glLinkProgram(GLuint program)
- 运用
program
:glUseProgram(GLuint program)
创立与编译一个着色器相关接口
GLuint glCreateShader(GLenum type);
type - 创立着色器的类型,GL_VERTEX_SHADER或许GL_FRAGMENT_SHADER
返回值 - 是指向新着色器目标的句柄,能够调用glDeleteShader删去
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);
shader - 需求编译的着色器目标句柄
void glGetShaderiv(GLuint shader, GLenum pname, GLint *params);
shader - 需求编译的着色器目标句柄
pname - 获取的信息参数,能够为GL_COMPLLE_STATUS/GL_DELETE_STATUS/GL_INFO_LOG_LENGTH/GL_SHADER_SOURCE_LENGTH/GL_SHADER_TYPE
params - 指向查询成果的整数存储方位的指针
void glGetShaderInfoLog(GLunit Shader, GLSizei maxLength, GLSizei *length, GLChar *infoLog);
shader - 需求获取信息日志的着色器目标句柄
maxLength - 保存信息日志的缓存区巨细
length - 写入的信息日志的长度(减去null终止符),假如不需求知道长度,这个参数能够为Null
info - 指向保存信息日志的字符缓存区的指针
创立与链接程序相关接口
// 创立一个程序目标
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 glGetProgramInfoLog(GLuint program, GLSizei maxLength, GLSizei *length, GLChar *infoLog)
program - 指向需求获取信息的程序目标句柄
maxLength - 存储信息日志的缓存区巨细
length - 写入的信息日志的长度(减去null终止符),假如不需求知道长度,这个参数能够为Null
info - 指向保存信息日志的字符缓存区的指针
void glUseProgram(GLuint program)
program - 设置为活动程序的程序目标句柄
关于GLSL精度限定符解析
Satisfies the minimum requirements for the vertex language described above.Optional in the fragment language 满意上面描绘的极点言语的最低要求。在片段言语中是可选的。
Satisfies the minimum requirements above for the fragment language . Its range and precision has to be greater than or the same as provided by lowp and less than of the same as provided by highp. 满意上述片段言语的最低要求。其规模和精度有必要大于或等于lowp供给的规模和精度,小于highp供给的规模和精度。
Range and precision that can be less than mediump , but still intended to represent all color values for any color channel. 规模和精度能够小于mediump,但仍用于表明任何色彩通道的所有色彩值。
例如:
lowp float color;
varying mediump vec2 Coord;
highp mat4 m;
精度规模
Floating Point Range 浮点数规模
- highp (-2^62^, 2^62^)
- mediump (-2^14^, 2^14^)
- lowp (-2, 2)
Integer Range 整数规模
- hightp (-2^16^, 2^16^)
- mediump (-2^10^, 2^10^)
- lowp (-2^8^, 2^8^)
对于高精度和中精度,整型规模有必要能够准确地转化成相应的相同精度修饰符所表明的float型。
例如,highp int
能够被转换成highp float
,mediump int
能够被转换成mediump float
,可是lowp int
不能转换成相应的lowp float
。
字符常量和布尔型没有精度修饰符,当浮点数和整数构造器不含带有精度修饰符的参数时也不需求精度修饰符。
指定变量精度(放在数据类型之前)
highp vec4 position;
varying lowp vec4 color;
mediump float specularExp;
指定默许精度(放在Vertex和Fragment Shader源码开端处)
precision precision-qualifier type;
* precision能够用来确认默许精度修饰符
* precision-qualifier能够是lowp, mediump, 或许highp,任何其它类型和修饰符都会引起过错
假如type
是float
类型,那么该精度(precision-qualifier)将适用于所有无精度修饰符的浮点数声明(标量、向量、矩阵)
假如type
是int
类型,那么该精度(precision-qualifier)将适用于所有无精度修饰符的整数型声明(标量、向量)
包括大局变量声明,函数返回值声明,函数参数声明,和本地变量声明等。没有声明精度修饰符的变量将运用和它最近的precision句子中的精度。
precision highp float;
precision mediump int;
在Vertex Shader
中,假如没有默许的精度,则float
和int
精度都为highp
;
在Fragment Shader
中,float
没有默许的精度,所以有必要在Fragment Shader
中为float
指定一个默许精度或为每个float
变量指定精度。
预界说精度
在极点着色器中有如下预界说的大局默许精度句子:
precision highp float;
precision highp int;
precision lowp sampler2D;
precision lowp samplerCube;
在片元着色器中有如下预界说的大局默许精度句子:
precision mediump int;
precision lowp sampler2D;
precision lowp samplerCube;
片元着色器没有默许的浮点数精度修饰符。因而,对于浮点数,浮点数向量和矩阵变量声明,要么声明有必要包括一个精度修饰符,要不默许的精度修饰符在之前已经被声明过了。
矩阵数据类型
mat列x行
向量数据类型
变量存储限定符
质心插值学术文献:www.ixueshu.com/document/f2…