Opengl на прикладах

базові поняття

Для початку зробимо кілька визначень. Візуалізація - це процес. за допомогою яких комп'ютер створює образи об'єктів. Об'єкти складаються з геометричних примітивів - точок. ліній. полігонів. які визначаються за допомогою вершин. Піксель - елементарний найменший видимий елемент дисплея. Інформація про пікселах зберігається в пам'яті у формі bitplane - областей. де на кожен піксель відводиться по 1 біту. Bitplanes організовані в framebuffer. Розглянемо простий приклад - як намалювати білий прямокутник на чорному тлі:
main () glClearColor (0.0, 0.0, 0.0, 0.0);
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
glOrtho (0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
glBegin (GL_POLYGON);
glVertex3f (0.25, 0.25, 0.0);
glVertex3f (0.75, 0.25, 0.0);
glVertex3f (0.75, 0.75, 0.0);
glVertex3f (0.25, 0.75, 0.0);
glEnd ();
glFlush ();
>
glClearColor () встановлює чорний колір фону. glClear () очищає фон. Надалі. всякий раз. коли glClear () буде викликатися. вона буде очищати вікно в чорний колір. glColor3f () встановлює колір промальовування - білий колір. glOrtho () визначає координатну систему. glBegin () і glEnd () визначають об'єкт. який буде промальований. glVertex3f () визначає вершини полігону. в якості параметрів - 3 координати x, y, z. glFlush () гарантує нам. що промальовування полігону буде виконана негайно. Всі команди OpenGL починаються із префікса gl. всі константи також починаються із префікса GL_. Наприклад. в команді glColor3f () цифра 3 говорить про те. що координат 3. а префікс 'f' говорить про те. що аргумент має тип floating-point. Взагалі. в OpenGL є 8 АГАЛЬНІ типів Data Type. 1. 8-bit integer 2. 16-bit integer 3. 32-bit integer 4. 32-bit floating-point 5. 64-bit floating-point 6. 8-bit unsigned integer 7. 16-bit unsigned integer 8. 32-bit unsigned integer Так. 2 команди glVertex2i (1, 3) і glVertex2f (1.0, 3.0) фактично еквівалентні. хоч і мають різні типи. Деякі команди імєєют останнім символом 'v'. що вказує на вектор. Наприклад. glColor3f (1.0, 0.0, 0.0); GLfloat color_array [] =; glColor3fv (color_array); Тут визначаємо масив і даємо векторний покажчик на нього. Доступ до цього масиву визначається за допомогою часто вживається команди GLvoid (). Як тільки ми встановили колір за допомогою glColor3f (). всі наступні об'єкти будуть виводитися саме встановленим кольором. поки ми його не змінимо знову. До числа базових понять відносяться current viewing. projection transformations, line. polygon stipple patterns, polygon drawing modes, pixel-packing conventions, positions і characteristics lights, material properties. Доступ до змінних можна здійснити за допомогою glEnable () або glDisable (). Функції glGetBooleanv (), glGetDoublev (), glGetFloatv (), glGetIntegerv (), glGetPointerv (), glIsEnabled () - встановлюють тип даних. glPushAttrib () і glPushClientAttrib () пишуть в стек. glPopAttrib () і glPopClientAttrib () відновлюють. OpenGL дуже чітко організований в сенсі черговості виконання операцій. GLUT Як правило. все OpenGL-исходники мають в заголовку 2 Хідер. #include #include При використанні GLUT також вказується. У бібліотеку GLUT вбудований інтерфейс взаємодії з операційною системою на рівні API. GLUT рекомендований на початковому етапі вивчення OpenGL. Window Management. · GlutInit (int * argc, char ** argv) - найперша команда ініціалізації · glutInitDisplayMode (unsigned int mode) - встановлює колірну модель - RGBA або color-index. Наприклад. glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) - встановлює подвійний буфер. колірну модель RGB. · GlutInitWindowPosition (int x, int y) - встановимо початок координат вікна · glutInitWindowSize (int width, int size) - розмір вікна · int glutCreateWindow (char * string) - створює вікно - glutDisplayFunc () - викликається щоразу при перемальовуванні вікна. - glutMainLoop (void) - ця функція викликається після всіх інших. Невеликий приклад. #include
#include

void display (void)
<
/ * Стираємо * /
glClear (GL_COLOR_BUFFER_BIT);

/ * Малюємо білий прямокутник
* (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)
* /
glColor3f (1.0, 1.0, 1.0);
glBegin (GL_POLYGON);
glVertex3f (0.25, 0.25, 0.0);
glVertex3f (0.75, 0.25, 0.0);
glVertex3f (0.75, 0.75, 0.0);
glVertex3f (0.25, 0.75, 0.0);
glEnd ();

void init (void)
<
/ * Встановимо чорний фон * /
glClearColor (0.0, 0.0, 0.0, 0.0);

/ * Ініціалізація viewing values ​​* /
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho (0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
>

/ *
Визначимо параметри вікна. display mode
* (Single buffer and RGBA). Відкриємо вікно з фразою "hello"
* В title bar.
* /
int main (int argc, char ** argv)
<
glutInit (argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow ( "hello");
init ();
glutDisplayFunc (display);
glutMainLoop ();
return 0; / * ISO C requires main to return int. * /
>

У GLUT вбудована промальовування 3-мірних об'єктів. cone icosahedron teapot Cube octahedron tetrahedron Dodecahedron sphere torus Наступний приклад показує роботу команди glutSwapBuffers (). робить свопинг буферу. Є 2 буферу. і поки на екран не виводиться повністю один з них. другий залишається повністю за кадром. і не відбудеться накладення одного на інший. Double-Buffered Program: double.c #include
#include
#include
#include

static GLfloat spin = 0,0;

void init (void)
<
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
>

void display (void)
<
glClear (GL_COLOR_BUFFER_BIT);
glPushMatrix ();
glRotatef (spin, 0.0, 0.0, 1.0);
glColor3f (1.0, 1.0, 1.0);
glRectf (-25.0, -25.0, 25.0, 25.0);
glPopMatrix ();
glutSwapBuffers ();
>

void spinDisplay (void)
<
spin = spin + 2.0;
if (spin> 360.0)
spin = spin - 360.0;
glutPostRedisplay ();
>

void reshape (int w, int h)
<
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho (-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
>

void mouse (int button, int state, int x, int y)
<
switch (button) <
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc (spinDisplay);
break;
case GLUT_MIDDLE_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc (NULL);
break;
default:
break;
>
>

/ *
* Double buffer display mode.
* Register mouse input callback functions
* /
int main (int argc, char ** argv)
<
glutInit (argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv [0]);
init ();
glutDisplayFunc (display);
glutReshapeFunc (reshape);
glutMouseFunc (mouse);
glutMainLoop ();
return 0;
>

Схожі статті