Так, наприкінці 1999 року повідомлялося про створення компанією Dimensional Media Associates тривимірного дисплея - "багатопланового об'ємного дисплея". У компанії придумали, як використовувати ЗD-дані таким чином, щоб здавалося, що зображення плаває або усередині дисплея, або в декількох дюймах перед ним. У багатоплановому об'ємному дисплеї використовується 12 площин відображення даних, кожна з яких відповідає визначеній глибині. У пристрої застосовуються оптичні компоненти, що розщеплюють промені, параболічні дзеркала та інші оптичні компоненти, за допомогою яких світло збирається, фокусується І проецирується в просторі, утворюючи об'ємне зображення. Dimensional Media Associates разом із компанією Silicon Graphics розробляє настільний тривимірний дисплей, що зможе запропонувати не 12, а 50 площин та 24-бітний колір [95].
У 2000 році фірма Ethereal Technologies представила станцію VIS4D, ключовим елементом якої є 1,2-метрове увігнуте дзеркало з перемінною фокальною відстанню. З його допомогою з декількох світлових пучків, що подаються спеціальною оптичною системою, керованою за допомогою комп'ютера, формується дійсне тривимірне зображення (слід наголосити: мова йде не про голографічний ефект. Крім того, як стверджують у Ethereal Technologies, з погляду якості, насамперед різкості, їхня технологія навіть перевершує голографію) [45].
У 2002 році було повідомлено, що група наукових розрахунків і візуалізації Бостонського університету розробила установку для створення масштабних деталізованих тривимірних зображень на екрані розміром 2.3x3 метри, називаному "дисплейною стіною заглибленого бачення". Процесом керує суперкомп'ютер IBM на 96 процесорах Power 4. Установка використовує ті ж принципи, що й старе стереоскопічне кіно, - зображення потрібно розглядати через червоно-сині окуляри [97].
Важливою подією в житті суспільства стала поява глобальної мережі Internet. Зараз відбувається бурхливий розвиток цієї мережі. Зростають потужності каналів передачі даних, удосконалюються способи обміну й обробки інформації. Мережу Internet використовують усе більше людей у всіх країнах. Це спосіб спілкування людей, обміну інформацією, зближення мов, поширення ідей, новий простір для бізнесу тощо. Можна ставитися до Internet по-різному, наприклад, одні вважають її важливим фактором демократизації, а інші її називають знаряддям чийогось світового панування. Імовірно, обидві ці думки справедливі, як і багато інших. Одне безсумнівно - створення мережі Internet є видатним досягненням людства. Важливе місце в Internet посідає комп'ютерна графіка. Усе більше удосконалюються способи передачі візуальної інформації, розробляються досконаліші графічні формати, відчутно бажання використовувати тривимірну графіку, анімацію, весь спектр мультимедіа.
OpenGL стала індустріальним стандартом, вона підтримується багатьма операційними системами для різноманітних апаратних платформ - від персональних комп'ютерів до надпотужних суперкомп'ютерів. Бібліотека OpenGL дозволяє досить просто створювати швидкодіючі графічні програми, які використовують апаратні можливості ЗD-акселераторів. Тому вона часто використовується розроблювачами комп'ютерних ігор (наприклад, Quake) та систем тривимірного моделювання. В операційній системі Windows бібліотека OpenGL (версії 1.1) підтримана, починаючи з Windows 95 версії OSR 2, - були додані відповідні модулі DLL, а також включені кілька функцій і структур даних у АРІ Win32.
Перша версія OpenGL побачила світ у 1992 році. Розширення OpenGL втілювалися у версіях 1.1-1.5 Зараз на порядку денному впровадження OpenGL версії 2. Ця версія буде забезпечувати використання усіх можливостей графічних процесорів, у тому числі повну підтримку шейдерів.
Розробка графічних програм OpenGL для середовища Windows подібна програмуванню графіки GDI функцій АРІ, що ми розглянули в главах 7-10. Однак є особливості, деякі з яких ми вивчимо. Для одержання докладніших відомостей можна порекомендувати такі літературні джерела, як довідники для систем програмування для АРІ Win32 [86, 87].
Стосовно літератури. Незважаючи на те, що видано багато різноманітної літератури з OpenGL, в тому числі й кирилицею - наприклад [25], радимо вам завжди намагатися читати першоджерела (це стосується будь-якої теми). Для OpenGL таким джерелом є знаменита "Red Book" від Silicon Graphics [88].
Швидкодія графічних програм, що використовують OpenGL, істотно залежить від відеоадаптера. Апаратна реалізація всіх базових функцій OpenGL - гарантія високої швидкодії. У даний час багато відеоадаптерів містять спеціальний графічний процесор (один чи декілька) для підтримки функції графіки. Крім того, що відеоадаптер повинен апаратно виконувати усі базові функції OpenGL (такі як перетворення координат, відсікання, вивід полігонів, розрахунок освітлення, накладення текстур), для досягнення високої швидкодії повинен бути встановлений спеціальний драйвер. Драйвери типу ICD (Installable Client Driver) забезпечують інтерфейс, що сприяє ефективному використанню апаратних можливостей відеоадаптера. Інший тип драйвера - MCD - встановлюється зазвичай тоді, коли не всі функції підтримані апаратно, в цьому випадку вони виконуються програмно центральним процесором, що істотно повільніше.
Розглянемо створення програм OpenGL мовою С, C++ у середовищі Windows. У главі 7 при розгляді графіки GDI ми визначили ключовий момент - це створення контексту графічного пристрою (device context). Графіка OpenGL у цьому плані схожа - необхідно спочатку створити контекст, що названий тут контекстом відображення (rendering context), і спрямовувати поточний вивід графіки на нього. Потім необхідно закрити цей контекст, звільнити пам'ять.
Будемо програмувати в стилі програм StudEx попередніх глав цієї книги. Цей стиль полягає в безпосередньому виклику функцій API Windows без будь-яких посередників типу MFC (чи інших подібних бібліотек). По-перше, це зменшує виконуваний код (оскільки кожному посереднику потрібно платити - ось тільки тут за що?), а по-друге, дозволить нам більш детально ознайомитися власне з OpenGL.
Дамо загальну схему програми OpenGL.
1. Створення вікна програми. Тут необхідно обов'язково установити стиль вікна ws_clipchildren і ws_clipsiblings. Це здійснюється завданням значень аргументів функції CreateWindow.
2. Після створення вікна можна відкривати контекст відображення. Рекомендується відкриття цього контексту робити під час обробки повідомлення wm_create.
3. Щоб створити контекст відображення, спочатку необхідно відкрити контекст вікна (hdc), наприклад, функцією GetDC.
4. Для з'ясування характеристик контексту відображення встановлюємо відповідні значення полів структури PIXELFORMATDESCRIPTOR і викликаємо функцію ChoosePixelFormat. Ця функція повертає номер піксельного формату, який можна використовувати. Якщо це - номер 0, то створення потрібного контексту відображення неможливо.
5. Викликом функції SetPixelFormat задаємо відповідний піксельний формат у контексті hdc.
6. На основі контексту hdc створюємо контекст відображення hglrc викликом функції wglCreateContext. Для переадресації поточного виводу графіки OpenGL у hglrc необхідно викликати функцію wglMakeCurrent.
7. У ході роботи програми виводимо графічні об'єкти в поточний контекст відображення. Графічний вивід можна здійснювати під час обробки повідомлення wm_paint чи інших повідомлень. Для цього використовуються функції для роботи з графічними примітивами OpenGL.
8. Перед закриттям вікна програми необхідно закрити всі відкриті контексти відображення. Також необхідно закрити всі контексти графічного пристрою. Це можна зробити в ході обробки повідомлення WM_DESTROY ВИКЛИКОМ функцій ReleaseDC І wglDeleteContext.
Щоб використовувати бібліотеку OpenGL, у середовищі розробки програм на С та C++ необхідно підключити відповідні файли заголовків. Наприклад, у середовищі Borland C++ або Visual C++ для цього досить внести до тексту програми такі рядки:
Текст цієї програми складений з двох частин - winOpGL. срр і Studex50. срр. У файлі winOpGL. срр зосереджені функції, необхідні для створення вікна, віконні функції, функції ініціалізації графіки. Цей файл буде використаний і в наступних прикладах програм OpenGL. Файл Studex50. cpp містить текст, що описує графічне відображення конкретних об'єктів (функція DrawMyExampleOpenGL). Як ви, напевно, вже помітили, все це подібно до використання в главах 7-10, розробленнях в цих главах, файлів winmain. cpp, winmain1. cpp і studexXX. cpp.
Запустіть програму, потім виберіть меню "Графіка". На екрані у вікні програми з'явиться зображення, показане на рис.11.1
Зображення у вікні програми studex50 створюється з декількох графічних примітивів. У даному випадку рисувалися точки, лінії й полігони. Вивід кожного такого примітива в OpenGL оформлений парою функцій glBegin і glEnd:
Аргументом функції glBegin є код типу об'єкта. Координати вершини об'єкта задаються функцією glVertexXX. Ця функція має багато різновидів (суфіксів хх). Відмінності обумовлені типом і кількістю аргументів glVertex. Кількість аргументів відповідає числу вимірів систем координат. Тип координат-аргументів може бути цілим чи дійсним (із плаваючою точкою) у декількох різновидах. Наприклад,
задає двовимірні float-координати, а
задає також float, але тривимірні координати вершини.
Перерахування усіх вершин об'єкта в програмі завершує виклик функції glEnd. Це означає запис примітива в чергу графічного виводу. У залежності від аргументу функції glBegin (mode) список вершин може трактуватися OpenGL по-різному (табл.11.1).