1.1 Програмний код OpenGL
Оскільки за допомогою графічної системи OpenGL можна вирішити так багато завдань, OpenGL-програма може бути досить важкою для розуміння. Проте основна структура програми може бути проста: її завдання полягають в тому, щоб ініціалізувати деякі стани, які управляють тим, як бібліотека OpenGL виконує візуалізацію, і визначити об'єкти, які будуть візуалізовані.
Перш ніж приступити до аналізу деякого програмного коду OpenGL, давайте познайомимося з декількома термінами. Візуалізація є процесом, за допомогою якого комп'ютер створює зображення з моделей. Ці моделі, або об'єкти, створюються з геометричних примітивів, - точок, ліній і багатокутників, - які визначаються їх вершинами.
Кінцеве візуалізоване зображення складається з пікселів, що виводяться на екран; піксель є найменшим видимим елементом, який апаратні засоби відображення можуть помістити на екран.
Інформація про пікселі (наприклад, який колір передбачається для цих пікселів) організована в пам'яті у вигляді бітових площин. Бітова площина є областю пам'яті, яка містить один біт інформації для кожного пікселя на екрані; цей біт міг би вказувати, наприклад, на те, що конкретний піксель, як передбачається, є червоним. Бітові площини, у свою чергу, організовані у буфер кадру, який містить усю інформацію, необхідну графічному дисплею для того, щоб управляти кольором і яскравістю усіх пікселів на екрані.
Приклад 1. Фрагмент програмного коду OpenGL
finclude <whateverYouNeed.h>,
main () {
InitializeAWindowPlease();
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 () ;
UpdateTheWindowAndCheckForEvents(); }
Перший рядок функції main() ініціалізував певне вікно на екрані: функція InitializeAWindowPlease() використовується в даному випадку в якості мітки-"заповнювача" для підпрограм специфічних віконних систем, які в загальному випадку не є викликами OpenGL. Наступні два рядки містять команди OpenGL, які встановлюють чорний колір фону для вікна: функція glCIearCoIor() визначає, який колір фону буде встановлений для вікна, а функція glClear() фактично встановлює колір вікна. Як тільки колір фону встановлений, вікно заливається цим кольором всякий раз, коли викликається функція glClear(). Цей колір фону може бути змінений за допомогою другого виклику функції glClearColor(). Так само функція glColor3f() встановлює, який колір слід використовувати для промальовування об'єктів на екрані - в даному випадку цей колір є білим. Усі об'єкти, що виводяться на екран після цього моменту, використовують цей колір до тих пір, поки він не буде змінений за допомогою наступного виклику команди установки кольору.
Наступна функція OpenGL, використовувана в даній програмі, glOrtho(), визначає систему координат, яку OpenGL приймає для промальовування остаточного зображення, і те, як це зображення відображається на екрані. Виклики, розміщені між функціями glBegin() і glЈnd(), визначають об'єкт, який буде виведений на екран, в даному прикладі це багатокутник з чотирма вершинами. "Кути" багатокутника визначаються за допомогою функції glVertex3f(). Як ви, напевно, вже здогадалися, виходячи зі значень параметрів цієї функції, які є координатами (х, у, z), цей багатокутник є прямокутником, розташованим на площині z(z - 0).
Нарешті, функція gIFlush() гарантує, що команди промальовування фактично виконуються, а не просто зберігаються в деякому буфері, чекаючи додаткових команд OpenGL. Підпрограмма-"заповнювач" UpdateTheWindowAndCheckForEvents() управляє вмістом вікна і починає обробку подій.
1.2 Cинтаксис команд OpenGL
Як ви, ймовірно, могли помітити з прикладу програми, приведеного в попередньому розділі, команди бібліотеки OpenGL використовують префікс gl. Кожне слово, що становить найменування команди, починається із заголовної букви (згадайте, наприклад, функцію glClearColor()). Так само імена констант, визначених у бібліотеці OpenGL, починаються з префікса GL_, записуються заголовними буквами і використовують символи підкреслення, щоб розділити окремі слова (наприклад, GL__COLOR_BUFFER_BIT).
Ви, ймовірно, також змогли помітити деякі символи, які здалися вам сторонніми, вони додаються в кінець найменування деяких команд (наприклад, 3f у функціях glColor3f() і glVertex3f()). Дійсно, частина Color в найменуванні функції glColor3f() достатньо для того, щоб визначити цю команду як команду, що встановлює поточний колір. Проте було визначено декілька таких команд, щоб ви змогли використовувати їх з різними типами параметрів. Зокрема, частина 3 суфікса вказує, що для цієї команди задаються три параметри; інша версія команди Color використовує чотири параметри. Частина f суфікса вказує на те, що параметри цієї команди є числами з плаваючою крапкою. Наявність різних форматів дозволяє бібліотеці OpenGL приймати дані користувача в його власному форматі даних.
Деякі команди бібліотеки OpenGL допускають використання 8 різних типів даних в якості своїх параметрів. Букви, використовувані в якості суфіксів для того, щоб визначити ці типи даних для реалізації ISO З бібліотеки OpenGL, представлені в Таблиці 1.2; там же приведені відповідні визначення типів у бібліотеці OpenGL. Конкретна реалізація бібліотеки OpenGL, яку ви використовуєте, може не співпадати в точності з приведеною схемою; наприклад, реалізації для мов програмування C++ або Ada, не вимагають цього.
Таблиця 1.2. Суфікси найменування команд і типи параметрів
Тип даних | Тип, що відповідає типу даних мови програмування С | Визначення типів даних бібліотеки OpenGL |
8-розрядне ціле | signed char | GLbyte |
16-розрядне ціле | short | GLshort |
32-розрядне ціле | Int або long | GLint, GLsizei |
32-розрядне число з плаваючою крапкою | float | GLfloat, GLclampf |
64-розрядне число з плаваючою крапкою | double | GLdouble, GLclampd |
8-розрядне беззнакове ціле | unsigned char | GLubyte, GLboolean |
16-розрядне беззнакове ціле | unsigned short | GLushort |
32-розрядне беззнакове ціле | unsignedint або unsigned long | GLuint, GLenum, GLbitfield |
Таким чином, дві команди glVertex2i (1,3); glVertex2f (1.0, 3.0); є еквівалентними, за винятком того, що перша з них визначає координати вершини як 32-розрядні цілі числа, а друга визначають їх як числа з плаваючою крапкою з одинарною точністю.
Найменування деяких команд бібліотеки OpenGL можуть мати завершальний символ v, який вказує на те, що ця команда приймає покажчик на вектор (чи масив) значень, а не набір індивідуальних параметрів. Багато команд мають як векторні, так і невекторні версії, але деякі команди приймають тільки індивідуальні параметри, тоді як інші команди вимагають, щоб, принаймні, деякі з їх параметрів були визначені як вектори. Наступні рядки показують, як можна було б використовувати векторну і невекторну версію команди, яка встановлює поточний колір :
glColor3f (1.0, 0.0, 0.0);
gLfloat color_array [] = {1.0, 0.0, 0.0); glColor3fv (color_array);
Нарешті, бібліотека OpenGL визначає тип даних GLvoid. Цей тип даних найчастіше використовується для тих команд бібліотеки OpenGL, які приймаються як параметри покажчики на масиви значень.
РОЗДІЛ 2. Конвеєр візуалізації та бібліотеки, що відносяться до OpenGL
0 комментариев