您的位置:首页 > 运维架构

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//相关API含义
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();//顶点数组索引方式绘制

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: