|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
An X Windows System OpenGL Program
The following program is an X Windows System OpenGL program with the same OpenGL code used in the AUXEDEMO.C sample program supplied with the Win32 SDK. Compare this program with the Win32 OpenGL program in the next section.
/* * Example of an X Windows System OpenGL program. * OpenGL code is taken from auxdemo.c in the Win32 SDK. */ #include #include #include #include #include #include #include
/* X globals, defines, and prototypes */ Display *dpy; Window glwin; static int attributes[] = {GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, None};
#define SWAPBUFFERS glXSwapBuffers(dpy, glwin) #define BLACK_INDEX 0
#define RED_INDEX 1 #define GREEN_INDEX 2 #define BLUE_INDEX 4 #define WIDTH 300 #define HEIGHT 200
/* OpenGL globals, defines, and prototypes */ GLfloat latitude, longitude, latinc, longinc; GLdouble radius;
#define GLOBE 1 #define CYLINDER 2 #define CONE 3
GLvoid resize(GLsizei, GLsizei); GLvoid initializeGL(GLsizei, GLsizei); GLvoid drawScene(GLvoid); void polarView( GLdouble, GLdouble, GLdouble, GLdouble);
static Bool WaitForMapNotify(Display *d, XEvent *e, char *arg) { if ((e->type == MapNotify) && (e->xmap.window == (Window)arg)) { return GL_TRUE; } return GL_FALSE; }
void main(int argc, char **argv) { XVisualInfo *vi; Colormap cmap; XSetWindowAttributes swa; GLXContext cx; XEvent event; GLboolean needRedraw = GL_FALSE, recalcModelView = GL_TRUE; int dummy;
dpy = XOpenDisplay(NULL);
if (dpy == NULL){ fprintf(stderr, "could not open display\n"); exit(1); }
if(!glXQueryExtension(dpy, &dummy, &dummy)){ fprintf(stderr, "could not open display"); exit(1); }
/* find an OpenGL-capable Color Index visual with depth buffer */ vi = glXChooseVisual(dpy, DefaultScreen(dpy), attributes); if (vi == NULL) { fprintf(stderr, "could not get visual\n"); exit(1); }
/* create an OpenGL rendering context */
cx = glXCreateContext(dpy, vi, None, GL_TRUE); if (cx == NULL) { fprintf(stderr, "could not create rendering context\n"); exit(1); }
/* create an X colormap since probably not using default visual */ cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone); swa.colormap = cmap; swa.border_pixel = 0; swa.event_mask = ExposureMask | KeyPressMask | StructureNotifyMask; glwin = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, WIDTH,
HEIGHT, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask, &swa); XSetStandardProperties(dpy, glwin, "xogl", "xogl", None, argv, argc, NULL);
glXMakeCurrent(dpy, glwin, cx);
XMapWindow(dpy, glwin); XIfEvent(dpy, &event, WaitForMapNotify, (char *)glwin); initializeGL(WIDTH, HEIGHT); resize(WIDTH, HEIGHT); /* Animation loop */ while (1) { KeySym key;
while (XPending(dpy)) { XNextEvent(dpy, &event); switch (event.type) { case KeyPress: XLookupString((XKeyEvent *)&event, NULL, 0, &key, NULL); switch (key) { case XK_Left: longinc += 0.5; break; case XK_Right: longinc -= 0.5; break; case XK_Up: latinc += 0.5; break; case XK_Down: latinc -= 0.5; break; } break; case ConfigureNotify:
resize(event.xconfigure.width, event.xconfigure.height); break; } } drawScene(); } }
/* OpenGL code */
GLvoid resize( GLsizei width, GLsizei height ) { GLfloat aspect;
glViewport( 0, 0, width, height );
aspect = (GLfloat) width / height;
glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 45.0, aspect, 3.0, 7.0 ); glMatrixMode( GL_MODELVIEW ); }
GLvoid createObjects() { GLUquadricObj *quadObj;
glNewList(GLOBE, GL_COMPILE); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_LINE); gluSphere (quadObj, 1.5, 16, 16); glEndList();
glNewList(CONE, GL_COMPILE); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder(quadObj, 0.3, 0.0, 0.6, 15, 10); glEndList();
glNewList(CYLINDER, GL_COMPILE); glPushMatrix ();
glRotatef ((GLfloat)90.0, (GLfloat)1.0, (GLfloat)0.0, (GLfloat)0.0); glTranslatef ((GLfloat)0.0, (GLfloat)0.0, (GLfloat)-1.0); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder (quadObj, 0.3, 0.3, 0.6, 12, 2); glPopMatrix (); glEndList(); }
GLvoid initializeGL(GLsizei width, GLsizei height) { GLfloat maxObjectSize, aspect; GLdouble near_plane, far_plane;
glClearIndex( (GLfloat)BLACK_INDEX); glClearDepth( 1.0 );
glEnable(GL_DEPTH_TEST);
glMatrixMode( GL_PROJECTION ); aspect = (GLfloat) width / height; gluPerspective( 45.0, aspect, 3.0, 7.0 ); glMatrixMode( GL_MODELVIEW );
near_plane = 3.0; far_plane = 7.0; maxObjectSize = 3.0F; radius = near_plane + maxObjectSize/2.0;
latitude = 0.0F; longitude = 0.0F; latinc = 6.0F; longinc = 2.5F;
createObjects();
}
void polarView(GLdouble radius, GLdouble twist, GLdouble latitude, GLdouble longitude) { glTranslated(0.0, 0.0, -radius); glRotated(-twist, 0.0, 0.0, 1.0); glRotated(-latitude, 1.0, 0.0, 0.0); glRotated(longitude, 0.0, 0.0, 1.0);
}
GLvoid drawScene(GLvoid) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
latitude += latinc; longitude += longinc;
polarView( radius, 0, latitude, longitude );
glIndexi(RED_INDEX); glCallList(CONE);
glIndexi(BLUE_INDEX); glCallList(GLOBE);
glIndexi(GREEN_INDEX); glPushMatrix(); glTranslatef(0.8F, -0.65F, 0.0F); glRotatef(30.0F, 1.0F, 0.5F, 1.0F); glCallList(CYLINDER); glPopMatrix();
glPopMatrix();
SWAPBUFFERS; }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Программа X Windows System OpenGL
Следующая программа является программой X Windows System OpenGL с тем же кодом OpenGL использованным в программе образца AUXEDEMO.C обеспеченным Win32 SDK. Сравните эту программу с программой Win32 OpenGL в следующей секции.
/* * Пример программы X Windows System OpenGL. * КОД OpenGL взят из auxdemo.c в Win32 SDK. */ #include #include #include #include #include #include #include
/* X Глобальные, определяет, и прототипы */ Показ *dpy; Окно glwin; статические int атрибуты[] = {GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, Ничто};
#define SWAPBUFFERS glXSwapBuffers(dpy, glwin) #define BLACK_INDEX 0
#define RED_INDEX 1 #define GREEN_INDEX 2 #define BLUE_INDEX 4 #define ШИРИНА 300 #define ВЫСОТА 200
/* OpenGL ГЛОБАЛЬНЫЕ, определяет, и прототипы */ широта GLfloat, долгота, latinc, longinc; РАДИУС GLdouble;
ЗЕМНОЙ шар #define 1 #define ЦИЛИНДР 2 #define КОНУС 3
GLvoid МЕНЯЕТ размеры(GLsizei, GLsizei); GLvoid initializeGL(GLsizei, GLsizei); GLvoid drawScene(GLvoid); аннулируйте polarView( GLdouble, GLdouble, GLdouble, GLdouble);
статический Bool WaitForMapNotify(Показ *d, XEvent *e, символ *арг.) { если ((e->type == MapNotify) && (e->xmap.window == (Window)arg)) { возврат GL_TRUE; } возвращайте GL_FALSE; }
пустота основа(int argc, символ **argv) { XVisualInfo *vi; Colormap cmap; swa XSetWindowAttributes; cx GLXContext; СЛУЧАЙ XEvent; GLboolean needRedraw = GL_FALSE, recalcModelView = GL_TRUE; int манекен;
dpy = XOpenDisplay(НЕДЕЙСТВИТЕЛЬНЫЙ);
если (dpy == НЕДЕЙСТВИТЕЛЬНЫЙ){ fprintf(stderr, "не могло открывать display\n"); выходить из(1); }
если(!glXQueryExtension(dpy, &манекен, &манекен)){ fprintf(stderr, "не могло открывать показ"); выходить из(1); }
/* найдите OpenGL-capable Цветной Индексный визуальный с глубинным буфером */ vi = glXChooseVisual(dpy, DefaultScreen(dpy), атрибуты); если (vi == НЕДЕЙСТВИТЕЛЬНЫЙ) { fprintf(stderr, "не могло получать visual\n"); выходить из(1); }
/* создайте OpenGL, предоставляющее контекст */
cx = glXCreateContext(dpy, vi, Ничто, GL_TRUE); если (cx == НЕДЕЙСТВИТЕЛЬНЫЙ) { fprintf(stderr, "не могло создавать предоставление context\n"); выходить из(1); }
/* создайте X colormap с вероятно не использование встроенное визуальное */ cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone); swa.colormap = cmap; swa.border_pixel = 0; swa.event_mask = ExposureMask | KeyPressMask | StructureNotifyMask; glwin = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, ШИРИНА,
ВЫСОТА, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask, &swa); XSetStandardProperties(dpy, glwin, "xogl", "xogl", НИЧТО, argv, argc, НЕДЕЙСТВИТЕЛЬНЫЙ);
glXMakeCurrent(dpy, glwin, cx);
XMapWindow(dpy, glwin); XIfEvent(dpy, &СЛУЧАЙ, WaitForMapNotify, (символ *)glwin); initializeGL(ШИРИНА, ВЫСОТА); поменяйте размеры(ШИРИНА, ВЫСОТА); /* Цикл Оживления */ пока (1) { ключ KeySym;
пока (XPending(dpy)) { XNextEvent(dpy, &случай); ключ (event.type) { случай KeyPress: XLookupString((XKeyEvent *)&СЛУЧАЙ, НЕДЕЙСТВИТЕЛЬНЫЙ, 0, &ключ, НЕДЕЙСТВИТЕЛЬНЫЙ); ключ (ключ) { случай XK_Left: longinc += 0.5; прерывание; случай XK_Right: longinc -= 0.5; прерывание; случай XK_Up: latinc += 0.5; прерывание; случай XK_Down: latinc -= 0.5; прерывание; } прерывание; случай ConfigureNotify:
поменяйте размеры(event.xconfigure.width, event.xconfigure.высота); прерывание; } } drawScene(); } }
/* КОД OpenGL */
GLvoid МЕНЯЕТ размеры( ширина GLsizei, высота GLsizei ) { АСПЕКТ GLfloat;
glViewport( 0, 0, Ширина, высота );
аспект = ширины / высоты (GLfloat);
glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 45.0, Аспект, 3.0, 7.0 ); glMatrixMode( GL_MODELVIEW ); }
GLvoid createObjects() { GLUquadricObj *quadObj;
glNewList(ЗЕМНОЙ шар, GL_COMPILE); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_LINE); gluSphere (quadObj, 1.5, 16, 16); glEndList();
glNewList(КОНУС, GL_COMPILE); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder(quadObj, 0.3, 0.0, 0.6, 15, 10); glEndList();
glNewList(ЦИЛИНДР, GL_COMPILE); glPushMatrix ();
glRotatef ((GLfloat)90.0, (GLfloat)1.0, (GLfloat)0.0, (GLfloat)0.0); glTranslatef ((GLfloat)0.0, (GLfloat)0.0, (GLfloat)-1.0); quadObj = gluNewQuadric (); gluQuadricDrawStyle (quadObj, GLU_FILL); gluQuadricNormals (quadObj, GLU_SMOOTH); gluCylinder (quadObj, 0.3, 0.3, 0.6, 12, 2); glPopMatrix (); glEndList(); }
GLvoid initializeGL(ШИРИНА GLsizei, высота GLsizei) { GLfloat maxObjectSize, АСПЕКТ; GLdouble near_plane, far_plane;
glClearIndex( (GLfloat)BLACK_INDEX); glClearDepth( 1.0 );
glEnable(GL_DEPTH_TEST);
glMatrixMode( GL_PROJECTION ); аспект = ширины / высоты (GLfloat); gluPerspective( 45.0, Аспект, 3.0, 7.0 ); glMatrixMode( GL_MODELVIEW );
near_plane = 3.0; far_plane = 7.0; maxObjectSize = 3.0F; радиус = near_plane + maxObjectSize/2.0;
широта = 0.0F; долгота = 0.0F; latinc = 6.0F; longinc = 2.5F;
createObjects();
}
пустота polarView(радиус GLdouble, искривление GLdouble, широта GLdouble, долгота GLdouble) { glTranslated(0.0, 0.0, -Радиус); glRotated(- Искривление, 0.0, 0.0, 1.0); glRotated(- Широта, 1.0, 0.0, 0.0); glRotated(Долгота, 0.0, 0.0, 1.0);
}
GLvoid drawScene(GLvoid) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
широта += latinc; долгота += longinc;
polarView( Радиус, 0, широта, долгота );
glIndexi(RED_INDEX); glCallList(КОНУС);
glIndexi(BLUE_INDEX); glCallList(ЗЕМНОЙ шар);
glIndexi(GREEN_INDEX); glPushMatrix(); glTranslatef(0.8F, -0.65F, 0.0F); glRotatef(30.0F, 1.0F, 0.5F, 1.0F); glCallList(ЦИЛИНДР); glPopMatrix();
glPopMatrix();
SWAPBUFFERS; }
| |
|
|
| |