glBindBuffer
来源:互联网 发布:js的封装继承多态 编辑:程序博客网 时间:2024/06/04 17:55
对自己也相当于是做个笔记。openGL API 并不多,常用的也就那么几个,有些API是需要搭配使用的。
最经典的搭配莫过于glBegin .. glEnd了。下面是我整理的几个API搭配。
1) glBindBuffer + glVertexPointer+ glEnableClientState 的用法。
glBegin .. glEnd已经是不推荐使用的方法。目前强烈推荐的是 glBufferData 搭配 glVertexPointer ,
glVertexAttribPointer 同系列函数的用法。
原因是:利用glBindBuffer和glBufferData把vertex,color等数据 copy到server端的内存,然后glVertexPointer
指向server端的内存地址。rendering 的时候能够提高性能。
示例如下:
typedef struct _TexVertex
{
float u1, v1;
float u2,v2;
unsigned char r, g, b, a;
float x, y, z;
}TexVertex;
glBindBuffer(GL_ARRAY_BUFFER, gl_buffer_id); --事先生成的buffer id。
glBufferData(GL_ARRAY_BUFFER, sizeof(TexVertex) * 4(实际顶点个数),
(char *)m_vertex, GL_DYNAMIC_DRAW);
glVertexPointer( 3, GL_FLOAT, sizeof(TexVertex), (char *)offsetof(TexVertex, x));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(TexVertex), (char *)offsetof(TexVertex, r));
.... 其它同系列函数
glTexCoordPointer( 2, GL_FLOAT, sizeof(TexVertex), (char *)offsetof(TexVertex, u1));
glClientActiveTexture(GL_TEXTURE1);
glTexCoordPointer( 2, GL_FLOAT, sizeof(TexVertex), (char *)offsetof(TexVertex, u2));
..
glClientActiveTexture(GL_TEXTUREn);
glTexCoordPointer( 2, GL_FLOAT, sizeof(TexVertex), (char *)offsetof(TexVertex, un));
..
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
.... 其它同理
glClientActiveTexture(GL_TEXTURE0); ---多材质(纹理)的情况下,需要使用该函数,如果只有一个纹理,
则可以省略。
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture(GL_TEXTURE1);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
.... 其它同理
glDrawArrays(GL_QUADS, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY); ---根据需要不一定非要disable掉。
如果,有多个线程使用上述API的话,可能还有使用下面这对 API
glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
glPopClientAttrib();
2) glBindBuffer + glEnableVertexAttribArray + glVertexAttribPointer
glBindAttribLocation --- 绑定义自定义的属性名字到一个index.
..
glBindBuffer(GL_ARRAY_BUFFER, gl_buffer_id); --事先生成的buffer id。
glBufferData(GL_ARRAY_BUFFER, sizeof(TexVertex) * 4(实际顶点个数),
(char *)m_vertex, GL_DYNAMIC_DRAW);
glEnableVertexAttribArray(GLUT_ATTRIBUTE_VERTEX);
glVertexAttribPointer(GLUT_ATTRIBUTE_VERTEX, 3, GL_FLOAT, GL_FALSE, sizeof(TexVertex), (char *)offsetof(TexVertex, x));
...... 其它同系列函数
glDisableVertexAttribArray(GLUT_ATTRIBUTE_VERTEX);
...... 其它
- glBindBuffer
- OpenGL API - glBindBuffer
- OPENGL之GLBindBuffer
- glBindBuffer,glBufferData,glBufferSubData
- API翻译:glBindBuffer
- GL_PIXEL_PACK_BUFFER,glBindBuffer的参数详解
- 《高效学习OpenGL》之缓冲区对象 glGenBuffers(), glBindBuffer(), glBufferData(),glMapBuffer()
- 多个glBindBuffer和glDrawXXX 需要glBindVertexArray VAO指定
- Action bar实现
- 如何使用Google日志库(glog)
- 关系型数据库和NoSQL数据库
- Android网络编程
- MapReduce Design Patterns-chapter 5
- glBindBuffer
- python sqlite 查询表的字段名 列名
- 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)
- 所有博客的第一篇都是“关于我”?
- C++开源库
- 构造函数和实例化
- MFC ListControl用法总结
- 基于TCP协议的网络程序(基础学习)
- 网络连接服务故障排查技巧