GLUT, інструментарій утиліт бібліотеки OpenGL



Інструментарій бібліотек

Як ви вже знаєте, бібліотека OpenGL містить команди візуалізації, проте вона розроблялася так, щоб бути незалежною від будь-якої конкретної віконної або операційної системи. Отже, ця бібліотека не містить ніяких команд для відкриття вікон або зчитування подій від клавіатури або миші. На жаль, неможливо написати закінчену графічну програму, не відкриваючи, принаймні, одне вікно, а найцікавіші програми вимагають певного об'єму обробки даних, що вводяться користувачем, або інших послуг від віконної або операційної системи. У багатьох випадках закінчені програми дають найцікавіші приклади, тому справжня програма використовує бібліотеку GLUT для того, щоб спростити процедури відкриття вікон, виявлення введення даних користувачем і так далі. Якщо на вашій системі є реалізація бібліотеки OpenGL і інструментарію GLUT, то приклади повинні працювати без змін при роботі з вашими бібліотеками OpenGL і GLUT.

Крім того, оскільки склад команд малювання у бібліотеці OpenGL обмежений тільки командами, які генерують прості геометричні примітиви (точки, лінії і багатокутники), бібліотека GLUT включає декілька підпрограм, що створюють складніші тривимірні об'єкти, такі як сфера, тор і чайник. Таким чином, можна отримати для перегляду досить цікаві кадри виведення програми. (Зверніть увагу на те, що бібліотека утиліт OpenGL, GLU, також має у своєму складі підпрограми побудови двовимірних поверхонь, які створюють деякі тривимірні об'єкти, такі ж, як і ті, які створює інструментарій GLUT, у тому числі сферу, циліндр або конус.)

Інструментарій GLUT може бути не достатнім для повнофункціональних OpenGL-програм, але він може виявитися хорошою відправною точкою для вивчення OpenGL. Інша частина розділу коротко описує невелику підмножину підпрограм бібліотеки GLUT так, щоб ви змогли розібратися з прикладами програмування.

Управління вікнами

П'ять підпрограм інструментарію GLUT виконують завдання, необхідні для того, щоб ініціалізувати вікно.

Підпрограма glutlnit(int *argc, char **argv) ініціалізує бібліотеку GLUT і опрацьовує будь-які аргументи командного рядка (для оболонки X WindowSystem це могли б бути такі опції, як - display і - geometry). Підпрограма glutlnit() має бути викликана перед будь-якою іншою підпрограмою бібліотеки GLUT.

Підпрограма glutInitDisplayMode(unsigned int mode) визначає, яку колірну модель слід використовувати: режим RGBA або режим індексації кольору. Можна також визначити, чи хочете ви працювати з буфером кадру вікна з одинарною або з подвійною буферизацією. (Якщо ви працюєте в режимі індексації кольору, то ви, можливо, захочете завантажити деякі кольори в таблицю компонентів кольору; для того, щоб зробити це, скористайтеся командою glutSetColor().) Нарешті, можна використовувати цю підпрограму для того, щоб вказати, що ви хочете зв'язати з цим вікном буфери глибини, трафарету і буфер-накопичувач. Наприклад, якщо ви хочете використовувати вікно з подвійною буферизацією, колірною моделлю RGBA і буфером глибини, то для цього можна викликати дану підпрограму з наступними параметрами: g\utlnitmsv\&yMote{GLUT_DOUBLE\ GLUT^RGB \ GLUTJ) EPTH).

Підпрограма glutInitWindowPosition(int х, int у) визначає місце розташування лівого верхнього кута створюваного вікна на екрані монітора.

Підпрограма glutInitWindowSize(int width, int size) визначає розмір створюваного вікна в пікселях.

Підпрограма int glutCreateWindow(char *string) створює вікно з контекстомOpenGL. Ця підпрограма повертає унікальний ідентифікатор для нового вікна. Майте на увазі : до тих пір, поки викликається підпрограма glutMainLoopO, це вікно ще не відображається на екрані.

Функція зворотного виклику відображення

Підпрограма gIutDisplayFunc(void(void)) є першою і найбільш важливою функцією зворотного виклику по події, з якою належить зіткнутися. Всякий раз, коли бібліотека GLUT визначає, що вміст цього вікна має бути відновлений, виконується функція зворотного виклику, зареєстрована підпрограмою glutDisplayFunc(). Тому ви повинні помістити усі підпрограми, які потрібні для перемальовування сцени, в цю функцію зворотного виклику відображення.

Якщо ваша програма змінює вміст вікна, то іноді ви повинні викликати підпрограму glutPostRedisplay(void), яка змушує підпрограму glutMainLoopO викликати зареєстровану функцію зворотного виклику відображення при наступній слушній нагоді.

Виконання програми

Саме останнє, що ви повинні зробити, це викликати підпрограму glutMainLoop(void). При цьому відображаються усі вікна, які були створені, і в цих вікнах тепер працює візуалізація. Починається обробка подій, і викликається зареєстрована функція зворотного виклику відображення. Увійшовши одного разу до цього циклу, з нього не виходять ніколи!

Для того, щоб зробити ефективність програми максимальної, усі операції, які повинні викликатися одноразово (установка кольору фону і системи координат), тепер включені до складу процедури, названої init(). Операції, необхідні для візуалізації (і, можливо, для повторної візуалізації) сцени, включені до складу процедури display(), яка є зареєстрованою функцією зворотного виклику відображення бібліотеки GLUT.

Приклад 2. Проста програма OpenGL, що використовує інструментарій GLUT : hello.c

#include <GL/glut.h>

#include <stdlib.h>

void display(void)

/* Очистити усі пікселі */

glClear(GL_COLOR_BUFFER_BIT);

/* намалювати білий багатокутник (прямокутник) з кутами,

розташованими в точках з координатами (0.25, 0.25, 0.0)

і (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() ;

/* He чекати! Запустити обробку тих, що буферизують

* підпрограм OpenGL*/

glFlushO ; }

void init(void){

/* Вибрати колір очищення (колір фону) */

glClearColor (0.0, 0.0, 0.0, 0.0);

/* Ініціалізувати значення, що переглядаються, */

glMatrixMode(GL_PROJECTION);

glLoadldentity();

glOrtho(0.0, 1.0, 0.0, 1.0, - 1.0, 1.0); }

/* Оголосити початковий розмір вікна, його положення на екрані і режим відображення (одинарна буферизація і режим RGBA).

Відкрити вікно із словом "hello" в рядку заголовка. Викликати підпрограми ініціалізації. Зареєструвати функцію зворотного виклику для відображення графіки. Увійти до основного циклу і обробляти події.*/

int main(int argc, char** argv){

glutInit(Sargc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(250, 250);

glutInitWindowPosition(100, 100);

glutCreateWindow("hello");

init();

glutDisplayFunc(display);

glutMainLoop();

return 0; /* Мова програмування С, згідно ISO, вимагає, щоб функція main повертала значення типу int. */ }


Дата добавления: 2019-07-15; просмотров: 153; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!