产生原因: Opengl对几何图元的绘制需要大量的函数调用,每个函数调用都需要时间,为了减少这部分时间。减少图元绘制过程调用的函数 步骤: 1.激活 glEnableClientState(param) GL_VERTEX_ARRAY GL_COLOR_ARRAY GL_SECONDARY_COLOR_ARRAY GL_INDEX_ARRAY GL_NORMAL_ARRAY GL_FOG_COORDINATE_ARRAY GL_TEXTURE_COORD_ARRAY GL_EDGE_FLAG_ARRAY 2.指定数组的数据 glColorPointer glSecondaryColorPointer gl**Pointer 3.解引用单个数组元素 glArrayElement(index) |
void glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); size:每组颜色所占数组元素格式,(RGB每个分量各占1,因此size=3) type:每一个分量对应的数据类型 stride 跳跃值:当多个类型数据在同一个数组存储时,用跳跃值来区分。 比如pointer[]={r1,g1,b1,v1x,v1y,v1z,r2,g2,b2,v2x,v2y,v2z}用来存储颜色和顶点值 那么stride=6*sizeof(float) 因为pointer[0]是第1组颜色的起点pointer[2]第二组颜色的起点位置。 一般将不同类型的数据分别存储,那么这个值就是0 pointer :存储颜色数据的数组 |
void glArrayElement (GLint i); i:可以理解为图元的一点。 比如:glVertexPointer(3,GL_FLOAT,0,vertices); 当i=2是,对应的点为vertices[3]~vertices[5] |
解引用数组元素的一个列表 glDrawElements (GLenum mode, GLsizei *count, GLenum type, const GLvoid *indices); 相当于: glbegin(mode) for(i=0;i<count<i++) glArrayElement(indices[i]); glend(); |
解引用多个数组元素 glMultiDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,GLsizei primcount) 相当于: for(i=0;i<primcount;<i++) glDrawElements(mode,count[i],type,indices[i]) |
解引用一个数组元素序列 void glDrawArrays (GLenum mode, GLint first, GLsizei count); 相当于: glBegin(mode) for(i=0;i<count;<i++) {glArrayElement(first+i)} glEnd(); 解引用多个数组元素序列 glMultiDrawArrays(GLenum mode, GLint* first, GLsizei *count, GLsizei primcount); 相当于: for(i=0;i<primcount;<i++) {glDrawArrays(mode,first[i],count[i])} |
顶点数组对象 随着程序逐渐增大并且使用更多的模型,有时每个帧可能存在多个顶点数组的切换,比如在一帧有一个矩形 一个三角形,一个多边形,那么每次重绘时都需要解引用(glColorPointer),以更改其中的值。造成了大量函数调用。顶点数组对象可以解决这个问题,简单的说,顶点数组对象像是一个顶点数组集合,在集合1位置存储矩形顶点数组,集合2位置存储三角形顶点数组,集合3位置存储多边形顶点数组。那么每次绘制不同的图形时只需要从相应的位置取出即可 |
做法: 1.生成顶点数组对象 glGenVertexArrays(Glsizei n,Gluint *arrays) 在其中定义图元的详细信息 2.创建与绑定顶点数组对象 glBindVertexArray(Gluint array) 3.当使用时再次调用 glBindVertexArray(Gluint array) |
glDeleteVertexArrays(Glsizei n,Gluint *arrays) glIsVertexArrays(Gluint array) |
#include "header.h" GLuint texture[1]; # define DRAWQUAD #ifdef DRAWQUAD static GLfloat vertices[]={0,0,50,//0 100,0,50,//1 100,100,50,//2 0,100,50,//3 0,0,-50,//4 100,0,-50,//5 100,100,-50,//6 0,100,-50//7 }; static GLfloat colors[]={1.0,0.2,0.2, 0.2,0.2,1.0, 0.8,1.0,0.2, 0.75,0.75,0.75, 0.35,0.35,0.35, 0.5,0.5,0.5}; static GLfloat textCootr[]={ 0.0,0.0, //0 1.0,0.0, //1 1.0,1.0, //2 0.0,1.0, //3 0.0,1.0, //4 0.0,0.0, //5 1.0,0.0, //6 1.0,1.0 //7 }; #else static GLfloat vertices[]={25,25,0,100,325,0,175,25,0,175,325,0,250,25,0,325,325,0}; static GLfloat colors[]={1.0,0.2,0.2, 0.2,0.2,1.0, 0.8,1.0,0.2, 0.75,0.75,0.75, 0.35,0.35,0.35, 0.5,0.5,0.5,0.7,0.8,0.2,0.3,0.5,0.7}; #endif double quard=0.0; void setupVertices() { //glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3,GL_FLOAT,0,colors); glVertexPointer(3,GL_FLOAT,0,vertices); //glTexCoordPointer(2,GL_FLOAT,0,textCootr); } void init() { glClearColor(1.0,1.0,1.0,0.0); glViewport(0,0,600,480); glClearDepth(1.0f); // Depth Buffer Setup glEnable(GL_DEPTH_TEST); // Enables Depth Testing glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-300,300,-200,280,-100,100); glMatrixMode(GL_MODELVIEW); setupVertices(); } void rotate() { quard+=0.1; glutPostRedisplay(); } void mouse(int button,int state,int x,int y) { switch(button) { case GLUT_LEFT_BUTTON: if(GLUT_DOWN==state) { glutIdleFunc(rotate); }else { //glutIdleFunc(0); } } } static GLubyte front[]={3,2,1,0}; static GLubyte behind[]={7,6,5,4}; static GLubyte left[]={7,4,0,3}; static GLubyte right[]={6,5,1,2}; static GLubyte top[]={7,3,2,6}; static GLubyte bottom[]={0,4,5,1}; static GLubyte all[]={3,2,1,0,7,6,5,4,7,4,0,3,6,5,1,2,7,3,2,6,0,4,5,1}; void display(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glRotatef(quard,0,1,1); ; #ifdef DRAWQUAD // 方法1 /*glBegin(GL_QUADS); glArrayElement(3); glArrayElement(2); glArrayElement(1); glArrayElement(0); glArrayElement(7); glArrayElement(6); glArrayElement(5); glArrayElement(4); glArrayElement(6); glArrayElement(5); glArrayElement(1); glArrayElement(2); glArrayElement(7); glArrayElement(4); glArrayElement(0); glArrayElement(3); glArrayElement(7); glArrayElement(3); glArrayElement(2); glArrayElement(6); glArrayElement(0); glArrayElement(4); glArrayElement(5); glArrayElement(1); glEnd();*/ // 方法2 /*glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,front); glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,behind); glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,left); glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,right); glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,top); glDrawElements(GL_QUADS,4,GL_UNSIGNED_BYTE,bottom);*/ //方法3 glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,all); glTranslatef(-250,0,0); glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,all); #else glBegin(GL_TRIANGLES); glArrayElement(2); glArrayElement(3); glArrayElement(5); glEnd(); #endif glFlush(); glutSwapBuffers(); } int main(int argc,char ** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(600,480); glutInitWindowPosition(100,100); glutCreateWindow("顶点数组"); init(); glutDisplayFunc(display); glutMouseFunc(mouse); glutMainLoop(); return 0; }
相关推荐
OpenGL的顶点数组.doc 设和初学者学习使用
计算机图形学 OpenGL 实验七 顶点数组 拾取
在OpenGL中用顶点数组绘制3d立体图,
基于OpenGL索引顶点数组的大尺度海面LOD算法.pdf
描述在C#中如何调用opengl函数库。
2.6顶点数组 2.6.1步骤1:启用数组 2.6.2步骤2:指定数组的数据 2.6.3步骤3:解引用和渲染 2.7缓冲区对象 2.7.1创建缓冲区对象 2.7.2激活缓冲区对象 2.7.3用数据分配和初始化缓冲区对象 2.7.4更新缓冲区对象的数据值...
但最后绘制的时候,不是编写循环语句逐个的指定顶点了,而是通知OpenGL,”保存顶点的数组”和”保存顶点序号的数组”所在的位置,由OpenGL自动的找到顶点,并进行绘制。但是没有调gluLookAt和glRotatef,运行起来是...
RGB颜色立方体,使用OpenGL绘制轻松实现。通过顶点数组和颜色数组提高性能。另外还采用定时器产生动画,更加直观和有趣。对openGL的初学者很有帮助。
使用顶点数组指定的顶点数据存储在客户端内存中。 此数据必须从客户端内存复制到图形内存时 绘制调用,如glDrawArrays或glDrawElements。 和光栅化。” 然而,如果我们不这样做会好得多 在每个绘制调用上复制顶点...
本章在第六章(Opengl ES 1.x NDK实例开发之六:纹理贴图)的基础上绘制一个旋转的纹理立方体,原理和纹理贴图一样,需要注意的是定好正方体的顶点数组
其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 1.5又新增了“OpenGL ...
OpenGL渲染器 使用OpenGL和C ++制作的简单渲染器。...顶点数组抽象 顶点属性指针抽象 顶点缓冲区抽象 索引缓冲区抽象 学分 感谢The Cherno和learnopengl.com。 有两个主要资源帮助我了解了此存储库中的内容。 :D
opengl使用顶点数组画出球体,实现地球围绕太阳转动,左键加快地球围绕太阳的转速,右键减慢地球围绕太阳的转速
基于MFC的opengl绘图 利用顶点数组绘成圆球;简单的openGL应用,适合初学者学习;Application of openGL C++,MFC tec
使用openGLES3.0绘制渐变色的三角形,顶点数据,也称为顶点属性,指定逐顶点数据。 可以为每个顶点或常量值指定逐顶点数据 可用于所有顶点。 例如,如果你想画一三角形 它有一个...需要指定存储三个位置值的顶点数组。
顶点缓存数组(Vertex Buffer Object)的示例程序 VBO允许把顶点数据存储在GPU缓存中,并且只传输一次,前提是有足够的内存资源可以保存这些顶点数据。
《OpenGL游戏编程》一书分为两部分,首先是OpenGL的基础知识,内容...通过这本书,读者可以学到所有的基础知识,包括纹理贴图和顶点数组等一些非常重要的内容.完成了对本书的学习,你应该可以制作一些稍微复杂的游戏了。
OpenGL高级课题 显示列表和顶点数组 Alpha混合和反走样 雾化 反馈和选择 象素测试与操作 累积和模板缓冲器 纹理映射 OGRE中的纹理映射
各种新的缓冲区对象类型的示例,包括uniform缓冲区对象、变换反馈缓冲区和顶点数组对象。 使用纹理数组提高使用众多纹理的性能。 使用图元重启和条件渲染来高效地进行渲染。 介绍OpenGL的废弃机制,以及如何针对...