OpenGL 顶点数组的使用
2015-08-17 08:29
477 查看
#include<GL/glut.h>
#include<stdlib.h>
#include<stdio.h>
#ifdefGL_VERSION_1_1
#definePOINTER1
#defineINTERLEAVED2
#defineDRAWARRAY1
#defineARRAYELEMENT2
#defineDRAWELEMENTS3
intsetupMethod=POINTER;
intderefMethod=DRAWARRAY;
voidsetupPointers(void)
{
//definevertices
staticGLintvertices[]={25,25,
100,325,
175,25,
175,325,
250,25,
325,325};
//definecolors
staticGLfloatcolors[]={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};
//enableanddisablearraysrespectively
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
//setthearrayofvertex
glVertexPointer(2,GL_INT,0,vertices);
//setthearrayofcolors
glColorPointer(3,GL_FLOAT,0,colors);
}
voidsetupInterleave(void)
{
staticGLfloatintertwined[]=
{1.0,0.2,1.0,100.0,100.0,0.0,
1.0,0.2,0.2,0.0,200.0,0.0,
1.0,1.0,0.2,100.0,300.0,0.0,
0.2,1.0,0.2,200.0,300.0,0.0,
0.2,1.0,1.0,300.0,200.0,0.0,
0.2,0.2,1.0,200.0,100.0,0.0};
//Specifyafewvertexarrayatthesametime
glInterleavedArrays(GL_C3F_V3F,0,intertwined);
}
voidinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_SMOOTH);
setupPointers();
}
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
if(derefMethod==DRAWARRAY)
glDrawArrays(GL_TRIANGLES,0,6);
elseif(derefMethod==ARRAYELEMENT){
glBegin(GL_TRIANGLES);
glArrayElement(2);
glArrayElement(3);
glArrayElement(5);
glEnd();
}
elseif(derefMethod==DRAWELEMENTS){
GLuintindices[4]={0,1,3,4};
glDrawElements(GL_POLYGON,4,GL_UNSIGNED_INT,indices);
}
glFlush();
}
voidreshape(intw,inth)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);
}
voidmouse(intbutton,intstate,intx,inty)
{
switch(button){
caseGLUT_LEFT_BUTTON:
if(state==GLUT_DOWN){
if(setupMethod==POINTER){
setupMethod=INTERLEAVED;
setupInterleave();
}
elseif(setupMethod==INTERLEAVED){
setupMethod=POINTER;
setupPointers();
}
glutPostRedisplay();
}
break;
caseGLUT_MIDDLE_BUTTON:
caseGLUT_RIGHT_BUTTON:
if(state==GLUT_DOWN){
if(derefMethod==DRAWARRAY)
derefMethod=ARRAYELEMENT;
elseif(derefMethod==ARRAYELEMENT)
derefMethod=DRAWELEMENTS;
elseif(derefMethod==DRAWELEMENTS)
derefMethod=DRAWARRAY;
glutPostRedisplay();
}
break;
default:
break;
}
}
voidkeyboard(unsignedcharkey,intx,inty)
{
switch(key){
case27:
exit(0);
break;
}
}
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(350,350);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutKeyboardFunc(keyboard);
glutMainLoop();
return0;
}
#else
intmain(intargc,char**argv)
{
fprintf(stderr,"ThisprogramdemonstratesafeaturewhichisnotinOpenGLVersion1.0.\n");
fprintf(stderr,"IfyourimplementationofOpenGLVersion1.0hastherightextensions,\n");
fprintf(stderr,"youmaybeabletomodifythisprogramtomakeitrun.\n");
return0;
}#endif
glEnableClientState(GL_VERTEX_ARRAY);//启用顶点数组
glEnableClientState(GL_COLOR_ARRAY);//启用颜色数组
glVertexPointer(2,GL_INT,0,vertices);//指定顶点数组
glColorPointer(3,GL_FLOAT,0,colors);//指定颜色数组
glInterleavedArrays(GL_C3F_V3F,0,intertwined);//颜色,顶点会存到一个数组中,数组混用。
glDrawArrays(GL_TRIANGLES,0,6);//顶点数组方式绘制
glArrayElement(2);//指定顶点数组元素方式绘制
glDrawElements();//顶点数组索引方式绘制
相关文章推荐
- 解决问题E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录
- 如何获取网站Icon
- apache24设置虚拟目录 (windows)
- Docker镜像内有啥,存哪?
- BZOJ2217 : [Poi2011]Lollipop
- 中国最大的25个网站采用技术选型方案
- 中国最大的25个网站采用技术选型方案
- PXE安装Centos 6.6 x86-64 basic server
- 【Open】fans-rt 0.11 重要需求和遗留问题跟踪
- Hello Triangle:OpenGL ES 2.0 版的“Hello world”
- 用 Python 脚本实现对 Linux 服务器的监控
- 用 Python 脚本实现对 Linux 服务器的监控
- 浅谈图片服务器的架构演进
- 浅谈图片服务器的架构演进
- Controlling GPIO from Linux User Space
- linux启动后自动执行某个脚本
- [UVA 10801]Lift Hopping[Dijkstra][建图]
- Linux学习笔记:系统启动引导过程
- Git学习(一)
- Linux内核驱动之GPIO子系统-GPIO的使用