МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
Бердичівський політехнічний коледж
Контрольна робота
з предмета “Комп’ютерна графіка”
(варіант №1)
Виконав:
студент групи Пзс-504
Аранчій І.О.
Перевірив
викладач: Козік В.Ю.
м. Бердичів 2007 р.
Зміст
1. Види комп’ютерної графіки
2. Трансформація об’єктів в бібліотеці Opengl
3. Засобами бібліотеки Opengl побудувати довільну кількість довільного розміру точок на поверхні форми
Список використаної літератури
1. Види комп’ютерної графіки
Найважливішою функцією комп'ютера є обробка інформації. Окремо можна виділити обробку Інформації, пов'язану із зображеннями. Вона поділяється на три основні напрямки: комп'ютерна графіка (КГ); обробка зображень І розпізнавання зображень [18].
Завдання комп'ютерної графіки — візуалізація, тобто створення зображення. Візуалізація виконується, виходячи з опису (моделі) того, що потрібно відображати. Існує багато методів та алгоритмів візуалізації, які розрізняються між собою в залежності від того, що й як відображати. Наприклад, відображення того, що може бути тільки в уяві людини — графік функцій, діаграма, схема, карта. Або навпаки, імітація тривимірної реальності — зображення сцен у комп'ютерних розвагах, художніх фільмах, тренажерах, у системах архітектурного проектування. Важливими та пов'язаними між собою факторами тут є: швидкість зміни кадрів, насиченість сцени об'єктами, якість зображення, врахування особливостей графічного пристрою.
Обробка зображень — це перетворення зображень. Тобто вхідними даними є зображення, й результатом обробки теж є зображення. Прикладом обробки зображень може слугувати: підвищення контрасту, чіткості, корекція кольорів, редукція кольорів, згладжування, зменшення шумів тощо. Матеріалом для обробки можуть бути космічні знімки, скановані зображення, радіолокаційні, інфрачервоні зображення тощо. Завданням для обробки зображень може бути як покращання в залежності від певного критерію (реставрація, відновлення), так і спеціальне перетворення, що кардинально змінює зображення. В останньому випадку обробка зображень може бути проміжним етапом для подальшого розпізнавання зображення. Наприклад, перед розпізнаванням часто необхідно виділяти контури, створювати бінарне зображення, розділити за кольорами. Методи обробки зображень можуть суттєво відрізнятися в залежності від того, яким шляхом отримано зображення — синтезовано системою КГ або це результат цифрування чорно-білої чи кольорової фотографії.
Для розпізнавання зображень основним завданням є отримання опису об'єктів, що репрезентовані зображенням. Методи та алгоритми розпізнавання розроблялися насамперед для забезпечення зору роботів і для систем спеціального призначення. Але останнім часом комп'ютерні системи розпізнавання зображень все частіше з'являються в повсякденній практиці багатьох людей, наприклад, офісні системи розпізнавання текстів, або програми векторизації, створення тривимірних моделей людини.
Мета розпізнавання може формулюватися по-різному: виділення окремих елементів (наприклад, літер тексту на зображенні документа або умовних знаків на зображенні карти); класифікація зображень у цілому (наприклад, перевірка того, чи це є зображення певного літального апарату, або встановлення персони за відбитками пальців).
Методи класифікації та виділення окремих елементів можуть бути тісно пов'язані між собою. Так, класифікація може бути зроблена на основі структурного аналізу окремих елементів об'єкта. Або для виділення окремих елементів можна використовувати методи класифікації. Задача розпізнавання є зворотною відносно до візуалізації.
Досить популярним донедавна було словосполучення інтерактивна комп'ютерна графіка. Ним підкреслювалася здатність комп'ютерної системи створювати графіку та вести діалог із людиною. Раніше системи працювали в пакетному режимі — способи діалогу були нерозвинені. У теперішній час майже будь-яку програму можна вважати системою інтерактивної КГ.
Історично першими інтерактивними системами вважаються системи автоматизованого проектування {САПР, або англійська абревіатура CAD — Computer Aided Design), що з'явилися в 60-х роках [17, 18, 28]. Вони являють собою значний етап в еволюції комп'ютерів та програмного забезпечення. У системі інтерактивної КГ користувач сприймає на дисплеї зображення, що представляє деякий складний об'єкт, і може вносити зміни в опис (модель) об'єкта (рис.1). Такими змінами можуть бути як увід та редагування окремих елементів, так і завдання числових значень для будь-яких параметрів, а також інші операції по вводу інформації на основі сприйняття зображень.
/>
Системи типу САПР активно використовуються в багатьох галузях, наприклад, в машинобудуванні та електроніці. Одними з перших були створені САПР для проектування літаків, автомобілів, системи для розробки мікроелектронних інтегральних схем, архітектурні системи тощо. Такі системи спочатку функціонували на досить великих комп'ютерах. Потім поширене було використання швидкодіючих комп'ютерів середнього класу з розвинутими графічними можливостями — графічних робочих станцій. Із зростанням потужностей персональних комп'ютерів усе частіше САПР почали використовувати на дешевих масових комп'ютерах, які зараз мають достатню швидкодію та обсяги пам'яті для вирішення багатьох задач. Це призвело до широкого розповсюдження систем САПР. Назвемо декілька популярних САПР: багатоцільова система для виконання проектних робіт у різних галузях — AutoCAD, для архітекторів — ArchiCAD, для проектування електронних схем — пакет Spice.
Нині стають усе більш популярними геоінформаційні системи (ГІС). Це відносно новий для масових користувачів різновид систем інтерактивної комп'ютерної графіки. Вони інтегрують методи і технології різноманітних галузей — баз даних, геодезії, картографії, космонавтики, навігації і, звичайно ж, комп'ютерної графіки. Відомі такі системи, як ArcGIS, AutoCAD Map, Maplnfo. Приклади вітчизняних систем — ГІС «ОКО», «Візіком-Київ».
Системи типу ГІС можуть використовувати значні ресурси комп'ютерних систем як у плані роботи з базами даних, так і для візуалізації об'єктів, що знаходяться на поверхні Землі. Причому, візуалізацію необхідно робити з різними ступенями деталізації — як для Землі в цілому, так і в межах окремих ділянок.
Типовими для будь-якої ГІС є такі операції — увід та редагування об'єктів з урахуванням їхнього розташування на поверхні Землі, формування різноманітних цифрових моделей, запис у бази даних, виконання різноманітних запитів до баз даних. Важливою функцією ГІС є аналіз просторових, топологічних відношень множини об'єктів, розташованих на якійсь території. Однією з функцій є також супутникова GPS-навігація.
Широко використовуються графічні системи в дизайні, рекламі. Окрім традиційних 2D-редакторів — Adobe Photoshop, CorelDraw та подібних до них — використовуються й 3D-пакети. Яскраві анімаційні ролики, як епізоди життя віртуального світу, створюються засобами систем моделювання тривимірних сцен, таких як Maya, 3D Studio Max, Light Wave, Bryce 3D (рис.2) та інших.
/>
Одним із напрямків досліджень та розробок для сучасної комп'ютерної графіки є анімація руху людей та тварин, вивчення міміки. Популярною стала програма Poser, яка дозволяє створювати рухомі тривимірні моделі людей
У проекті асоціації «New Media» створений перший у світі віртуальний диктор новин для Internet.
Важливим етапом розвитку систем комп'ютерної графіки є так звані системи віртуальної реальності {virtual reality). Нарощування потужності комп'ютерів, підвищення реалістичності тривимірної графіки та вдосконалення способів діалогу людини з комп'ютером дозволяють створювати ілюзію входження людини у віртуальний простір. Цей простір може бути моделлю або Існуючого простору, або вигаданого. Системи класу віртуальної реальності зазвичай використовують такі пристрої, як шлем-дисплей, сенсори на всьому тілі людини.
Зразки КГ відомі вже кожному. Набули розповсюдження, наприклад, різноманітні комп'ютерні Ігри. Значну роль у них відіграє анімація, реалістичність зображень, досконалість способів уводу-виводу інформації. Отут слід зазначити, що в багатьох комп'ютерних іграх реалізовані Ідеї і методи, котрі раніше були втілені у професійних дорогих системах, наприклад, у тренажерах для льотчиків.
Широко використовується комп'ютерна графіка в кіно. Одним із перших відомих фільмів був фільм «Зоряні війни» 1977 рік, рис.5. Етапи подальшого розвитку комп'ютерного кінематографа можна простежити, якщо згадати такі фільми, як «Парк юрського періоду», «Термінатор-2», «Дюна», серіали «Вавилон 5» та «Лекс», а також фільми «Титанік», «Матриця» й десятки (якщо вже не сотні) інших. Донедавна технології комп'ютерної графіки використовувалися для спецефектів, створення зображень екзотичних чудовиськ, імітації стихійних лих й інших елементів, що були лише тлом для гри живих акторів. У 2001 році вийшов на екрани повнометражний кінофільм: «Фінальна фантазія», у якому все, включаючи зображення людей, синтезоване комп'ютером — живі актори тільки озвучили ролі за кадром.
Можна сказати, що основним фактором стимулювання розвитку сучасної комп'ютерної графіки є потреби індустрії розваг та реклами. У цьому контексті цілком природною є жорстка конкуренція, наприклад, фірм ATI та nVidia — найбільш потужні ЗР-акселератори розробляються, в першу чергу, для комп'ютерних ігор.
У даний час продовжуються активні дослідження в області побудови дійсних тривимірних зображень {true 3D view): стереомоделей, що спостерігаються на стереоприладах, об'ємних чи стереозображень, отриманих анагліфічним, голографічним й іншими способами, у тому числі на спеціалізованих об'ємних дисплеях безпосередньої тривимірної візуалізації типу DVDD {Direct Volume Display Device).
/>
Так, наприкінці 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 посідає комп'ютерна графіка. Усе більше удосконалюються способи передачі візуальної інформації, розробляються досконаліші графічні формати, відчутно бажання використовувати тривимірну графіку, анімацію, весь спектр мультимедіа.
2. Трансформація об’єктів в бібліотеці Opengl
OpenGL стала індустріальним стандартом, вона підтримується багатьма операційними системами для різноманітних апаратних платформ — від персональних комп'ютерів до надпотужних суперкомп'ютерів. Бібліотека OpenGL дозволяє досить просто створювати швидкодіючі графічні програми, які використовують апаратні можливості ЗD-акселераторів. Тому вона часто використовується розроблювачами комп'ютерних ігор (наприклад, Quake) та систем тривимірного моделювання. В операційній системі Windows бібліотека OpenGL (версії 1.1) підтримана, починаючи з Windows 95 версії OSR 2, — були додані відповідні модулі DLL, а також включені кілька функцій і структур даних у АРІ Win32.--PAGE_BREAK--
Перша версія 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).
/>
Можна вважати істотним недоліком обмеження для полігонів (gl_polygon): можливість виводу тільки опуклих фігур. Функція Polygon GDI API Windows у цьому плані набагато досконаліша — вона рисує й неопуклі полігони.
/>
Розмір точок можна задати викликом glPointsize (), товщину ліній — glLineWidth () Для завдання стилю ліній використовуються функції glLineStipple, glEnable і glDisable, наприклад,
/>
причому аргументами функції glLineStipple () є кількість повторів пікселів і шаблон пунктиру.
Стиль заповнення фігур може бути заданий растровим зразком 32*32 біт.
/>
Зверніть увагу, ми вже кілька разів використовували функції glEnable () і glDisable (). Це багатоцільові функції. Вони призначені керувати багатьма різноманітними режимами відображення.
3. Засобами бібліотеки Opengl побудувати довільну кількість довільного розміру точок на поверхні форми
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL;
type
TfrmGL = class (TForm)
procedure FormCreate (Sender: TObject);
procedure FormPaint (Sender: TObject);
procedure FormDestroy (Sender: TObject);
procedure FormKeyPress (Sender: TObject; var Key: Char);
private
hrc: HGLRC;
end;
var
frmGL: TfrmGL;
Vert: array [1. .6,1. .10] of GLfloat; // оголосили масив з папаметрами 10-ти точок
mx,my: byte; // коефіцієнти збільшення/зменшення
implementation
{$R *. DFM}
procedure TfrmGL. FormPaint (Sender: TObject);
var
i: byte;
begin
wglMakeCurrent (Canvas. Handle, hrc); // Встановили контекст відображення
glViewPort (0, 0, ClientWidth, ClientHeight); // встановили область відображення
glClearColor (0.5, 0.5, 0.5, 1.0); // задали колір фону
glClear (GL_COLOR_BUFFER_BIT); // Очистили буфер кольору
glEnable (GL_POINT_SMOOTH); // активізувати зглажування точок
glScalef (my/mx, — my/mx, 1.0); // виконуємо маштабування
for i: = 1 to 10 do
begin
glPointSize (vert [4, i]); // задали розмір точки
glColor3f (vert [1, i], vert [2, i], vert [3, i]); // задали колір для примітитів
glBegin (GL_POINTS); // розпочинаємо побудову
glVertex2f (vert [5, i],vert [6, i]); // будуємо точку
glEnd; // закінчуємо побудову
end;
glScalef (mx/my, — mx/my, 1.0); // повертаємо систему в початкове положення
SwapBuffers (Canvas. Handle); // вміст буферу виводимо на екран
wglMakeCurrent (0, 0); // вивілбняємо контекст відображення
end;
{Формат пикселя}
procedure SetDCPixelFormat (hdc: HDC);
var
pfd: TPixelFormatDescriptor; // структура формату пікселя
nPixelFormat: Integer; // номер формату пікселя
begin
FillChar (pfd, SizeOf (pfd), 0); // онулили формат пікселя
pfd. dwFlags: = PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; // встановили флаги
nPixelFormat: = ChoosePixelFormat (hdc, @pfd); // активізували формат пікселя для нашого контексту відображення
SetPixelFormat (hdc, nPixelFormat, @pfd); // встіновили формат вікселя
end;
{Создание формы}
procedure TfrmGL. FormCreate (Sender: TObject);
var
i: byte; // кількість точок на екрані
begin
SetDCPixelFormat (Canvas. Handle); // встановили формат пікселя
hrc: = wglCreateContext (Canvas. Handle); // створили контекст вдображення
randomize; // активізувати генератор випадкових змінних
for i: = 1 to 10 do
begin
vert [1, i]: =Random (10) /10; // R встановити коефіцієнти кольору
vert [2, i]: =Random (10) /10; // G
vert [3, i]: =Random (10) /10; // B
vert [4, i]: =random (30); // pointSize
vert [5, i]: = (random (10) — random (10)) /10; // X
vert [6, i]: = (random (10) — random (10)) /10; // Y
end;
mx: =10; my: =10;
end;
11. Для попереднього практичного завдання даного варіанту забезпечити операцію маштабування використовуючи клавіши “+” та “-“
Далі згідно варіанту необхідно, щоб довільна кількість точок наближалась за допомогою натиску на клавішу і таким же чином точки віддалялися тобто виконувалося маштабування. Для більшої зручності ми виберемо клавіші на клавіатурі “+” та “-", що само собою вже підрозуміває наближення та віддалення. Для вже існуючого листингу вище вказаного допишемо такий алгоритм дій:
procedure TfrmGL. FormDestroy (Sender: TObject);
begin
wglDeleteContext (hrc); // знищили контекст відображення
end;
procedure TfrmGL. FormKeyPress (Sender: TObject; var Key: Char);
begin
if key = '-' then mx: =mx+1;
if key = '+' then mx: =mx-1;
FormPaint (Sender);
end;
end.
Після написання цих команд програма буде виконувати маштабування довільної кількості точок на формі, які вказані на рис.1 та рис.2:
/>
(рис.1)
На рис.1 показане вже згенерована програма яка виконує масштабування віддалення при натиску на клавішу “-", на рис.2 ви бачите наближення довільних точок при натиску на клавішу “+”
/>
(рис.2)
Список використаної літератури
Блінова Т.О., Порєв В.М. Комп’ютерна графіка / За ред. В.М. Горєва. — К.: Видавництво “Юніор”, 2004. — 456с., іл.
С.В. Глушаков, Г.А. Крабе Компьютерная графика, Харьков 2002
OpenGl, технология, ставшая символом. Учебник в примерах. Конспект лекцій.