1. 程式人生 > >OPENGL ES常用函式功能總結

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)中呼叫。