OpenGL ES过错处理

假如不正确运用OpenGL ES命令,应用程序就会产生一个过错编码,这个过错编码将被记载,能够用glGetError查询。在应用程序用glGetError查第一个过错代码之前,不会记载其它过错代码,一旦查询到过错代码,当时过错代码便复位为GL_NO_ERROR。 GLenum glGetError(void)

GLSL初探

OpenGL ES的版本

OpenGL ES 1.X :针对固定功能流⽔水管线硬件

OpenGL ES 2.X :针对可编程流⽔水管线硬件

OpenGL ES 3.X :OpenGL ES 2.0的扩展

着色器与程序

  • 需求创立2个根本目标才干用着色器进行烘托:着色器目标和程序目标
  • 获取链接后着色器目标的一般进程包括6个步骤:
  1. 创立一个极点着色器目标和一个片段着色器目标
  2. 将源代码链接到每个着色器目标
  3. 编译着色器目标
  4. 创立一个程序目标
  5. 将编译后的着色器目标衔接到程序目标
  6. 链接程序目标

关于GLSL编译

在OpenGL ES中,每个program目标有且仅有一个Vertex shader目标和一个Fragment Shader目标衔接到它。

  • Shader:类似于C编译器
  • Program:类似于C链接器
  • glLInkProgram:操作产生最终的可履行程序,它包括最终能够在硬件上履行的硬件指令。

Shader和Program编程概述

  1. 创立Shader
  • 编写Vertex ShaderFragment Shader源码
  • 创立两个shader实例:glCreateShader
  • shader实例指定源码:glShaderSource
  • 编译shader源码:glCompileShader
  1. 创立Program
  • 创立programglCreateProgram
  • 绑定shaderprogramglAttachShader(GLuint program, GLuint shader);每个program有必要绑定一个Vertex Shader和一个Fragment Shader
  • 链接programglLinkProgram(GLuint program)
  • 运用programglUseProgram(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精度限定符解析

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 floatmediump 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,任何其它类型和修饰符都会引起过错

假如typefloat类型,那么该精度(precision-qualifier)将适用于所有无精度修饰符的浮点数声明(标量、向量、矩阵)

假如typeint类型,那么该精度(precision-qualifier)将适用于所有无精度修饰符的整数型声明(标量、向量)

包括大局变量声明,函数返回值声明,函数参数声明,和本地变量声明等。没有声明精度修饰符的变量将运用和它最近的precision句子中的精度。

precision highp float;
precision mediump int;

Vertex Shader中,假如没有默许的精度,则floatint精度都为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;

片元着色器没有默许的浮点数精度修饰符。因而,对于浮点数,浮点数向量和矩阵变量声明,要么声明有必要包括一个精度修饰符,要不默许的精度修饰符在之前已经被声明过了。

矩阵数据类型

GLSL初探
mat列x行

向量数据类型

GLSL初探

变量存储限定符

GLSL初探
质心插值学术文献:www.ixueshu.com/document/f2…