看opengl写代码(6)glArrayElement,,glDrawElements和glDrawArrays

glArrayElement,,glDrawElements和glDrawArrays: 这三个 都是 使用 顶点 数组 绘制的 OpenGl函数。

glArrayElement 每次 只能 使用 一组 顶点数据,并且 必须 在 GLbegin 和 glend 之间 绘制。

glDrawElements 每次 可以 绘制 多组 顶点数据,顺序 可以 任意 存放,无  glBegin 和 glend 的限制。

glDrawArrays 每次 可以绘制 多组顶点数据,必须 从 起点 到 终点 按顺序 绘制,无 glBegin 和 glend 限制。


其实 还有 几个 使用 顶点数组 绘制的 函数 ,在我使用的 这个版本(opengl 3.3) 被删除了。

查看版本等信息:

   const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字
   const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台
   const GLubyte* OpenGLVersion =glGetString(GL_VERSION); //返回当前OpenGL实现的版本号
   const GLubyte* gluVersion= gluGetString(GLU_VERSION); //返回当前GLU工具库版本


介绍完了,直接上代码:

// vertexPointer.cpp : 定义控制台应用程序的入口点。
//使用顶点数组 进行 渲染
//

#include "stdafx.h"
#include <gl/glut.h>

void init(){
	glClearColor(0,0,0,0);
	//开启顶点,颜色数组
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnable(GL_COLOR_ARRAY);
}

//用 glArrayElement方式绘制
void useGlArrayElement(){
	static GLfloat vertexs[] = {
	-1,-1,0,
	-0.5,-0.5,0,
	-1,-0.5,0};
	static GLfloat colors[] = {
		1,0,0,
		0,1,0,
		0,0,1
	};
	//绑定顶点数组
	glVertexPointer(3,GL_FLOAT,0,vertexs);
	glColorPointer(3,GL_FLOAT,0,colors);
	//解引用 和 绘制
	glBegin(GL_TRIANGLES);
	glArrayElement(1);
	glArrayElement(0);
	glArrayElement(2);
	glEnd();
}

void useGlDrawElements(){
	static GLfloat vertexs[] = {
	-0.4,-1,0,
	-0.2,-1,0,
	-0.2,-0.5,0};
	static GLfloat colors[] = {
		1,0,0,
		0,1,0,
		0,0,1
	};
	//绑定顶点数组
	glVertexPointer(3,GL_FLOAT,0,vertexs);
	glColorPointer(3,GL_FLOAT,0,colors);
	//解引用 和 绘制
	GLubyte array[] = {0,1,2};
	//type 必须是 无符号整形: GL_BYTE -- > gl
	glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_BYTE,array);
}


//glDraw
void useGlDrawArrays(){
	static GLfloat vertexs[] = {
	0,0,0,
	0,0.5,0,
	0.3,0.4,0};
	static GLfloat colors[] = {
		1,0,0,
		0,1,0,
		0,0,1
	};
	//绑定顶点数组
	glVertexPointer(3,GL_FLOAT,0,vertexs);
	glColorPointer(3,GL_FLOAT,0,colors);
	//gldraw
	glDrawArrays(GL_TRIANGLES,0,3);
}

void display(){
	glClear(GL_COLOR_BUFFER_BIT);
	//gl
	useGlArrayElement();
	useGlDrawElements();
	useGlDrawArrays();
	glFlush();
}

//打印opengl信息
void printGlInfo(){
   const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字
   const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台
   const GLubyte* OpenGLVersion =glGetString(GL_VERSION); //返回当前OpenGL实现的版本号
   const GLubyte* gluVersion= gluGetString(GLU_VERSION); //返回当前GLU工具库版本
    printf("OpenGL实现厂商的名字:%s\n", name);
    printf("渲染器标识符:%s\n", biaoshifu);
    printf("OpenGL实现的版本号:%s\n",OpenGLVersion );
    printf("OGLU工具库版本:%s\n", gluVersion);
}

int _tmain(int argc, _TCHAR* argv[])
{
	glutInit(&argc,(char **)argv);
	glutInitWindowSize(500,500);
	glutInitWindowPosition(100,100);
	glutCreateWindow("vertexArray");
	printGlInfo();
	init();
	glutDisplayFunc(display);
	glutMainLoop();
	
	return 0;
}
运行截图:



阅读更多
个人分类: opengl
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭