跨平台ffmpeg播放器开发(五)对OpenGL ES的API简单分析解读笔记

前言

本文主要是对OpegGL ES的api做一些资料上的搜集,给大家推荐一个中文详解网站:链接,虽然作者还没有写完,里头许多api解释还没有,但不妨去看一看.英文原文链接.后面会根据使用再具体去完善它.

gl.h中的api

设置纹理

使用glActiveTexture()选择可以由纹理函数进行修改的当前纹理单位。后续的操作都是对选择的纹理进行的。

glActiveTexture (GLenum texture);

绑定shader到program。

使用glAttachShader()将shader容器添加到程序中。这时的shader容器不一定需要被编译,他们甚至不需要包含任何的代码。

glAttachShader (GLuint program, GLuint shader)

把“顶点属性索引”绑定到“顶点属性名”

program:着色器程序容器的id。index:顶点属性索引。name:顶点属性名。

 glBindAttribLocation (GLuint program, GLuint index, const GLchar* name)

激活缓冲区对象

为了激活缓冲区对象,首先需要将它绑定。绑定缓冲区对象表示选择未来的操作(对数据进行初始化或者使用缓冲区对象进行渲染)将影响哪个缓冲区对象。也就是说,如果应用程序有多个缓冲区对象,就需要多次调用glBindBuffer()函数:一次用于初始化缓冲区对象以及它的数据,以后的调用要么选择用于渲染的缓冲区对象,要么对缓冲区对象的数据进行更新。

glBindBuffer (GLenum target, GLuint buffer)

绑定FBO(frame buffer object)

FBO在创建后,使用前必须绑定它.

第一个参数target应该是GL_FRAMEBUFFER,第二个参数是FBO的ID号。一旦FBO被绑定,之后的所有的OpenGL操作都会对当前所绑定的FBO造成影响。ID号为0表示缺省帧缓存,即默认的window提供的帧缓存。因此,在glBindFramebuffer()中将ID号设置为0可以解绑定当前FBO。

glBindFramebuffer (GLenum target, GLuint framebuffer)

绑定当前渲染缓存对象

引用渲染缓存之前必须绑定当前渲染缓存对象.

glBindRenderbuffer (GLenum target, GLuint renderbuffer)

绑定纹理

产生纹理索引之后,需要使用glBindTexture()绑定纹理,才能对该纹理进行操作。glBindTexture()告诉OpenGL下面对纹理的任何操作都是针对它所绑定的纹理对象的,比如glBindTexture(GL_TEXTURE_2D,1)即告诉OpenGL下面代码中对2D纹理的任何设置都是针对索引为1的纹理的。

target:纹理被绑定的目标,它只能取值GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D或者GL_TEXTURE_CUBE_MAP。texture:纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用。

glBindTexture (GLenum target, GLuint texture)

混合颜色和透明度

通常用在两个图形重叠的时候

glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)

混合方程式组合像素

指定帧缓存区与源颜色混合的方式

glBlendEquation (GLenum mode)

允许RGB和Alpha使用不同的混合方式

glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha)

设置源因子和目标因子

glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。这两个参数可以是多种值,详细资料点击链接.

glBlendFunc (GLenum sfactor, GLenum dfactor);

分别指定源和目标的颜色(RGB)分量和A(alpha)分量

原文链接

参数srcRGB表示颜色值的源混合因子,参数destRGB表示颜色在的目标混合因子,参数srcAlpha表示Alpha值的源混合因子,参数destAlpha表示Alpha值的目标混合因子

glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)

分配存储缓冲区对象空间

原文链接

size是存储相关数据所需要的内存数量。这个值通常是数据元素的个数乘以它们各自的存储长度。
data可以是一个指向客户机内存的指针(用于初始化缓冲区对象),也可以是NULL。
usage提供了一个提示, 就是数据在分配之后将如何进行读取和写入。
target可以代表的东西很多,可以点击原文链接查看.

glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)

更新缓冲区中对象的数据

原文链接

target: 可以参考glBufferData中的描述,用来指定需要更新的缓冲区对象的类型
offset: 指定了更新数据相对于缓冲区对象中原始数据开始位置的偏移量,也就是说要从什么地方开始更新原来的数据(以字节为单位)
size:需要更新的数据量的大小
data:一个指向新数据源的指针,将新的数据源拷贝到缓冲区对象中完成更新

glBufferSubData用来更新缓冲区对象中的数据,可以更新一部分或者整个缓冲区中的数据(取决于offset和size的取值),如果offset是0,而size正好是用来缓冲区存储数据的大小,那么整个数据就会被新的数据所替换。需要注意的是offset和size必须保证在原来缓冲区对象可以表示的范围之内。(加入原来缓冲区对象中存储了1024个字节,那么offset就不能大于1024,因为这样的话就没法更新数据了)

glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)

配置FBO后检查是否准备完毕

glCheckFramebufferStatus()检查当前帧缓存的关联图像和帧缓存参数。这个函数不能在glBegin()/glEnd()之间调用。Target参数必须为GL_FRAMEBUFFER。它返回一个非零值。如果所有要求和准则都满足,它返回GL_FRAMEBUFFER_COMPLETE。否则,返回一个相关错误代码告诉我们哪条准则没有满足。
FBO完整性准则有:
(1)帧缓存关联图像的宽度和高度必须非零。
(2)如果一幅图像被关联到一个颜色关联点,那么这幅图像必须有颜色可渲染的内部格式(GL_RGBA, GL_DEPTH_COMPONENT, GL_LUMINANCE, etc)。
(3)如果一幅被图像关联到GL_DEPTH_ATTACHMENT,那么这幅图像必须有深度可渲染的内部格式(GL_DEPTH_COMPONENT,GL_DEPTH_COMPONENT24, etc)。
(4)如果一幅被图像关联到GL_STENCIL_ATTACHMENT,那么这幅图像必须有模板可渲染的内部格式(GL_STENCIL_INDEX,GL_STENCIL_INDEX8, etc)。
(5)FBO至少有一幅图像关联。
(6)被关联到FBO的缩影图像必须有相同的宽度和高度。
(7)被关联到颜色关联点上的所有图像必须有相同的内部格式。
注意:即使以上所有条件都满足,你的OpenGL驱动也可能不支持某些格式和参数的组合。如果一种特别的实现不被OpenGL驱动支持,那么glCheckFramebufferStatus()返回GL_FRAMEBUFFER_UNSUPPORTED。

glCheckFramebufferStatus (GLenum target)

清除一个或多个buffer

glClear (GLbitfield mask)

清除当前所有颜色

红,绿,蓝和AFA值是在颜色缓冲区被清除之后使用的,并且缺省值全是0.即(0,0,0,0),其实就是设置颜色

glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)

指定深度缓冲区的清除值

glClearDepthf (GLclampf depth);

清空画面的缓冲模板

glClearStencil (GLint s)

控制颜色通道渲染

原文链接
它可以控制颜色值中的那个通道绘制那个不被绘制(1为绘制),这个可以让你查看各种颜色的渲染

glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)

对shader容器中的源代码进行编译

glCompileShader (GLuint shader)

指明一个二维压缩纹理图形

原文

target 指定活动纹理单元的目标纹理,必须为GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_POSITIVE_X,GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,GL_TEXTURE_CUBE_MAP_POSITIVE_Z,或者GL_TEXTURE_CUBE_MAP_NEGATIVE_Z.

level 指定细节级别数,0级表示基本图像级别,n级表示第n级mipmap缩小图。

internalformat 指定data中压缩图像数据的存储格式

width 指明纹理图像的宽度,所有OpenGL实现支持的2D纹理图像都至少为64纹素(texel)宽,立方体映射纹理图像都至少为16纹素宽。

height 指明纹理图像的高度,所有OpenGL实现支持的2D纹理图像都至少为64纹素(texel)高,立方体映射纹理图像都至少为16纹素高。

border 指定边框宽度,必须为零(梦维:没错,你必须传入0,因为这是OpenGL ES)。

imageSize 指定data中压缩纹理图像的大小,单位为byte

data 指定一个指向压缩图像数据内存的指针。

glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data)

指定一个二维压缩纹理子图

原文链接

纹理映射一个指定的纹理图像的一部分到每个开启了纹理映射的图元上。在当前段着色器或顶点着色器使用内建纹理搜索函数时,贴图被启用。

glCompressedTexSubImage2D在一个已存在的二维纹理图像的连续子区域重定义纹理子图。由*data
*指向的纹素将替换已存在纹理数组的子区域,范围是x方向区间[xoffset,xoffset+ width – 1],y方向区间[yoffset,yoffset + height – 1]。该区域在原始纹理数组范围之外的区域可能不会包含任何纹素。

宽度为0虽然不是错误,但这样的定义没有意义。

format 必须与之前由 glCompressedTexImage2D指定的纹理图像格式相同。

target 指定活动纹理单元的目标纹理,必须为GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_POSITIVE_X,GL_TEXTURE_CUBE_MAP_NEGATIVE_X,GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 或者 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z.

level 指定细节级别数,0级表示基本图像级别,n级表示第n级mipmap缩小图。

xoffset 指定在纹理数组中x方向纹素偏移量

yoffset 指定在纹理数组中y方向纹素偏移量

width 指定纹理子图宽度

height 指定纹理子图高度

format 指定data中压缩图像数据的存储格式

imageSize 指定data中压缩纹理图像的大小,单位为byte

data 指定一个指向压缩图像数据内存的指针

glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data)

将像素复制到2D纹理图像中

原文链接
纹理映射一个指定的纹理图像的一部分到每个开启了纹理映射的图元上。在当前段着色器或顶点着色器使用内建纹理搜索函数时,贴图被启用。

glCopyTexImage2D 定义一个2D纹理图像或者立方体映射纹理图像,其像素来自于当前帧缓冲区(而非glTexImage2D那样来自于客户端内存)。

左下角位于 (x, y)且宽为width高为height的以屏幕对齐的像素矩形定义了mipmap级别为level的纹理数组。internalformat指定了纹理数组的内部格式。

矩形中的像素像调用glReadPixels函数并将参数format设为GL_RGBA一样被精确地处理,但是处理过程在转换RGBA值后就停止。后续的操作与函数glTexImage2D的描述一致,先将RGBA值就近截至[0,1]区间,然后转换为纹理的内部格式以便存储在纹素数组中。

internalformat所要求的格式组件必须是帧缓冲区所呈现格式的子集。例如:一个GL_RGBA格式的帧缓冲区可以提供任意internalformat格式组件,而一个GL_RGB格式的帧缓冲区只能用来提供GL_RGB 或者 GL_LUMINANCE基础内部格式纹理所要求的格式组件,GL_ALPHA, GL_LUMINANCE_ALPHA, 或 GL_RGBA都不行。

像素排列时,屏幕坐标系中低x、y坐标与纹理坐标系中的低s、t坐标相对应。

如果指定矩形区域的任何像素位于当前渲染上下文所关联的帧缓冲区区域之外,那么所获取的这些像素的值都是未定义的。

glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)

拷贝帧缓存图像至纹理

这个函数性能比较低下,还是推荐使用FBO

glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)

创建program

Program有点类似于一个程序的链接器。program对象提供了把需要做的事连接在一起的机制。在一个program中,shader对象可以连接在一起。

glCreateProgram (void)

创建shader 实例

Shader有点类似于一个程序的编译器。

glCreateShader (GLenum type)

消除不必要的渲染操作

两个参数分别表示禁用多边形正面或者背面上的光照、阴影和颜色计算及操作,消除不必要的渲染计算。例如某对象无论如何位置变化,我们都只能看到构成其组成的多边形的某一面时,可使用该函数。

glCullFace (GLenum mode)

清除缓冲区对象

删除n个缓冲区对象,它们的名称就是buffers数组的元素。释放的缓冲区对象可以被复用(例如,通过调用glGenBuffers())。

如果一个缓冲区对象是在绑定时删除的,这个对象的所有绑定都重置为默认的缓冲区对象,就像以0作为指定的缓冲区对象参数调用了glBindBuffer()一样。如果试图删除不存在的缓冲区对象或名称为0的缓冲区对象,这个操作将被忽略,并不会产生错误。

glDeleteBuffers (GLsizei n, const GLuint* buffers)

删除FBO

glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers)

删除Program

glDeleteProgram (GLuint program)

删除render buffer

glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers)

删除着色器

glDeleteShader (GLuint shader)

清除纹理对象

glDeleteTextures (GLsizei n, const GLuint* textures)

指定深度缓冲比较值

通常用作比较函数

glDepthFunc (GLenum func)

控制对深入缓冲区的读写

glDepthMask (GLboolean flag)

指定在-1到1内的标准化的深度坐标的线性映射到窗口的深度坐标

glDepthRangef (GLclampf zNear, GLclampf zFar)

将着色器从程序中分离

glDetachShader (GLuint program, GLuint shader)

关闭功能,由参数决定是什么功能

glDisable (GLenum cap)

禁用顶点数组

glDisableVertexAttribArray (GLuint index)

绘制顶点

当采用顶点数组方式绘制图形时,使用该函数。该函数根据顶点数组中的坐标数据和指定的模式,进行绘制。
调用该函数之前需要,调用glEnableVertexAttribArray、glVertexAttribPointer等设置顶点属性和数据。

glDrawArrays (GLenum mode, GLint first, GLsizei count)

glDrawArrays主要讲数据空间损耗在顶点的定义处;glDrawElements主要讲数据空间损耗在顶点索引的定义处;如果在你的工程中,画的图形较少或者,图形虽多但很多相同的,则可采用glDrawArrays更节省数据占用的空间;相反,如果图形多,而且形状大不相同的时候,可以优先考虑采用glDrawElements函数。

glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)

开启某项功能

glEnable (GLenum cap)

启用顶点数组

glEnableVertexAttribArray (GLuint index)

向图形硬件提交缓冲区里的指令

将缓冲区中的指令(无论是否为满)立刻送给图形硬件执行,但是要等待图形硬件执行完这些指令才返回

glFinish (void)

将缓冲区中的指令(无论是否为满)立刻送给图形硬件执行,发送完立即返回

glFlush (void)

切换渲染缓冲区对象

glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)

切换2D纹理图像

glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)

控制多边形的正面是如何决定的

mode的值为:
GL_CCW 表示窗口坐标上投影多边形的顶点顺序为逆时针方向的表面为正面。
GL_CW 表示顶点顺序为顺时针方向的表面为正面。

glFrontFace (GLenum mode)

分配缓冲区对象表示符

glGenBuffers (GLsizei n, GLuint* buffers)

为相关联的纹理生成一组完整的mipmap

为target相关联的纹理生成一组完整的mipmap。其中的target可以是GL_TEXTURE_1/2/3D/[1d/2d_ARRAY] 以及 GL_TEXTURE_CUBE_MAP . 所构建的层有GL_TEXTURE_BASE_LEVEL和GL_TEXTURE_MAX_LEVEL控制.

假设已经建立了第0层mipmap, 可以使用gluBuild1/2/3DMipmaps() 函数来创建和定义一系列大小递减的mipmap。如果源纹理的大小不是2的幂,可以利用gluBuild*DMipmaps()函数把纹理图像缩放为最邻近的2的幂。

glGenerateMipmap (GLenum target)

创建FBO

glGenFramebuffers()需要两个参数:第一个是要创建的帧缓存的数目,第二个是指向存储一个或者多个ID的变量或数组的指针。它返回未使用的FBO的ID。ID为0表示默认帧缓存,即window系统提供的帧缓存。
当FBO不再被使用时,FBO可以通过调用glDeleteFramebuffers()来删除。

一旦一个FBO被创建,在使用它之前必须绑定。

glGenFramebuffers (GLsizei n, GLuint* framebuffers)

创建渲染缓存对象

引用渲染缓存之前必须绑定当前渲染缓存对象

glGenRenderbuffers (GLsizei n, GLuint* renderbuffers)

创建纹理

参数含义:n:用来生成纹理的数量textures:存储纹理索引的数组

glGenTextures()就是用来产生你要操作的纹理对象的索引的,比如你告诉OpenGL,我需要5个纹理对象,它会从没有用到的整数里返回5个给你。产生纹理索引之后,需要使用glBindTexture()绑定纹理,才能对该纹理进行操作。glBindTexture()告诉OpenGL下面对纹理的任何操作都是针对它所绑定的纹理对象的,比如glBindTexture(GL_TEXTURE_2D,1)即告诉OpenGL下面代码中对2D纹理的任何设置都是针对索引为1的纹理的。

glGenTextures (GLsizei n, GLuint* textures)

返回活动属性

原文链接

glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)

获得某个active uniform变量的所有信息,类型,名字等

glGetActiveUniform (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)

返回连接到程序对象的着色对象的句柄

glGetAttachedShaders (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) 

获取指向顶点着色器程序中,相应数据的index

原文链接

glGetAttribLocation (GLuint program, const GLchar* name)

查询布尔数值状态

每个函数原型中, 参数 pname 指的是你要查询的状态设置, 参数 params 是一个足够保存所有状态的值的数组. 鉴于状态过多, 我们不可能面面俱到, 只在出现的地方给予解释.

glGetBooleanv (GLenum pname, GLboolean* params)

返回缓冲对象的参数

glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params)

获取错误

我们还可以通过使用gluErrorString()来获取错误标识的描述字符串。

const GLubyte* gluErrorString(GLenum errorCode);

此处的errorCode是通过glGetError来获得的。例如:

gluErrorString(GL_INVALID_ENUM); //此处将返回字符串:invalid enumerant
错误列表
glGetError (void)

查询浮点型变量值

每个函数原型中, 参数 pname 指的是你要查询的状态设置, 参数 params 是一个足够保存所有状态的值的数组. 鉴于状态过多, 我们不可能面面俱到, 只在出现的地方给予解释.

glGetFloatv (GLenum pname, GLfloat* params)

检索信息的绑定缓存对象的附件

glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint*   params)

获取当前OpenGL实现所支持的纹理单位的数量

glGetIntegerv (GLenum pname, GLint* params)

获取编译情况

program:一个着色器程序的id;
pname:GL_LINK_STATUS;
param:返回值,如果一切正常返回GL_TRUE代,否则返回GL_FALSE。

glGetProgramiv (GLuint program, GLenum pname, GLint* params)

获取连接错误

glGetProgramInfoLog (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)

获取当前绑定的渲染缓存对象的一些参数

Target应该是GL_RENDERBUFFER;
第二个参数是所要得到的参数名字;
最后一个是指向存储返回值的整型量的指针。渲染缓存的变量名有如下:
GL_RENDERBUFFER_WIDTH
GL_RENDERBUFFER_HEIGHT
GL_RENDERBUFFER_INTERNAL_FORMAT
GL_RENDERBUFFER_RED_SIZE
GL_RENDERBUFFER_GREEN_SIZE
GL_RENDERBUFFER_BLUE_SIZE
GL_RENDERBUFFER_ALPHA_SIZE
GL_RENDERBUFFER_DEPTH_SIZE
GL_RENDERBUFFER_STENCIL_SIZE

glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params)

获取着色器编译情况

glGetShaderiv (GLuint shader, GLenum pname, GLint* params)

获取着色器日志

glGetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)

获取Shader精度值

glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)

获取着色器源代码

glGetShaderSource (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)

获取标签名字内容

glGetString (GLenum name)

获取纹理浮点型参数

glGetTexParameterfv (GLenum target, GLenum pname, GLfloat* params)

获取纹理整型参数

glGetTexParameteriv (GLenum target, GLenum pname, GLint* params)

获取程序中的属性

glGetUniformfv (GLuint program, GLint location, GLfloat* params)

glGetUniformiv (GLuint program, GLint location, GLint* params)

获取局部变量中的指定变量

 glGetUniformLocation (GLuint program, const GLchar* name)

获取顶点属性

glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params)

返回一个通用的顶点属性参数

glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params)

返回指定的通用顶点属性指针的地址

glGetVertexAttribPointerv (GLuint index, GLenum pname, GLvoid** pointer)

指示进行控制的行为或模式

原文链接

用来抗锯齿或者控制画面

glHint (GLenum target, GLenum mode)

判断一个标识符是否是一个当前被使用的标识符

如果buffer是一个已经绑定的缓冲区对象的名称,而且还没有删除,这个函数返回GL_TRUE。

如果buffer为0或者它不是一个缓冲区对象的名称,这个函数返回GL_FALSE。

glIsBuffer (GLuint buffer)

获取某个状态是否被打开

glIsEnabled (GLenum cap)

判断一个帧缓存对象是否正在被使用

glIsFramebuffer (GLuint framebuffer)

判断一个程序对象是否正在被使用

glIsProgram (GLuint program)

判断一个渲染缓冲区对象是否正在被使用

glIsRenderbuffer (GLuint renderbuffer)

判断一个着色器对象是否正在被使用

glIsShader (GLuint shader)

判断一个纹理是否正在被使用用

texture是由glGenTextures()函数返回的

glIsTexture (GLuint texture)

指定线段的栅格化宽度

glLineWidth (GLfloat width)

链接程序对象

glLinkProgram (GLuint program)

设置像素存储模式

glPixelStorei (GLenum pname, GLint param)

设定OpenGL用于计算深度值的比例和单元

glPolygonOffset (GLfloat factor, GLfloat units)

从帧缓冲区读取一个矩形像素数组,并把数据保存在内存中

glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)

释放着色器编译器占得资源

glReleaseShaderCompiler (void)

为着色器缓冲区分配空间

第一个参数必须是GL_RENDERBUFFER。
第二个参数可以是用于颜色的(GL_RGB,GL_RGBA,etc.),用于深度的(GL_DEPTH_COMPONENT),或者是用于模板的格式(GL_STENCIL_INDEX)。
Width和height是渲染缓存图像的像素维度。
width和height必须比GL_MAX_RENDERBUFFER_SIZE_EXT小,否则将会产生GL_UNVALID_VALUE错误。

glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height)

多参数指定范围

多用在多重采样

glSampleCoverage (GLclampf value, GLboolean invert)

限制绘图区域

glScissor (GLint x, GLint y, GLsizei width, GLsizei height)

指定二进制 shader(有的显卡支持在线编译,有的支持二进制shader文件)

glShaderBinary (GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)

给着色器实例指定源码

glShaderSource (GLuint shader, GLsizei count, const GLchar* const string, const GLint length)

在模板上允许或禁止

模板和深度缓存测试一样,允许或禁止在以单个像素为基础上绘制。模板平面将最先通过GL绘制基元进行绘制,然后是几何体和图像在通过使用模板平面指定的屏幕部分上进行渲染。模板是一种典型的使用多通道渲染算法来达到特殊效果的方法,比如贴花,绘制轮廓和创造性的几何体渲染等。

glStencilFunc (GLenum func, GLint ref, GLuint mask)

设置测试模板前后测试功能和参考值

设置遮罩或者裁剪用

glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask)

设置模板缓冲区的写入掩码

glStencilMask (GLuint mask)

允许对正面和背面独立使用掩码

glStencilMaskSeparate (GLenum face, GLuint mask)

比较结果修改蒙板缓存区中的值

原文链接

glStencilOp (GLenum fail, GLenum zfail, GLenum zpass)

对正反面使用不同的模板进行更新操作

原文链接

glStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass)

根据像素(YUV)数据生成2D纹理

target:指定目标纹理,这个值必须是GL_TEXTURE_2D。

level:执行细节级别。0是最基本的图像级别,n表示第N级贴图细化级别。

internalformat:指定纹理中的颜色格式。可选的值有GL_ALPHA,GL_RGB,GL_RGBA,GL_LUMINANCE, GL_LUMINANCE_ALPHA 等几种。

width:纹理图像的宽度。

height:纹理图像的高度。

border:边框的宽度。必须为0。

format:像素数据的颜色格式, 不需要和internalformatt取值必须相同。可选的值参考internalformat。

type:指定像素数据的数据类型。可以使用的值有GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4,GL_UNSIGNED_SHORT_5_5_5_1等。pixels:指定内存中指向图像数据的指针

glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels)

设置纹理贴图的参数属性

原文链接

glTexParameterf (GLenum target, GLenum pname, GLfloat param)

glTexParameterfv (GLenum target, GLenum pname, const GLfloat* params)

纹理过滤函数

可以用来确定如何把图像从纹理图象空间映射到帧缓冲图象空间。即把纹理像素映射成像素

glTexParameteri (GLenum target, GLenum pname, GLint param)

设置纹理参数

glTexParameteriv (GLenum target, GLenum pname, const GLint* params)

替换/更新纹理

glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels)

更改一个uniform变量或数组的值

原文链接

要更改的uniform变量的位置由location指定,location的值应该由glGetUniformLocation函数返回。通过调用glUseProgram,glUniform操作的程序对象将成为当前状态的一部分。
glUniform{1|2|3|4}{f|i}使用传进来的实参,修改通过location指定的uniform变量。
所有在程序对象中定义的活动uniform变量,在程序对象链接成功后都会被初始化为0.直到下一次程序对象链接成功再一次被初始化为0前,它们将保留通过调用glUniform赋给它们的值。
glUniform{1|2|3|4}{f|i}v可以用来更改单个uniform变量的值,或者一个uniform变量数组。

为当前程序对象指定Uniform变量的值。(译者注:注意,由于OpenGL ES由C语言编写,但是C语言不支持函数的重载,所以会有很多名字相同后缀不同的函数版本存在。其中函数名中包含数字(1、2、3、4)表示接受这个数字个用于更改uniform变量的值,i表示32位整形,f表示32位浮点型,ub表示8位无符号byte,ui表示32位无符号整形,v表示接受相应的指针类型。

glUniform1f (GLint location, GLfloat x)
glUniform1fv (GLint location, GLsizei count, const GLfloat* v)
glUniform1i (GLint location, GLint x) 
glUniform1iv (GLint location, GLsizei count, const GLint* v)  
glUniform2f (GLint location, GLfloat x, GLfloat y)  
glUniform2fv (GLint location, GLsizei count, const GLfloat* v)  
glUniform2i (GLint location, GLint x, GLint y)  
glUniform2iv (GLint location, GLsizei count, const GLint* v)  
glUniform3f (GLint location, GLfloat x, GLfloat y, GLfloat z)  
glUniform3fv (GLint location, GLsizei count, const GLfloat* v)  
glUniform3i (GLint location, GLint x, GLint y, GLint z)  
glUniform3iv (GLint location, GLsizei count, const GLint* v)  
glUniform4f (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  
glUniform4fv (GLint location, GLsizei count, const GLfloat* v)  
glUniform4i (GLint location, GLint x, GLint y, GLint z, GLint w)  
glUniform4iv (GLint location, GLsizei count, const GLint* v)

更改矩阵

glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)  
glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)

使用program

在链接了程序以后,我们可以使用glUseProgram()函数来加载并使用链接好的程序。参数是着色器id

glUseProgram (GLuint program)

验证program是否可以在当前状态下执行

glValidateProgram (GLuint program)

指定定点类型的属性值

原文链接

glVertexAttrib1f (GLuint indx, GLfloat x)
glVertexAttrib1fv (GLuint indx, const GLfloat* values)  
glVertexAttrib2f (GLuint indx, GLfloat x, GLfloat y)  
glVertexAttrib2fv (GLuint indx, const GLfloat* values)  
glVertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z)  
glVertexAttrib3fv (GLuint indx, const GLfloat* values)  
glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)  
glVertexAttrib4fv (GLuint indx, const GLfloat* values)  

一个通用顶点属性数组。

当渲染时,它指定了通用顶点属性数组从索引index处开始的位置和数据格式。

index:指示将被修改的通用顶点属性的索引
size:指点每个顶点元素个数(1~4)
type:数组中每个元素的数据类型
normalized:指示定点数据值是否被归一化(归一化<[-1,1]或[0,1]>:GL_TRUE,直接使用:GL_FALSE)
stride:连续顶点属性间的偏移量,如果为0,相邻顶点属性间紧紧相邻
pointer:顶点数组

glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)

设定视口

glViewport (GLint x, GLint y, GLsizei width, GLsizei height)

至此gl.h中的api已经搞完了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容