OpenGL顶点数组
来源:互联网 发布:翻页相册制作软件 编辑:程序博客网 时间:2024/05/02 01:01
OpenGL中基本图形绘制方式比较(glBegin, glCallList, glVertexPointer, VBO)http://www.360doc.com/content/14/1028/10/19175681_420522404.shtml
绘制几何对象
1、指定几何对象:向OpenGL发送数据有三种方式:1、“一次一个顶点” glBegin(); 2、 顶点数组方式;3、显示列表方式。
2、逐个顶点操作:逐个但无论使用哪一种方式,最后结果都是将几何数据传输到OpenGL中的第一个处理阶段,即"顶点处理"。在这个阶段,顶点位置会通过模型矩阵和投影矩阵来转化,法线会通过从模型矩阵获得的左上角的3x3矩阵的逆变换来转化,纹理坐标会通过纹理矩阵来转化。因为在这个阶段中发生的最要的事情就是转换和光照,所以顶点处理阶段有时也叫做“转换和光照”。
3、图元组装:处理完顶点之后,与各个顶点相关联的全部属性就会得到完全的确定,顶点数据接着就会被发送到一个名为“图元组装”的阶段,在这个阶段顶点数据被结合成图元,如点、线、三角形、四边形和多边形。
4、图元处理:这个阶段第一个发生的步骤是裁剪,这个操作将各个图元与用户定义的裁剪平面(使用glClipPlane来设置)以及模型矩阵和投影矩阵建立的视景体来做比较。如果图元完全位于视景体以及用户定义的裁剪平面内部,则传递图元以进行后面的处理。如果在外部,则丢弃图元,无需再做进一步的处理。在这个阶段的另一个操作是透视投影,首先将各定点坐标x, y, z除以齐次坐标w,然后将由当前的视口变换来转换各个顶点,以生成窗口坐标。可以设置某些OpenGL状态,对图元执行“消隐操作”。使用计算好的窗口坐标来测试各个多边形图元,可以查看它是否远离当前的查看位置,调用glEnable启动消隐状态,调用glCullFace指定将要丢弃背面多边形、正面多边形还是二者都丢弃。
当我们人为的绘制形状时,首先想到是是坐标点,而不是api,如要绘制一条直线,首先将两个点的坐标存在一起,则更加容易理解,OpenGL的顶点数组就是这样的作用.
首先来回顾下之前画直线的函数
示例1
void drawOneLine(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2){ glBegin(GL_LINES); glVertex2f ((x1),(y1)); glVertex2f ((x2),(y2)); glEnd();}
需要调用两次glVertex2f ,并且输入两个顶点,现在我们来看另一种做法
将坐标存在一个数组中
示例2
void drawLineWithArray(){ GLint vertices[]={25,25, 100,100}; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2,GL_INT,0,vertices); glBegin(GL_LINES); glArrayElement(0); glArrayElement(1); glEnd();}
vertices记录了两个坐标(x1,y1)=(25,25),(x2,y2)=(100,100)
但是其索引值却是0,1,2,3.为了识别一个坐标点,需要一个函数将数组进行切分.
glVertexPointer则用于这个功能,可以称这种数组为混合数组,参数指定了顶点数组的配对点(如坐标定位为2个,颜色则为3个),数据类型及数组
注意:在使用顶点数组时,必须先调用glEnableClientState开启顶点数组功能,在不用的时候调用glDisableClientState来禁用
glArrayElement则根据顶点数组来调用相应的函数,每次只调用1个顶点
示例2和示例1的效果是相同,初看好像并没有变简单,反而变复杂了.
启用多个顶点数组
除了指定顶点的坐标数组外,还可以启动颜色,表面法线等其他顶点数组
下面以不同颜色画两条直线
示例3
void drawTwoLineWithArray(){ GLint vertices[]={25,25, 100,100, 120,120, 200,200}; GLfloat colors[]={1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0}; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(2,GL_INT,0,vertices); glColorPointer(3,GL_FLOAT,0,colors); glBegin(GL_LINES); glArrayElement(0); glArrayElement(1); glArrayElement(2); glArrayElement(3); glEnd();}
注意:每开启一种顶点数组都必须调用glEnableClientState来激活
效果如下
跨距
如上示例3,有一个坐标数组和颜色数组,如果将两个数组合并在一起,那么坐标和颜色的数据就在一个数组了,现在代码修改如下
示例4
GLfloat data[]= {1.0, 0.0, 0.0,25.0,25.0, 1.0, 0.0, 0.0,100.0,100.0, 0.0, 1.0, 0.0,120.0,120.0, 0.0, 1.0, 0.0,200.0,200.0};glEnableClientState(GL_VERTEX_ARRAY);glEnableClientState(GL_COLOR_ARRAY);glColorPointer(3,GL_FLOAT,5*sizeof(GLfloat),&data[0]);glVertexPointer(2,GL_FLOAT,5*sizeof(GLfloat),&data[3]);
第3个参数指定跨距,如颜色,从数组的每组数据的第1个开始取数据,然后跨5个,坐标顶点则从数据每组数据的第4个开始取数据并跨5个
注意:由于跨距需要计算数据类型,所以数组的数据类型需要相同
以上代码效果是相同的
解引用顶点数组列表
1.其提供了一个glDrawElements函数用于循环调用glArrayElement,但需要定义一个索引的数组
示例5
void drawTwoLineWithArray2(){ GLfloat data[]= {1.0, 0.0, 0.0,25.0,25.0, 1.0, 0.0, 0.0,100.0,100.0, 0.0, 1.0, 0.0,120.0,120.0, 0.0, 1.0, 0.0,200.0,200.0}; GLubyte index[]= {0,1,2,3} ; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3,GL_FLOAT,5*sizeof(GLfloat),&data[0]); glVertexPointer(2,GL_FLOAT,5*sizeof(GLfloat),&data[3]); glDrawElements(GL_LINES,4,GL_UNSIGNED_BYTE,index); }
2.从索引项开始
glDrawArrays(GL_LINES,0,4);
这个函数更加简单,直接从第0个开始访问4个元素
在顶点比较多的情况下,顶点数组应该是很有用的一个功能
混合数组
以下是最简化的操作
glInterleavedArrays函数将会根据参数,激活各种顶点数组,并存储顶点,如下
void drawTwoLineWithArray3(){ GLfloat data[]= {1.0, 0.0, 0.0,25.0,25.0,0.0, 1.0, 0.0, 0.0,100.0,100.0,0.0, 0.0, 1.0, 0.0,120.0,120.0,0.0, 0.0, 1.0, 0.0,200.0,200.0,0.0}; glInterleavedArrays(GL_C3F_V3F,0,data); glDrawArrays(GL_LINES,0,4); }
效果是相同的 现在去掉颜色的数组的话,代码如下
GLfloat data[]= {25.0,25.0, 100.0,100.0, 120.0,120.0, 200.0,200.0};glInterleavedArrays(GL_V2F,0,data);glDrawArrays(GL_LINES,0,4);上述代码可看性就比较高了
- openGL学习--顶点数组
- OpenGL顶点数组
- OpenGL顶点数组
- OpenGL顶点数组
- OpenGL顶点数组
- opengl顶点数组
- 顶点数组, glDrawArrays,glDrawElements - [OpenGL]
- OpenGL学习笔记:顶点数组
- OPENGL顶点数组, glDrawArrays,glDrawElements
- OpenGL学习七:顶点数组
- OPENGL顶点数组, glDrawArrays,glDrawElements
- opengl 顶点数组 学习笔记
- OpenGL 顶点数组的使用
- OpenGL笔记15 顶点数组
- OpenGL--顶点数组与缓冲区中使用顶点数组
- 4.OpenGL--顶点数组与缓冲区中使用顶点数组
- OpenGL ES中的顶点数组、顶点属性、缓冲区对象
- OpenGL ES中的顶点数组、顶点属性、缓冲区对象
- 个人Android学习前言
- 【BeiJing2011】【BZOJ2462】矩阵模板
- web前端学习笔记02
- XCODE6 提交至 App Store
- 初识Mybatis-Spring
- OpenGL顶点数组
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
- 路书
- MyEclipse8.5配置整合SSH框架 简单登录验证功能
- Yii2的urlmanager开启
- 有两个磁盘文件 A,B 各放一行字母,要求把两文件信息合并(按字母排序),输出到C 中
- Android中activity的两种启动方式
- Javascript基础(三)
- 车站