OpenGL顶点数组
2015-06-19 13:13
369 查看
OpenGL中,如果要绘制图元,一般来说会使用:
但是,如果顶点数太多,这种方法需要频繁调用函数,效率太低。这就要用到顶点数组。
启用和关闭顶点数组的代码如下:
其中,GL_VERTEX_ARRAY是数组的类型,共有八种:
GL_VERTEX_ARRAY
GL_COLOR_ARRAY
GL_SECOND_COLOR_ARRAY
GL_INDEX_ARRAY
GL_NORMAL_ARRAY
GL_FOG_COORDINATE_ARRAY
GL_TEXTURE_COORD_ARRAY
GL_FLAG_ARRAY
**void glVertexPointer( GLint size,
GLenum type,
GLsizei stride,
const GLvoid* pointer);**
参数:
size - 每个顶点的坐标数目,必须是2,3,或4。
type - 顶点坐标的数据类型,GL_SHORT, GL_INT, GL_FLOAT 或 GL_DOUBLE
stride - 两个相邻顶点之间的偏移量,单位为字节,如果为0,表面顶点是紧密存储的。
pointer - 数组中第一项的第一个坐标的内存地址。
此外,还有 glColorPointer、glIndexPointer等,用于指定别的数组。
使用方法如下:
void glArrayElement( GLint i);
通过索引数组指定顶点,放在glBegin()和glEnd()之间。例如:
void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);
mode - 图元类型,例如 GL_POINTS、GL_LINES
count - 元素个数,索引数组存在indices中
type - 索引数组的数据类型,必须是GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, 或 GL_UNSIGNED_INT
indices - 索引数组
使用方法例如:
void glDrawArrays( GLenum mode, GLint first, GLsizei count);
对每个被启用的数组(顶点数组,颜色数组,索引数组),绘制从first到first+count-1的元素。类型为mode,例如GL_POINTS。
glBegin(GL_LINES); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(1.0f, 0.0f, 0.0f); glEnd();
但是,如果顶点数太多,这种方法需要频繁调用函数,效率太低。这就要用到顶点数组。
1. 启用顶点数组
OpenGL是一种状态机,在用某一功能前,必须先开启这项功能,用完之后,也可以关闭。启用和关闭顶点数组的代码如下:
glEnableClientState(GL_VERTEX_ARRAY); //启用 glDisableClientState(GL_VERTEX_ARRAY); //关闭
其中,GL_VERTEX_ARRAY是数组的类型,共有八种:
GL_VERTEX_ARRAY
GL_COLOR_ARRAY
GL_SECOND_COLOR_ARRAY
GL_INDEX_ARRAY
GL_NORMAL_ARRAY
GL_FOG_COORDINATE_ARRAY
GL_TEXTURE_COORD_ARRAY
GL_FLAG_ARRAY
2. 指定数组
启用了顶点数组后,接下来要指定:哪一个数组是顶点数组。函数如下:**void glVertexPointer( GLint size,
GLenum type,
GLsizei stride,
const GLvoid* pointer);**
参数:
size - 每个顶点的坐标数目,必须是2,3,或4。
type - 顶点坐标的数据类型,GL_SHORT, GL_INT, GL_FLOAT 或 GL_DOUBLE
stride - 两个相邻顶点之间的偏移量,单位为字节,如果为0,表面顶点是紧密存储的。
pointer - 数组中第一项的第一个坐标的内存地址。
此外,还有 glColorPointer、glIndexPointer等,用于指定别的数组。
使用方法如下:
GLfloat vertexs[] = {0.0f, 0.0f, 0.0f, 0.2f, 0.0f, 0.0f, -0.2f, 0.0f, 0.0f, 0.0f, 0.2f, 0.0f, 0.0f, -0.2f, 0.0f, 0.0f, 0.0f, 0.2f, 0.0f, 0.0f, -0.2f}; GLubyte indexs[] = {0,1,2,3,4,5,6}; glEnableClientState(GL_VERTEX_ARRAY); //启用顶点数组 glEnableClientState(GL_INDEX_ARRAY); //启用索引数组 glVertexPointer(3,GL_FLOAT,0,vertexs); //指定顶点数组 glIndexPointer(GL_UNSIGNED_BYTE,0,indexs); //指定索引数组
3. 绘图
有三个函数用于绘图。void glArrayElement( GLint i);
通过索引数组指定顶点,放在glBegin()和glEnd()之间。例如:
glBegin(GL_POINTS); glArrayElement(indexs[0]); glArrayElement(indexs[1]); glEnd();
void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);
mode - 图元类型,例如 GL_POINTS、GL_LINES
count - 元素个数,索引数组存在indices中
type - 索引数组的数据类型,必须是GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, 或 GL_UNSIGNED_INT
indices - 索引数组
使用方法例如:
glDrawElements(GL_POINTS,7,GL_UNSIGNED_BYTE,indexs);
void glDrawArrays( GLenum mode, GLint first, GLsizei count);
对每个被启用的数组(顶点数组,颜色数组,索引数组),绘制从first到first+count-1的元素。类型为mode,例如GL_POINTS。
glDrawArrays(GL_POINTS,0,7);
相关文章推荐
- 技术演绎之 [ hadoop] 起源
- tomcat共享lib里面的jar包
- new operator /operator new 和placement new
- Event-driven architecture(事件驱动架构)
- (7.2.7)Apache Lucene初探
- Shell脚本实现判断IP地址是否在一个ip段内代码分享
- tomcat绿色版及安装版修改内存大小的方法
- Gopher(二分图最大匹配)
- 上传文件到linux - ubuntu
- (centos)安装latex及使用技巧说明
- Linux磁盘分区
- opencms忘记Admin用户登录密码解决方案
- Apache Hama安装部署
- opencms忘记Admin用户登录密码解决方案
- hdu 1057 (simulation, use sentinel to avoid boudary testing, use swap trick to avoid extra copy.)
- (转载)copy,对象自定义copy 什么是property
- linux 命令——52 ifconfig(转)
- 2015-6-19-CentOS-6.5下搭建自己的Git服务器
- 成绩查询系统--发布篇--centOS7 tomcat开机启动 + mysql数据库配置
- centos6.6安装后系统配置