# VBO的使用

ok so let's start with what you should check for. In your compiler look for gl.h . If you won't find it download Windows SDK. If you are using Visual Studio good for you, if not take just the OpenGL files. I suggest you full SDK because I haven't yet found gl.h separatelly, probably because everybody has it.. As for the SDK, in Windows Server 2003 R2 Platform SDK these openGL files are for sure, but you should try first Windows 7/Vista SDK.

Now. You mentioned GLES. I don't know how GLES work because I use GLEW. In many ways NeHe wrote great tutorials but they're getting outdated. So if you like to continue with me, use GLEW. You will include it on start + you will have to provide library. Like this

#include <GL/glew.h>
#pragma comment(lib,"glew32.lib")


Also you will have to copy glew32.dll to folder where your EXE is.

Now you should be set up for creating VBO. I guess that you already learned how to create blank window if not here's link. You will have to download GLUT(or better freeglut) if you didn't already, but it is widely used and you will need it later on anyway.

We'll do some additions in that code. In main func, call init() under CreateWindow call like this

glutCreateWindow ("You’re first OpenGL Window");
init();


and make function init look like this:

void init(){
glewInit();
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glEnableClientState(GL_VERTEX_ARRAY);
}


also make reshape() func:

void reshape(int w, int h){
glViewport(0,0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0f, (GLdouble) w, 0.0f, (GLdouble) h);
}


and add this line under glutDisplayFunc(display);

glutReshapeFunc(reshape);


Now we are ready for VBO actually this was just trivial creating of window where we can see output but as you said you had some problems I better wrote it down, as for others.

So how to use VBO if you want to see result now here's code I'll try to tell you about it: make global variable

GLuint ID;


before any of functions

add this part on bottom of init() function:

float data[][2] = {{50,50},{100,50},{75,100}};
glGenBuffers(1,&ID);
glBindBuffer(GL_ARRAY_BUFFER, ID);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);


and this part into display function which is empty in this moment:

glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f,0.0f,0.0f);
glBindBuffer(GL_ARRAY_BUFFER, ID);
glVertexPointer(2, GL_FLOAT, 2*sizeof(float), 0);
glDrawArrays(GL_POLYGON,0,3);
glFlush();


You should see black triangle. So to the code. You make some sort of data. Then you generate new VBO ID which is not in use(will be 1 in our example everytime :) ). After this with Bind call you actually create this VBO and with BufferData call you asign your data to that VBO. In display, you clear window for use, select drawing color and now the Bind means ACTIVATE this buffer object. You can have number of VBO in ARRAY_BUFFER but only one can be active. VertexPointer is use to set begining of VBO and strides between it's elements. As you can see we used X and Y coordinates as elements so stride is 2*sizeof(float). That's because stride is in bytes. Finnaly DrawArrays is render call, something as you would call glBegin() and glEnd(). You tell what to draw, and in which range. glFlush() is just used for showing rendered stuff.

If you got lost somewhere in code here it is on one place:

#include <windows.h>
#include <iostream>
#include <GL/glew.h>
#include <GL/freeglut.h>

#pragma comment(lib,"glew32.lib")

GLuint ID;

void init(){
glewInit();
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glEnableClientState(GL_VERTEX_ARRAY);
float data[][2] = {{50,50},{100,50},{75,100}};
glGenBuffers(1,&ID);
glBindBuffer(GL_ARRAY_BUFFER, ID);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
}

void reshape(int w, int h){
glViewport(0,0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0f, (GLdouble) w, 0.0f, (GLdouble) h);
}

void display(){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f,0.0f,0.0f);
glBindBuffer(GL_ARRAY_BUFFER, ID);
glVertexPointer(2, GL_FLOAT, 2*sizeof(float), 0);
glDrawArrays(GL_TRIANGLES,0,3);
glFlush();
}

int main(int argc, char **argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(300,300);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

PS: I know this is month old question but I think all questions should be answered so anyone looking for same problem won't get here and find nothing ;)

PSS: If this example asks for DLL you have them in freeglut or GLEW bin files ;)

Edit1: I forgot for that so don't make same mistake, after you are finished with VBO destroy it to prevent memory leak. As VRAM isn't so big this can be serious here's how to do it:

glDeleteBuffers(1, &ID);

• 本文已收录于以下专栏：

## VBO的使用2

OpenGL VBO 说明 自: http://hi.baidu.com/luckwxx623/blog/item/34e36445b8fad92ecffca3e1.html   顶点缓...

## 关于使用VBO技术注意问题1

// 使用缓冲区 glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState( GL_VERTEX_ARRAY ); ...

## opengles之VBO和FBO的结合使用

FBO的理论详见:http://blog.csdn.net/xiajun07061225/article/details/7283929/ FBO的创建: class Fram...

## jogl使用VBO

jogl使用VBO，可以把绘图的顶点数据（点坐标、颜色。。。。）传给显卡，避免CPU遍历数据一个一个的传，极大提升性能（在图元极大的时候很明显） 以下例子，利用vbo技术画三角形package tes...
• sidihuo
• 2015年04月17日 17:51
• 876

## OpenGL（二十四） VAO、VBO和着色器使用示例

• dcrmg
• 2016年12月06日 23:33
• 598

## GLSL渲染语言入门与VBO、VAO使用：绘制一个三角形

• flyrxue
• 2012年08月22日 10:08
• 704

举报原因： 您举报文章：VBO的使用 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)