OPENGL ES常用函数功能总结

1.glGenBuffers

//创建缓冲区对象
void glGenBuffers(GLsizei n, GLuint *buffers);
//在buffers数组中返回当前n个未使用的名称,表示缓冲区对象
GLboolean glIsBuffer(GLuint buffer);
//判断是否是缓冲区对象

2.glBindBuffer

//激活缓冲区对象
void glBindBuffer(GLenum target, GLuint buffer);
//指定当前活动缓冲区的对象

3.glBufferData

//用数据分配和初始化缓冲区对象
void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
//target:可以是GL_ARRAY_BUFFER()(顶点数据)或GL_ELEMENT_ARRAY_BUFFER(索引数据)
//size:存储相关数据所需的内存容量
//data:用于初始化缓冲区对象,可以是一个指向客户区内存的指针,也可以是NULL
//usage:数据在分配之后如何进行读写

4.glMapBuffer

//更新缓冲区数据值
GLvoid *glMapBuffer(GLenum target, GLenum access);
//提供对缓冲区对象包含的整个数据集合的更新
//access:GL_READ_ONLY,GL_WRITE_ONLY,GL_READ_WRITE

GLboolean *glUnMapBuffer(GLenum target);
//表示当前绑定缓冲区对象的更新已经完成,与glMapBuffer()结合使用

5.glCopyBufferSubData

//在缓冲区对象之间复制数据
void glCopyBufferSubData(GLenum readbuffer, GLenum writebuffer, GLsizeiptr size);
//把数据从readbuffer相关联的缓冲区对象复制到writebuffer的缓冲区对象,从readoffset开始移动size个数据的数量到wirteoffset中

6.glDeleteBuffers

//清除缓冲区对象
void glDeleteBuffers(GLsizei n, GLuint *buffers);

7.索引

索引的缓存对象:GL_ELEMENT_ARRAY_BUFFER(索引绘图必须使用这个缓存对象).

8.glDrawElements

//索引绘图
void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
注意:indices参数如果未绑定缓存,其值为索引的指针。如果绑定缓存,其值为缓存的偏移量。



————————————–FBO函数 start—————————————-


FBO原理介绍:OpenGL管线的最终渲染目的地被称作帧缓存(framebuffer)。不使用代码创建FBO情况下默认为使用系统创建的帧缓存,最后渲染到屏幕上。当使用代码创建FBO时,相当于将渲染对象重定向到FBO,不会显示在屏幕上。如需显示,可将FBO渲染之后的texture绘制到屏幕。


9.glGenFramebuffers

//创建FBO
void glGenFramebuffers(GLsizei n, GLuint* ids)
参数:第一个是要创建的帧缓存的数目,第二个是指向存储一个或者多个ID的变量或数组的指针。它返回未使用的FBO的ID。ID为0表示默认帧缓存。
当FBO不再被使用时,FBO可以通过调用glDeleteFramebuffers()来删除

10.glBindFramebuffer()

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

11.glGenRenderbuffers()

//创建渲染缓存,它返回一个非零的正整数。ID为0是OpenGL保留值。
void glGenFramebuffers(GLsizei n, GLuint* ids)

12.glBindRenderbuffer()

//绑定当前渲染缓存对象。他target参数应该是GL_RENDERBUFFER。
void glBindRenderbuffer(GLenum target, GLuint id)

13.glRenderbufferStorage()

//分配空间。
void glRenderbufferStorage(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height)
参数:第一个参数必须是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错误。

14.glGetRenderbufferParameteriv()

//得到当前绑定的渲染缓存对象的一些参数。
void glGetRenderbufferParameteriv(GLenum target, GLenum param,GLint* value)
参数: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

15.glFramebufferTexture2D()

//把2D纹理图像关联到FBO。
glFramebufferTexture2D(GLenum target, GLenumattachmentPoint, GLenum textureTarget, GLuint textureId, GLint  level)
参数:第一个参数一定是GL_FRAMEBUFFER_,第二个参数是关联纹理图像的关联点。一个帧缓冲区对象可以有多个颜色关联点(GL_COLOR_ATTACHMENT0, ..., GL_COLOR_ATTACHMENTn),L_DEPTH_ATTACHMENT, 和GL_STENCIL_ATTACHMENT。第三个参数textureTarget在多数情况下是GL_TEXTURE_2D。第四个参数是纹理对象的ID号。最后一个参数是要被关联的纹理的mipmap等级
如果参数textureId被设置为0,那么纹理图像将会被从FBO分离。如果纹理对象在依然关联在FBO上时被删除,那么纹理对象将会自动从当前帮的FBO上分离。然而,如果它被关联到多个FBO上然后被删除,那么它将只被从绑定的FBO上分离,而不会被从其他非绑定的FBO上分离。

16.glFramebufferRenderbuffer()

//把渲染缓存对象关联到FBO
void glFramebufferRenderbuffer(GLenum target, GLenum attachmentPoint, GLenum renderbufferTarget, GLuint renderbufferId)
参数:前两个参数和glFramebufferTexture2D()一样。第三个参数只能是GL_RENDERBUFFER,最后一个参数是渲染缓存对象的ID号。
如果参数renderbufferId被设置为0,渲染缓存图像将会从FBO的关联点分离。如果渲染缓存图像在依然关联在FBO上时被删除,那么纹理对象将会自动从当前绑定的FBO上分离,而不会从其他非绑定的FBO上分离。



————————————–FBO函数 end—————————————-


一、EGL抗锯齿

在egl初始化时指定多重采样数,原NDK中的opengles demo修改如下:
private static int[] s_configAttribs2 =
{
    EGL10.EGL_RED_SIZE, 4,
    EGL10.EGL_GREEN_SIZE, 4,
    EGL10.EGL_BLUE_SIZE, 4,
    EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL10.EGL_SAMPLE_BUFFERS, 1,
    EGL10.EGL_SAMPLES, 8,
    EGL10.EGL_NONE
};

注意:任何使用Opengl接口的方法调用需要在Opengl Context中进行,否则会出现:call to OpenGL ES API with no current context (logged once per thread) 报错信息。所谓的Opengl Context 其实就是需要在onDrawFrame(GL10 gl),onSurfaceChanged(GL10 gl, int width, int height),onSurfaceCreated(GL10 gl, EGLConfig config)中调用。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值