OpenGL是個狀態機,我們通常見到的glEnable - glDisable函數就是通知OpenGL開啟/關閉某種狀態的,譬如光照、深度檢測等等,故此得名。
VBO (Vertex buffer object)
VBO就是通過幾個函數,是顯卡存儲空間里一塊緩存區BUFFER,用于存儲和頂點以及其屬性相關的信息(頂點信息,顏色信息,法線信息,紋理坐標信息和索引信息等),那么為什么會產生這種方式呢?
解決什么問題: 由于最早的openGL不支持實例化繪制,導致在繪制大量相似圖元的時候,需要反復向GPU提交代碼渲染,這點在OpenGL中的二次方圖元和實例化繪制已經提到過了,會嚴重導致瓶頸效應。
VBO其實就是顯卡中的顯存,為了提高渲染速度,可以將要繪制的頂點數據緩存在顯存中,這樣就不需要將要繪制的頂點數據重復從CPU發送到GPU, 浪費帶寬資源。
VBO + IBO
const GLubyte Indices[] = {
0, 1, 2,
2, 3, 0
};
初始化:
1. glGenBuffers(1, &_vboID); //生成一個句柄
2. glBindBuffer(GL_ARRAY_BUFFER, _vboID); //綁定
//copy the data into the buffer object
3. glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
使用:
glEnableVertexAttribArray(_positionSlot);
glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glEnableVertexAttribArray(_colorSlot);
glVertexAttribPointer(_colorSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), NULL+sizeof(GL_FLOAT)*3);
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]),
GL_UNSIGNED_BYTE, 0);
清除:
glDeleteBuffers(1,&nVBOVertices); //刪除句柄,同時刪除server端頂點緩沖
VAO (Vertex Array object)
在 GL3.0開始的新標準,你大概會留意到傳統的繪圖方式(glVertex)已經要被廢掉了,不僅如此,以最高繪制速度為標記的顯示列表方式也已經被印上deprecated了。
GL3.0時代新增了很多輔助役,VAO則是一個容器,可以包括多個VBO, 它類似于以前的call list, 由于它進一步將VBO容于其中,所以繪制效率將在VBO的基礎上更進一步。
使用方式上,也是和 VBO 大抵差不多。
FBO (Frame Buffer Object)
FBO出現之前,我們是怎么離屏渲染的呢?
- 前面提到的glCopyTexImage2D;
- glDrawBuffers(size, *p)。
可以把在幀緩沖渲染轉移到離屏off screen中, 使用FBO的優點
- FBOs aren’t limited to the size of your window.
- Textures can be attached to FBOs, allowing direct rendering to textures without an explicit glCopyTexImage.
- FBOs can contain multiple color buffers, which can be written to simultaneously from a fragment shader.
“幀緩存關聯圖像”
紋理圖像(texture images)和渲染緩存圖像(renderbuffer images)。如果紋理對象的圖像數據關聯到幀緩存,OpenGL執行的是“渲染到紋理”(render to texture)操作。如果渲染緩存的圖像數據關聯到幀緩存,OpenGL執行的是離線渲染(offscreen rendering).
整個過程是這樣的:
在預處理中,新建一個FBO對象,用Bind綁定到當前(這些BIND之類函數一般是表示“你接下來要處理這個對象啦”的意思),給FBO輸入渲染緩存或紋理,檢查FBO狀態是否正確,再脫離綁定。渲染過程,在需要它時再一次綁定,指定把接下來的內容渲染到它里面的哪一個渲染緩存或紋理......脫離綁定,使用之。
glGenFramebuffers(1, &_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
注意點:
- 切換渲染到屏幕和FBO需要, glBindFramebuffer(GL_FRAMEBUFFER,0)
- openGL渲染的東西會保留,所以切換也需要進行 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|...)
RBO (Render Buffer Object)
RBO 是一塊2D圖像緩存,能夠用于存儲color,depth,stencil值,也就是可以作為
fbo的color或depth或stencil attachment。但是這個rbo不能直接作為紋理使用。
http://blog.csdn.net/ldpxxx/article/details/17304273
renderbufferStorage 關聯屏幕渲染, 緩沖區中最后顯示在屏幕[_context presentRenderbuffer: GL_RENDERBUFFER ];
PBO (Pixel Buffer Object)
待續......