多个顶点属性使用一个类型的VBO & VAO的使用和操作
来源:互联网 发布:eia数据公布时间 编辑:程序博客网 时间:2024/06/14 09:26
各函数作用:
void glGenBuffers(GLsizei n, GLuint* buffers)
创建VBO并且返回VBO对象的ID。参数n:需要创建的缓存数量;参数buffers:用于存储单一ID或多个ID的GLuint变量或数组的地址。
void glBindBuffer(int target, int buffer)
绑定指定buffer的VBO并且指定类型target。同一时间只能绑定同一类型的VBO,只有当前被绑定的VBO才会被用户操作。绑定buffer为0的VBO,可以取消对所有同类型VBO的绑定。
void glBindBuffer(GLenum target, GLuint buffer)
target告诉VBO该缓存对象将保存顶点数组数据还是索引数组数据:GL_ARRAY_BUFFER或GL_ELEMENT_ARRAY。任何顶点属(顶点坐标、纹理坐标、法线与颜色分量)都使用GL_ARRAY_BUFFER。用于glDraw[Range]Elements()的索引数据需要使用GL_ELEMENT_ARRAY绑定。
void glEnableVertexAttribArray(GLuint index);
glVertexAttribPointer或VBO只是建立CPU和GPU之间的逻辑连接,从而实现了CPU数据上传至GPU。但是,数据在GPU端是否可见(着色器能否读取到数据),由是否启用了对应的属性决定,这就是glEnableVertexAttribArray的功能,允许顶点着色器读取GPU(服务器端)数据。glEnableVertexAttribArray可以在glVertexAttribPointer之前或之后调用,只要在绘图(glDraw*系列函数)前调用即可。
void glVertexAttribPointer(int indx, int size, int type, boolean normalized, int stride, int offset)
将VBO中的数据传递给顶点数组。offset指定该属性在VBO中起始位置的偏移量,单位为byte
生成VAOID,VAO定位是state-object(状态对象,记录存储状态信息)。记录一次绘制中需要信息,包括”数据在哪里-
glBindBuffer(GL_ARRAY_BUFFER)“、”数据的格式是怎样的-glVertexAttribPointer“(顶点位置的数据在哪里,顶点位置的数据的格式是怎样的/纹理坐标的数据在哪里,纹理坐标的数据的格式是怎样的....视乎你让它关联多少个VBO、VBO里有多少种数据)
void glBindVertexArray(GLuint array);
绑定VAO,即为开始记录存储状态信息。如果参数为0,则结束记录存储状态信息。
现在,我要用多个ID绑定同一类型的GL_ARRAY_BUFFER。我为vboPos,vboColor生成两个VBO;为vboId生成一个VBO。前两者指定一个顶点的位置和颜色,后者则制定顶点绘制的索引(四边形就是0,1,2,3)。
如果调换以上设置两个属性的glBindBuffer,glVertexAttribPointer的顺序,无法绘图。
void glGenBuffers(GLsizei n, GLuint* buffers)
创建VBO并且返回VBO对象的ID。参数n:需要创建的缓存数量;参数buffers:用于存储单一ID或多个ID的GLuint变量或数组的地址。
void glBindBuffer(int target, int buffer)
绑定指定buffer的VBO并且指定类型target。同一时间只能绑定同一类型的VBO,只有当前被绑定的VBO才会被用户操作。绑定buffer为0的VBO,可以取消对所有同类型VBO的绑定。
void glBindBuffer(GLenum target, GLuint buffer)
target告诉VBO该缓存对象将保存顶点数组数据还是索引数组数据:GL_ARRAY_BUFFER或GL_ELEMENT_ARRAY。任何顶点属(顶点坐标、纹理坐标、法线与颜色分量)都使用GL_ARRAY_BUFFER。用于glDraw[Range]Elements()的索引数据需要使用GL_ELEMENT_ARRAY绑定。
void glEnableVertexAttribArray(GLuint index);
glVertexAttribPointer或VBO只是建立CPU和GPU之间的逻辑连接,从而实现了CPU数据上传至GPU。但是,数据在GPU端是否可见(着色器能否读取到数据),由是否启用了对应的属性决定,这就是glEnableVertexAttribArray的功能,允许顶点着色器读取GPU(服务器端)数据。glEnableVertexAttribArray可以在glVertexAttribPointer之前或之后调用,只要在绘图(glDraw*系列函数)前调用即可。
void glVertexAttribPointer(int indx, int size, int type, boolean normalized, int stride, int offset)
将VBO中的数据传递给顶点数组。offset指定该属性在VBO中起始位置的偏移量,单位为byte
===================================================================================================
VAO定位是state-object(状态对象,记录存储状态信息)
记录的是一次绘制中做需要的信息,这包括”数据在哪里-glBindBuffer(GL_ARRAY_BUFFER)“、”数据的格式是怎样的-glVertexAttribPointer“(顶点位置的数据在哪里,顶点位置的数据的格式是怎样的/纹理坐标的数据在哪里,纹理坐标的数据的格式是怎样的....视乎你让它关联多少个VBO、VBO里有多少种数据)
生成VAOID,VAO定位是state-object(状态对象,记录存储状态信息)。记录一次绘制中需要信息,包括”数据在哪里-
glBindBuffer(GL_ARRAY_BUFFER)“、”数据的格式是怎样的-glVertexAttribPointer“(顶点位置的数据在哪里,顶点位置的数据的格式是怎样的/纹理坐标的数据在哪里,纹理坐标的数据的格式是怎样的....视乎你让它关联多少个VBO、VBO里有多少种数据)
void glBindVertexArray(GLuint array);
绑定VAO,即为开始记录存储状态信息。如果参数为0,则结束记录存储状态信息。
现在,我要用多个ID绑定同一类型的GL_ARRAY_BUFFER。我为vboPos,vboColor生成两个VBO;为vboId生成一个VBO。前两者指定一个顶点的位置和颜色,后者则制定顶点绘制的索引(四边形就是0,1,2,3)。
但是,同一时刻只能指定一种类型的VBO。因此,按照以下步骤分别上传顶点的位置属性和颜色属性:
glGenVertexArrays ( 1, &userData->vaoId ); glBindVertexArray ( userData->vaoId );============================================================ glBindBuffer ( GL_ARRAY_BUFFER, userData->vboPos ); glEnableVertexAttribArray ( VERTEX_POS_INDX ); glVertexAttribPointer ( VERTEX_POS_INDX, VERTEX_POS_SIZE, GL_FLOAT, GL_FALSE, VERTEX_POS_STRIDE, 0 );------------------------------------------------------------ glBindBuffer ( GL_ARRAY_BUFFER, userData->vboColor ); glEnableVertexAttribArray ( VERTEX_COLOR_INDX ); glVertexAttribPointer ( VERTEX_COLOR_INDX, VERTEX_COLOR_SIZE, GL_FLOAT, GL_FALSE, VERTEX_COLOR_STRIDE, 0 );------------------------------------------------------------ glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER, userData->vboId );============================================================glBindVertexArray ( 0 );
如果调换以上设置两个属性的glBindBuffer,glVertexAttribPointer的顺序,无法绘图。
之后绘制图元:
glBindVertexArray ( userData->vaoId );============================================================ glDrawElements ( GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, ( const void * ) 0 );============================================================ glBindVertexArray ( 0 );
阅读全文
1 0
- 多个顶点属性使用一个类型的VBO & VAO的使用和操作
- OpenGL进阶(九) - GLSL中VAO和VBO的使用
- OpenGL进阶(九) - GLSL中VAO和VBO的使用
- OpenGL中的VBO与VAO的使用
- OpenGL中常用函数详解和VBO VAO详解以及VAO的使用
- OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
- 顶点缓冲区VBO和索引缓冲区IBO的结合使用
- 2017.08.05 vao和vbo使用
- 《GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形》的正确版本及源代码
- OpenGL——VAO,VBO,EBO等对象的使用
- OpenGL VBO顶点缓冲的使用
- OpenGL VBO顶点缓冲的使用
- OpenGL VBO顶点缓冲的使用
- OpenGL VBO顶点缓冲的使用
- OpenGL VBO顶点缓冲的使用
- 使用VAO VBO绘制图形
- 使用VBO:顶点缓存
- OpenGL VBO顶点缓冲的使用(转)
- 解决 AttributeError: 'module' object has no attribute 'convolution'
- HEVC代码学习35:xEncodeCU函数
- php获取微信订阅号的文章图片
- 面向对象的概念
- 编译原理之FIRST集FOLLOW集
- 多个顶点属性使用一个类型的VBO & VAO的使用和操作
- gcc编译选项
- Prism MVVM实例
- after,before兼容性问题
- 句子反转getline find
- DH密钥交换方案以及Elgamal加密方案原理
- 阿里&百度&腾讯&facebook&Microsoft&Google开源项目汇总
- MAC下使用Charles抓取genymotion安卓模拟器中的数据
- CDH5 安装