轉自: http://www.cppblog.com/w2001/archive/2008/05/10/49376.html
OpenGL VBO並不難,但是較繁瑣,其實其概念跟加載紋理是一樣的:
初始化階段:
1. glGenBuffersARB(1,
&nVBOVertices); //生成一個句柄
2. glBindBufferARB(GL_ARRAY_BUFFER_ARB,
nVBOVertices); //聲明該句柄爲一個vbo句柄,並選擇之
3. glBufferDataARB(GL_ARRAY_BUFFER_ARB,
sizeof(vertices), vertices,GL_STATIC_DRAW); //將頂點集上傳至server端
使用階段:
1. glEnableClientState(GL_VERTEX_ARRAY);
//開始使用vbo
2. glBindBufferARB(GL_ARRAY_BUFFER_ARB,
nVBOVertices); //選擇當前使用的vbo
3. glVertexPointer(3,
GL_FLOAT, 0, BUFFER_OFFSET(0)); //指定vbo頂點格式
4. glDrawArrays(
GL_TRIANGLES, 0, g_pMesh->m_nVertexCount ); //畫吧
5. glDisableClientState(GL_VERTEX_ARRAY);
//停止使用vbo
收尾階段:
1. glDeleteBuffersARB(1,&nVBOVertices);
//刪除句柄,同時刪除server端頂點緩衝
再來看看紋理緩衝是怎麼使用的,其實差不多:
初始化階段:
1. glGenTextures(1,
&texID);//創建句柄
2. glBindTexture(GL_TEXTURE_2D,
texID); //設置句柄類型
3. glTexImage2D(GL_TEXTURE_2D,
0, GL_RGBA, img->GetWidth(), img->GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, raw_rgba); //上傳紋理緩衝
使用階段:
1. glEnable(GL_TEXTURE_2D);
//開始使用紋理緩衝
2. glBindTexture(GL_TEXTURE_2D,
texID); //選擇當前使用的紋理緩衝
3. 發送頂點和紋理座標,畫吧...省略
4. glDisable(GL_TEXTURE_2D);
//停止使用紋理
收尾階段:
1. glDeleteTextures(1,&texID);//刪除句柄,,同時刪除server端緩衝
看到了麼,這個概念是不是很相似?都是:
1. 創建句柄
2. 設置句柄類型
3. 上傳數據
4. 開始使用緩衝
5. 選擇句柄
6. 使用緩衝
7. 停止使用緩衝
8. 刪除句柄和緩衝