`
tiankefeng0520
  • 浏览: 145695 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习七:顶点数组

阅读更多

 

产生原因
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是一种广泛应用于二维与三维图形渲染的标准图形库。在OpenGL中,顶点数组是一种重要的技术手段,它可以帮助程序员更高效地管理和绘制复杂的几何形状。本文将...

    OpenGL 顶点数组+拾取

    2. 绑定顶点数组:使用`glBindVertexArray()`函数指定将要使用的顶点数组对象。 3. 配置顶点属性:通过`glVertexAttribPointer()`函数设置每个顶点属性(如位置、颜色等)的格式和数据来源。 4. 激活顶点属性:调用`...

    OpenGL中的顶点数组对象(VAO)深度解析与应用

    顶点数组对象(VAO),作为OpenGL中用于封装顶点属性配置的对象,起着至关重要的作用。本文将深入探讨VAO的工作原理、优势以及如何在OpenGL中有效使用VAO。 VAO是OpenGL中一个强大的工具,它通过封装顶点属性配置,...

    OpenGL-1.zip_opengl 顶点数组

    在OpenGL中用顶点数组绘制3d立体图,

    基于OpenGL索引顶点数组的大尺度海面LOD算法.pdf

    基于OpenGL索引顶点数组的大尺度海面LOD算法.pdf

    在C#中结合OpenGL索引顶点数组的海浪动态仿真

    ### 在C#中结合OpenGL索引顶点数组的海浪动态仿真 #### 一、引言与背景 在海洋科学研究中,海浪动态仿真成为了一种重要的可视化手段,用于直观展示和理解海浪的特性与行为。随着海洋科学的发展,仿真技术也在不断...

    OpenGL实验二:绘制钟表.zip

    5. **顶点数组与绘图命令**:钟表的表盘、指针等元素可以表示为一系列的顶点。通过`glBegin()`和`glEnd()`定义一个绘制命令,如`GL_LINES`(用于绘制线条,如刻度)和`GL_TRIANGLES`(用于填充形状,如表盘)。 6. ...

    Android OpenGL入门示例:绘制三角形和正方形

    定义一个顶点数组,包含三角形或正方形的坐标。使用`glGenBuffers()`创建缓冲区对象,然后用`glBindBuffer()`绑定它,接着调用`glBufferData()`将顶点数据传入缓冲区。这一步是数据上传到GPU的过程。 接着,设置...

    OpenGL源代码:oglwrapperclass_demo

    开发者可能在`TestGL`类中实现了OpenGL的基本绘图函数,如`glBegin`、`glEnd`、`glVertex`等,以及更现代的顶点数组和顶点缓冲对象。此外,`GLEnabledView`可能使用了OpenGL上下文和设备上下文(DC)来在窗口上创建...

    OpenGL游戏编程:3D三连棋源码..rar

    总之,OpenGL游戏编程:3D三连棋源码的学习涵盖了OpenGL图形编程、Delphi应用开发、3D几何、矩阵变换、纹理映射以及游戏逻辑等多个方面,是学习3D图形编程和游戏开发的实用案例。通过这个项目,开发者可以深入理解...

    (vc6.0)opengl小程序:clock

    OpenGL是计算机图形学中的一个强大的库,用于在各种操作系统上创建2D和3D图形。在本案例中,`(vc6.0)...此外,还可以探索更高级的OpenGL特性,如光照、纹理映射、顶点数组、着色器等,进一步提升你的OpenGL编程技能。

    openGL绘制RGB颜色模型

    总之,"openGL绘制RGB颜色模型"是一个很好的学习项目,它不仅涉及到颜色理论,还涵盖了OpenGL的基础知识,如顶点数组、颜色数组、着色器编程以及动画制作。对于初学者来说,这个项目可以帮助他们深入理解OpenGL的...

    openGL 函数手册

    本节将基于《OpenGL函数快速参考手册(2009)》提供的内容,对OpenGL 3.2 API的核心功能进行详细介绍,特别是与顶点数组相关的函数。 #### 三、顶点数组 顶点数据可以存储在客户端地址空间或服务器端地址空间中的...

    Opengl ES 1.x NDK实例开发之七:旋转的纹理立方体

    总结,"Opengl ES 1.x NDK实例开发之七:旋转的纹理立方体"涵盖了OpenGL ES的基本图形操作、纹理映射、顶点数组、矩阵变换以及NDK的原生渲染。这个实例对于理解3D图形编程和移动设备上的高性能图形处理至关重要。通过...

    OPENGL函数 最新速查

    ### OpenGL 4.00 API 快速参考指南:顶点数组部分 #### 一、概述 OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。OpenGL 4.00版本在图形处理方面提供了...

    现代OpenGL+Qt:绘制可旋转、带光照效果的三维物体

    这个过程涉及到的知识点广泛,包括OpenGL上下文管理、顶点数组、着色器编程、矩阵变换、光照模型以及Qt的事件处理机制。理解并熟练掌握这些,将能帮助开发者创建出更加复杂且引人入胜的图形应用。通过不断学习和实践...

    OpenGL详细教程 DELPHI 版

    绘制立方体是3D编程的经典例子,这章可能会包含构建3D物体的顶点数组,以及使用GL_QUADS或GL_TRIANGLES等模式来绘制复杂形状。 6. **OpenGL教程6:如何用图片进行纹理映射** 纹理映射是给3D物体添加真实感的重要...

    OpenGL编程指南.pdf

    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更新缓冲区对象的数据值...

Global site tag (gtag.js) - Google Analytics