首页 > 代码库 > Opengl_On_Vs_2_顶点缓存对象
Opengl_On_Vs_2_顶点缓存对象
1,查看当前opengl版本
2,glew
the OpenGL Extension Wrangler Library. GLEW helps you deal with the headache that can accompany the management of extensions in OpenGL. Once initialized it queries for all the available extensions on your platform, dynamically loads them and provides easy access via a single header file.
If you include other OpenGL headers you must be careful to include this file before the others else GLEW will complain that about it.
3,
GL_ARB_vertex_buffer_object 扩展致力于提供顶点数组与显示列表的优势来提升OpenGL效率,同时避免它们实现上的不足。
顶点缓存对象(VBO)准许顶点数组数据存放在服务端的高性能显卡内存中,且提供高效数据传输。如果缓存对象用于保存像素数据,就被称为像素缓存对象(PBO)。
使用顶点数组可以降低函数调用次数与降低共享顶点的重复使用。
可以在多个客户端共享缓存数据。因为VBO处在服务器端,多个客户端可以通过相应的标示符访问同一个缓存。
4,创建VBO需要3个步骤:
使用glGenBuffers()生成新缓存对象。
使用glBindBuffer()将缓存对象连接到相应的缓存上。
使用glBufferData()将顶点数据拷贝到缓存对象中。
void glGenBuffers(GLsizei n, GLuint* buffers);
void glBindBuffer(GLenum target, GLuint buffer);
void glBufferData(GLenum target,GLsizeiptr size, const GLvoid* data, GLenum usage);
void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
与glBufferData()类似,glBufferSubData()用于向VBO中拷贝数据,不过它仅仅将从给定offset开始的一定范围的数据替换到现存缓存中。(在使用glBufferSubData()之前,整个缓存必须由glBufferData()指定。)
void glDeleteBuffers(GLsizei n, const GLenum* bufs);
glEnableVertexAttribArray(0);
加载到buffer中的顶点位置在固定功能管线中是被认为是索引为0的顶点属性(当没有着色器绑定时被启用)。
必须开启每一个顶点的属性,否则渲染管线无法获取这些数据。
glBindBuffer(GL_ARRAY_BUFFER, VBO);
这里我们再次绑定我们的buffer准备开始draw call回调。
在这个小程序中我们每一帧都调用这个回调是很冗余的,在更加复杂的程序中,将会有很多的buffer缓冲来存储不同的模型,则需要Bind要调用的Buffer来不断更新管线的状态。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
这个回调告诉管线怎样解析bufer中的数据。
第1个参定义了属性的索引,再这个例子中我们知道这个索引默认是0,但是当我们开始使用shader着色器的时候,我们既要明确的设置着色器中的属性索引同时也要检索它;
第2个参数指的是属性中的元素个数(3个表示的是:X,Y,Z坐标);
第3个参数指的是每个元素的数据类型;
第4个参数指明我们是否想让我们的属性在被管线使用之前被单位化,我们这个例子中希望我们的数据保持不变的被传送;
第5个参数(称作‘stride‘)指的是缓冲中那个属性的两个实例之间的比特数距离。当只有一个属性(例如:buffer只含有一个顶点的位置数据)并且数据被紧密排布的时候将该参数值设置为0。如果我们有一个包含位置和法向量(都是有三个浮点数的vector向量,一共6个浮点数)两个属性的数据结构的数组的时候,我们将设置参数值为这个数据结构的比特大小(6*4=24);
最后一个参数在前一个例子中非常有用。我们需要在管线发现我们的属性的地方定义数据结构中的内存偏移值。在有位置数据和法向量数据的结构中,位置的偏移量为0,而法向量的偏移量则为12。
5,
可见的点必须在这个盒子内,这样他们将可以通过视窗的变换映射到窗口中可见的坐标上。当俯视Z坐标轴的负方向时这个单位化盒子看上去如下图:
Opengl_On_Vs_2_顶点缓存对象