OpenGL中常用函数详解和VBO VAO详解以及VAO的使用
2017-09-07 11:08
841 查看
OpenGL中常用函数详解和VBO VAO详解以及VAO的使用
VBO将顶点信息放到GPU中,GPU在渲染时去缓存中取数据,二者中间的桥梁是GL-Context。GL-Context整个程序一般只有一个,所以如果一个渲染流程里有两份不同的绘制代码,GL-context就负责在他们之间进行切换。这也是为什么要在渲染过程中,在每份绘制代码之中会有glBindbuffer、glEnableVertexAttribArray、glVertexAttribPointer。那么优化的方法来了,把这些都放到初始化时候完成吧!VAO记录该次绘制所需要的所有VBO所需信息,把它保存到VAO特定位置,绘制的时候直接在这个位置取信息绘制。
VAO的全名是Vertex Array Object,首先,它不是Buffer-Object,所以不用作存储数据;其次,它针对“顶点”而言,也就是说它跟“顶点的绘制”息息相关
和 顶点数组没有任何关系 VAO保存的是VBO的绘制状态。VAO将其对应的VBO的状态及信息直接存储在GPU的内存中,VAO中并没有VBO的相关属性数据只是存储了VBO的当前状态及索引信息通过VAO就能快速访问到VBO的状态及VBO的数据(VAO和VA(Vertex
Array 顶点数组)没有任何关系)VAO记录的是一次绘制中所需要的信息,这包括“数据在哪里glBindBuffer”、“数据的格式是怎么样的glVertexAttribPointer”、shader-attribute的location的启用glEnableVertexAttribArray。VAO可以理解为一个状态容器,记录VBO的状态。
使用VAO后GPU在绘制时就可以直接找到其记录的VBO的状态及对应的VBO的数据能实现快速绘制并且避免了数据的频繁操作从而提高性能。
使用VBO的步骤就不做解释了。
此处解释使用VAO的步骤:
1.产生VAO
2.绑定VAO
3.绑定VBO对应的VBO handle(VBO
数据句柄)(Bind Vertex Buffer Object)
4.启用shader中对应的属性信息使用glEnableVertexAttribArray函数启用(shader-attribute的location的启用)
默认所有这些顶点属性端口都是关闭的,因此需要打开这些(CPU到GPU)通信端口
5.指定了渲染时的顶点属性数组的数据格式和位置使用glVertexAttribPointer函数指定
6.绑定下一个VBO
7.VAO保存结束
示例:
//开始保存状态
glGenVertexArrays(1, &vaoHandle);
glBindVertexArray(vaoHandle);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);//绑定刚才分配的缓冲区到当前Context中
// Enable vertex position attribute GPU端,默认所有这些顶点属性端口都是关闭的,因此需要打开这些通信端口:
glEnableVertexAttribArray(positionAttribHandle);
// Send data to shader using queried attrib location
//---指定了渲染时索引值为 positionAttribHandle
的顶点属性数组的数据格式和位置
glVertexAttribPointer(positionAttribHandle, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glEnableVertexAttribArray(colorAttribHandle);
glVertexAttribPointer(colorAttribHandle, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),
(GLvoid *) (sizeof(float) * 3));
//保存结束 // Disable our Vertex Buffer Object
glBindVertexArray(0);
渲染时使用VAO渲染
// Bind our Vertex Array Object
glBindVertexArray(vaoHandle);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
参考文章http://blog.csdn.net/jeffasd/article/details/77878739
VBO将顶点信息放到GPU中,GPU在渲染时去缓存中取数据,二者中间的桥梁是GL-Context。GL-Context整个程序一般只有一个,所以如果一个渲染流程里有两份不同的绘制代码,GL-context就负责在他们之间进行切换。这也是为什么要在渲染过程中,在每份绘制代码之中会有glBindbuffer、glEnableVertexAttribArray、glVertexAttribPointer。那么优化的方法来了,把这些都放到初始化时候完成吧!VAO记录该次绘制所需要的所有VBO所需信息,把它保存到VAO特定位置,绘制的时候直接在这个位置取信息绘制。
VAO的全名是Vertex Array Object,首先,它不是Buffer-Object,所以不用作存储数据;其次,它针对“顶点”而言,也就是说它跟“顶点的绘制”息息相关
和 顶点数组没有任何关系 VAO保存的是VBO的绘制状态。VAO将其对应的VBO的状态及信息直接存储在GPU的内存中,VAO中并没有VBO的相关属性数据只是存储了VBO的当前状态及索引信息通过VAO就能快速访问到VBO的状态及VBO的数据(VAO和VA(Vertex
Array 顶点数组)没有任何关系)VAO记录的是一次绘制中所需要的信息,这包括“数据在哪里glBindBuffer”、“数据的格式是怎么样的glVertexAttribPointer”、shader-attribute的location的启用glEnableVertexAttribArray。VAO可以理解为一个状态容器,记录VBO的状态。
使用VAO后GPU在绘制时就可以直接找到其记录的VBO的状态及对应的VBO的数据能实现快速绘制并且避免了数据的频繁操作从而提高性能。
使用VBO的步骤就不做解释了。
此处解释使用VAO的步骤:
1.产生VAO
2.绑定VAO
3.绑定VBO对应的VBO handle(VBO
数据句柄)(Bind Vertex Buffer Object)
4.启用shader中对应的属性信息使用glEnableVertexAttribArray函数启用(shader-attribute的location的启用)
默认所有这些顶点属性端口都是关闭的,因此需要打开这些(CPU到GPU)通信端口
5.指定了渲染时的顶点属性数组的数据格式和位置使用glVertexAttribPointer函数指定
6.绑定下一个VBO
7.VAO保存结束
示例:
//开始保存状态
glGenVertexArrays(1, &vaoHandle);
glBindVertexArray(vaoHandle);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);//绑定刚才分配的缓冲区到当前Context中
// Enable vertex position attribute GPU端,默认所有这些顶点属性端口都是关闭的,因此需要打开这些通信端口:
glEnableVertexAttribArray(positionAttribHandle);
// Send data to shader using queried attrib location
//---指定了渲染时索引值为 positionAttribHandle
的顶点属性数组的数据格式和位置
glVertexAttribPointer(positionAttribHandle, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glEnableVertexAttribArray(colorAttribHandle);
glVertexAttribPointer(colorAttribHandle, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),
(GLvoid *) (sizeof(float) * 3));
//保存结束 // Disable our Vertex Buffer Object
glBindVertexArray(0);
渲染时使用VAO渲染
// Bind our Vertex Array Object
glBindVertexArray(vaoHandle);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
参考文章http://blog.csdn.net/jeffasd/article/details/77878739
相关文章推荐
- 【OpenGL】游戏编程常用TGA图像格式详解以及加载纹理编程实现
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
- boost准模板库date迭代器(指针)使用以及常用的两个静态成员函数is_leap_year()和end_of_month_day()
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
- 详解WordPress开发中过滤属性以及Sql语句的函数使用
- MySQL存储过程和函数以及游标使用详解
- 2440中UART的使用以及相关函数详解
- Android实现圆角边框,shape的使用详解以及常用效果
- 图文详解CSS的position常用的三个属性:relative,absolute以及fixed,以及嵌套使用的一个常见情况
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
- iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组
- Git团队协作使用规范 以及一些常用命令详解
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
- Memcached常用命令以及使用说明详解