Деякі формати мультимедіа. Використання шейдерів та фракталів
МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
Бердичівський політехнічний коледж
Контрольна робота
з предмета: Комп’ютерна графіка
(варіант №18)
Деякі формати мультимедіа. Використання шейдерів та фракталів
Виконав: студент групи Пзс-504
Юрчук Сергій Леонідович
Перевірив викладач:
Козік Вадим Юрійович
Формати мультимедіа
Через особливості відеоінформації у цифровому відеозаписі ущільнення без утрат саме по собі майже не застосовується. Використання цих методів ущільнення (подібних до методів, що використовуються в архіваторах типу WinZIP) дозволяє зменшити розмір файлу не більше, ніж на 2/3, хоча, звісно, при цьому не відбувається погіршення якості зображення.
Ущільнення з утратою якості є основним методом зменшення розміру відеофайлів. Такі алгоритми дозволяють визначити ту частину інформації, що глядач, імовірніше всього, не помітить при перегляді фільму, й видалити її з файлу. Основними форматами цифрового відео, що використовують ущільнення з утратами, на сьогоднішній день є Apple QuickTime, AVI, Intel Indeo, MJPEG, MPEG-1, MPEG-2, і MPEG-4.
Ми вже зазначали на початку глави, що ущільнення стає більш ефективним при одночасній обробці даних декількох кадрів.
Один із прийомів, що використовується при роботі з відеоданими, полягає в обчисленні послідовних різниць, а саме — в простому відніманні даних наступного кадру від даних попереднього та ущільненні отриманих різниць. Як правило, зображення багато в чому схожі, отже великі фрагменти зображень будуть давати нульову різницю. Однак в ряді випадків цей прийом виявляється марним (наприклад, при повільному панорамуванні детально проробленої сцени).
Більш ефективним прийомом є передбачення руху, а саме — програма кодування шукає блоки пікселів, що переміщуються, й кодує тільки координати цього блоку та його переміщення. Певна річ, порівняно з декодуванням процес самого кодування (ущільнення) при передбаченні руху складніше реалізувати. У результаті деякі найкращі алгоритми ущільнення відеоданих асиметричні, тобто процес ущільнення потребує набагато більше зусиль (часу), аніж процес декодування. Слід зазначити, що, у даному випадку, асиметричність алгоритмів не є істотним недоліком через те, що ущільнення відеоданих здійснюється, як правило, один раз у кінці роботи над ними. Головне, щоб при перегляді відеоданих забезпечувалася достатня швидкість декодування.
Вочевидь, для першого кадру фільму не можна використати метод обчислення різниць. Отже, завжди буде існувати принаймні один опорний кадр (І-кадр), що не потребує знання попереднього кадру для декодування. Насправді такий опорний кадр не один. По всій довжині фільму спеціально розміщені опорні кадри. Деякі з них — природні опорні кадри, що виникають, наприклад, при зміні сцени. Наявність багатьох опорних кадрів корисна в ряді випадків: при утраті деяких кадрів; при перегляді фільму не з початку; при необхідності в цілях синхронізації пропускати декілька нерозпакованих кадрів (на повільних процесорах).
Розглянемо деякі формати мультимедіа.
• Формат AVI (Audio Video Interleaved), що є спеціальним форматом представлення відеофайлів в операційних системах сімейства Windows і тому широко використовується на персональних комп'ютерах. Цей формат створює окремі моментальні фотографії, фрейми, й потім зв'язує їх в одне ціле, причому аудіосигнал може бути частиною фреймів. На відміну від інших форматів, формат AVI є немов би оболонкою для програм ущільнення відеоданих. Видів ущільнення, що підходять для файлів AVI, дуже багато. Для того, щоб створити файл AVI, необхідно використовувати відповідне устаткування, причому можливе використання традиційної аналогової відеокамери з наступним цифруванням аналогового відеосигналу.
Формат відеофайлів MPEG (Motion Picture Experts Group), що ущільнює відеофайли за алгоритмами, які використовують обчислення послідовних різниць і завбачення руху. Так, наприклад, якщо протягом декількох секунд демонструється той самий нерухомий об'єкт, то в MPEG файлі за цей час будуть збережені тільки один фрейм і інформація про те, на протязі якого часу в цьому фреймі не відбувалися зміни. Саме тому розміри MPEG файлів менші в середньому в три рази, ніж розміри інших відеофайлів. Зазвичай, для їхнього створення й відтворення потрібне особливе технічне й програмне забезпечення.
Формат QuickTime, що був розроблений фірмою Apple для операційних систем сімейств Macintosh і Windows. QuickTime — розширення програмного забезпечення System Macintosh, яке дозволяє програмам, що підтримують QuickTime, відображати анімаційні чи відеоряди точно синхронізованими з високоякісним цифровим звуком. В операційній системі Windows відеофайли формату QuickTime мають розширення MOV. З 1993 по 1995 р. цей формат був домінуючим. Його версія за номером 4.1 дозволяє передавати дані в потоковому режимі. Це значить, що немає необхідності цілком завантажувати файл, щоб почати перегляд відеофільму. Однак із появою специфікацій MPEG даний формат поступово втрачає популярність. Одна з проблем полягає в закритості стандарту QuickTime. Способи, за допомогою яких кодується відео, Apple тримає в секреті. Отже, сторонні програмісти не можуть написати програм, що ущільнюють відео в цей формат.
Історія створення форматів мультимедіа
Зробимо невеликий екскурс в історію створення форматів мультимедіа. У 1989 році компанія Apple Computer приступила до розробки технології, що дозволяє переглядати на екрані комп'ютера зображення, що рухається, назване "цифровим відео", разом, природно, зі звуковим супроводом. Ця технологія була випущена у світ у 1991 році під назвою QuickTime.
Формат для відео А VI поширився після виходу Video for Windows для Windows 3.1 у листопаді 1992 року.
Формати QuickTime і AVI дозволили користувачам побачити на комп'ютері уривки з фільмів і телепередач. Однак рівень ущільнення відеопотоку був досить низьким, якість зображення невисока. Середньої тривалості фільм мав гігантський для кінця 80-х років розмір, більший за гігабайт.
У 1988 році був заснований комітет Motion Picture Experts Group — експертна група кінематографії (зображень, що рухаються). У цьому ж році була розпочата розробка формату MPEG -1, що був випущений у 1992 році.
Наявність дешевих CD-ROM ємністю до 640 Mb привела до появи на ринку вiдеодисків стандарту CD-I, розроблених фірмою Philips. Стандарт CD-I дозволяв умістити на двох дисках CD півторагодинний фільм якості VHS-відеокасети зі стереозвуком. Типовий побутовий формат відеофільму — кодування MPEG-1 для зображення у стандарті PAL із кадром розміром 352x288 пікселів, 25 кадрів/с. Аудіочастина — стереозвук із частотою дискретизації 44,1 Кгц, ущільнений MPEG-1 Layer. До моменту остаточної стандартизації формату MPEG-1 було створено три звукових кодера цього сімейства — MPEG-1 Layer I, Layer II і Layer III (знаменитий МРЗ).
У 1992 році була почата розробка формату MPEG-2, який був випущений через два роки. Стандарт SuperVideoCD дозволив трохи поліпшити якість зображення завдяки застосуванню кодування MPEG-2. Але в 1992 році не існувало широко доступних носіїв, на котрі можна було би записати відеоінформацію, ущільнену MPEG-2. Та й тогочасна комп'ютерна техніка не могла забезпечити потрібну смугу пропускання — від 2 до 9 Мбіт/с, яку змогло забезпечити тогочасне супутникове телебачення. Слід зазначити, що високі вимоги до каналу обумовлені більшими, ніж у MPEG-1, роздільністю зображення й кількістю кадрів/секунду.
У жовтні 1995 року через космічний телевізійний супутник "Pan Am Sat" було здійснено перше 20-канальне ТБ-віщання, яке використовувало стандарт MPEG-2. Супутник здійснював і дотепер здійснює трансляцію на території Скандинавії, Бельгії, Нідерландів, Люксембургу, Близького Сходу й Африки.
Завдяки MPEG-2 стала можливою поява телебачення високої роздільності — HDTV, у якого зображення набагато чіткіше, ніж у звичайного телебачення (зараз у Японії є модним формат HDTV із роздільністю 1600*1200*32 біти та форматом MPEG-2 із bitrate від 8 Мбіт /с й вище).
Вважається, що якість HDTV з роздільністю (1920x1080) й потоком некомпенсованих даних близько 100 Мбіт/с упритул наближена до меж роздільної здатності людського зору. Тим часом, за оцінками нейрофізіологів, пропускна здатність очного нерва не може перевищувати 100 Кбіт/с. Отже, зоровий апарат людини, як найкращий з усіх існуючих кодерів, забезпечує коефіцієнт ущільнення близько 1:1000 [56].
Крім того, у форматі MPEG-2 записують відеодані на такі цифрові носії як DVD-відеодиск. Типовий розмір кадру для DVD-фільму у відеостандарті PAL/SECAM складає 720x576 при 25 кадрах/с, чи 640x480 при 30 кадрах/с в стандарті NTSC. Застосування формату MPEG-2 забезпечило DVD-фільмам кращу якість зображення, ніж фільмам на VHS-відеокасетах.
Стандартний одношаровий і однобічний диск DVD може зберігати до 4.7 ГБ даних. Крім того, DVD можуть виготовлятися двошаровими, що дозволяє збільшити ємність збережених на одній стороні даних до 8.5 ГБ, та двосторонніми, що збільшує ємність одного диска до 17 ГБ (після програвання половини його треба перевертати). На DVD можна розмістити відео високої якості з прийнятим у сучасному кіно форматом екрана 16:9 (більш витягнутим по горизонталі, ніж звичний екран TV), а також багатоканальний об'ємний звук із якістю, що перевищує якість CD.
Крім того, у лютому 2002 року представники компаній Sony, Matsushita (Panasonic), Samsung, LG, Philips, Thomson, Hitachi, Sharp і Pioneer оголосили про створення й просування нового формату в DVD і CD-ROM, застосований синій лазер (blue-violet laser). Створені вже перші прототипи 100 Гб дисків [113].
Формат MPEG-4 почали розробляти ще в першій половині 90-х років минулого століття. Як основу формату файлу були прийняті розроблені Apple Computer алгоритми формату QuickTime. У 1998 р. була випущена перша версія MPEG-4, у грудні 1999 року був представлений реліз цього формату, що одержав офіційний статус стандарту ISO/IEC (International Standards Organization/International Electrotechnical Commission). MPEG-4 був задуманий як спосіб передачі потокових медіа-даних, у першу чергу відео, каналами з низькою пропускною здатністю. Слід зазначити, що MPEG-4 — окремий стандарт ISO/IEC-14496, що застосовується в тих областях, де використання форматів MPEG-1 і MPEG-2 не є ефективним. На відміну від MPEG-1 і MPEG-2, що здійснювали тільки ущільнення й декомпресію аудіо- та відеосигналів, MPEG-4 забезпечує інтерактивну передачу потокових медіа-даних — створення й доставку мультимедійної цифрової інформації Інтернетом на комп'ютери, а також на мобільні пристрої.
2. Шейдери та фрактали
Розвиток методів і технологій текстурування та намагання використовувати гнучкі процедурні методи зафарбовування призвели до появи поняття шейдер. Шейдер (від англ. shade — затемнювати, тут не плутати shade із shadow — тінь, шейдер затемнює, а не затінює — для генерації тіней від об'єктів у графіці використовуються доки що не шейдери, а інші засоби) — це невеличка програма, яка містить набір інструкцій для розрахунку кольорів пікселів об'єктів у ході циклу візуалізації. Фактично, шейдери трохи в іншому вигляді використовувалися вже давно в графічних пакетах для створення спецефектів у кіно (наприклад, у пакеті Maya). При створенні спецефектів для запису кадрів кінофільму не дуже потрібен режим реального часу, кожний кадр може генеруватися хвилину та довше, головне тут — це якість зображення.
У 2001-2002 pp. для масового вжитку, в першу чергу для комп'ютерних ігор, почали виготовлятися відеоадаптери (nVidia GeForce3,. ATI Radeon 8500), які апаратно підтримують базові операції шейдерів. Розробники графічних програм зацікавилися гнучкими можливостями шейдерів, оскільки відчувалася обмеженість фіксованого набору процедур графічного конвейєра. Можливість програмування графічних процесорів дає новий поштовх розвитку засобів комп'ютерної графіки. На рис. 3.34 наведено приклад зображення хвиль, створеного за допомогою шейдерів.
Сучасні графічні процесори здатні виконувати для кожного піксела десятки й сотні шейдерних команд у реальному часі.
Зараз існує два типи шейдерів — вершинні {vertex shaders) та піксельні (pixel shaders). Вершинні шейдери призначені для обчислення координат вершин полігонів та виконання розрахунків освітлення, наприклад, методом Гуро. Їх можна вважати доповненням можливостей апаратних засобів T&L (transform and lighting). Вершинний шейдер може обробляти всі дані, що стосуються одної вершини — координати вершини, координати нормалі, текстурні координати, колір, освітлення тощо.
Піксельні шейдери з'явилися спочатку як спосіб опису накладання пікселів багатошарових текстур. Тепер вони містять різноманітні операції визначення кольорів окремих пікселів. Шейдери оперують такими типами даних — цілі числа, числа з плаваючою точкою, трійки RGB, вектори, матриці.
Наведемо формат однієї команди шейдера для DirectX 8
де: op— ім'я команди,
dest — регістр, в який записується результат,
src0, srcl, src2 — регістри вхідних даних.
Як бачимо, мова команд шейдерів фактично є асемблером. Для розробки шейдер-них програм можна використовувати API DirectX (8.0 та наступних версій), OpenGL 2.0 (шейдерні операції частково підтримуються в розширеннях OpenGL версій 1.2 та 1.3). Також розроблені спеціальні мови програмування для шейдерів — це Cg (nVidia) та Monkey (ATI) [98].
Загальні відомості про шейдерні можливості сучасних відеоадаптерів надані у таблиці 3.2
Фрактал можна визначити як об'єкт досить складної форми, який отримано в результаті виконання простого ітераційного циклу. Ітераційність, рекурсивність обумовлюють такі властивості фракталів, як самоподібність — окремі частини схожі за формою на весь фрактал у цілому. Латинське fractus означає "складений із фрагментів". У 1975 році французький математик Бенуа Мандельброт видав книгу "The fractal Geometry of Nature" [38]. Відтоді слово "фрактал" стало модним.
Фракталом Мандельброта названо фігуру, яка породжується дуже простим циклом. Для створення цього фрактала необхідно для кожної точки зображення виконати цикл ітерацій згідно з формулою:
де k = 0, 1,..., п. Величини zk — це комплексні числа, zk = xk + iyk, причому стартові значення х0 та у0 — це координати точки зображення. Для кожної точки зображення ітерації виконуються обмежену кількість разів (n) або доти, доки модуль числа zk не перевищує 2. Модуль комплексного числа дорівнює кореню квадратному з х2 + у2. Для обчислення квадрата величини zk можна скористатися формулою z2 = (х + іу) (х + іу) = (х2 - у2) + і(2у), оскільки і2 = -1. Цикл ітерацій для фракталу Мандельброта можна виконувати в діапазоні х = (від -2.2, до 1), у = (від -1.2 до 1.2). Для того щоб отримати зображення в растрі, необхідно перераховувати координати цього діапазону в піксельні (рис. 3.35).
Фрактал Джулія зовсім не схожий на фрактал Мандельброта, однак він визначається ітераційним циклом, майже повністю тотожнім циклу генерації Мандельброта. Формула ітерацій для фрактала Джулія така:
На рис. 3.36 зображено фрактал Джулія для с = 0.36 + і 0.36, п = 256.
Як бачимо, фрактал самоподібний — при будь-якому збільшенні окремі частини нагадують форми цілого. Самоподiбнiсть вважається важливою властивістю фракталів. Це відрізняє їх від інших типів об'єктів складної форми.
Розглянемо наступний приклад фрактала — фрактал Ньютон. Для нього ітераційна формула має такий вигляд:
де z — також комплексні числа, причому z0 = х + іу відповідає координатам точки зображення.
Умовою припинення циклу ітерації для фракталу Ньютон є наближення значень |z4 - 1| до нуля. Наприклад, зображення на рис. 3.37 було отримане для |z4- 1|2> 0.001, межі розрахунку х = (від -1 до 1), у = (від-1 до 1).
Розглянемо ще один різновид фракталів. Такі фрактали названо геометричними, оскільки їхня форма може бути описана як послідовність простих геометричних операцій. Наприклад, крива Кох стає фракталом у результаті безкінечної кількості ітерацій, в ході яких виконується поділ кожного відрізка прямої на три частини. На рис. 3.38 показані три ітерації — поступово лінія стає схожою на сніжинку.
Наступну групу складають фрактали, що генеруються відповідно до методу "систем ітеративних функцій" — IFS (Iterated Functions Systems). Цей метод може бути описаний, як послідовний ітеративний розрахунок координат нових точок у просторі:
де Fx та Fy — функції перетворення координат, наприклад, афінного перетворення. Ці функції й обумовлюють форму фрактала. У випадку афінного перетворення необхідно знайти відповідні числові значення коефіцієнтів.
Давайте спробуємо розробити фрактал, який виглядав би, як рослина. Уявимо стовбур, на якому багато гілочок. На кожній гілочці багата менших гілочок і так далі. Найменші гілки можна вважати листям або колючками. Усі елементи будемо рисувати відрізками прямої. Кожен відрізок визначатиметься двома кінцевими точками.
Для початку ітерацій необхідно задати стартові координати кінців відрізку. Це будуть точки 1, 2. На кожному кроці ітерацій будемо розраховувати координати інших точок.
Спочатку знаходимо точку 3. Це повернута на кут а точка 2, центр повороту — в точці 1 (рис. 3.39):
Якщо = 0, то стовбур та всі гілки прямі. Потім знаходимо точку 4. Від неї будуть розповсюджуватися гілки. Нехай співвідношення довжин відрізків 1-4 та 1-3 дорівнює к, причому 0 < к < 1. Тоді для обчислення координат точки 4 можна скористатися такими формулами:
Тепер задамо довжину та кут нахилу гілок, що виходять із точки 4. Спочатку знайдемо координати точки 5. Уведемо ще один параметр — к1, який визначатиме співвідношення довжин відрізків 4-5 та 4-3, причому також 0 < к1 < 1. Координати точки 5 дорівнюють
Окрім розрахунку опорних точок, на кожному кроці будемо рисувати один відрізок 1-4. В залежності від номера ітерацій можна змінювати колір відрізка. Також можна встановлювати його товщину, наприклад, пропорційно довжині.
Таким чином, фрактал ми визначили як послідовність афінних перетворень координат точок. Величини , , к, к1 — це параметри, які описують вигляд фрактала в цілому. Вони є константами на протязі усього ітеративного процесу. Це дає можливість в ітераціях використовувати тільки операції додавання, віднімання та множення, якщо обчислити значення sin(), cos(), (1 - к) та (1 - kl) тільки один раз перед початком ітерацій у вигляді коефіцієнтів-констант.
Дамо запис алгоритму у вигляді рекурсивної процедури крок ():
Для того щоб нарисувати фрактал, необхідно викликати процедуру КРОК, встановивши відповідні значення її аргументів: крок(xl, yl, х2, у2, 0). Зверніть увагу на один з аргументів цієї процедури — пит, який спочатку має значення 0. У тілі процедури є три рекурсивних виклики з різними значеннями цього аргументу:
• крок(х4, у4, х3, у3, num)—продовжуємо стовбур;
• крок(х4, у4, х6, у6, num+l)—права гілка;
• крок(х4, у4, х7, у7, num+l) —ліва гілка.
Значення пит показує ступінь деталізації обрахування дерева. Один цикл ітерацій містить багато кроків, що відповідає одному значенню величини num. Числове значення пит можна використовувати для припинення ітеративного процесу, а також для визначення поточного кольору елементів "рослини".
Завершення циклів ітерацій у нашому алгоритмі відбувається тоді, коли довжина гілки стає менше від деякої величини lmin , наприклад, lmin = 1.
Цей фрактал при = 2°, = 86°, к = 0.14, к1 = 0.3 схожий на папороть (рис. 3.40).
Метод IFS використовується не тільки для створення зображень. Його використали Барнслі та Слоан для ефективного ущільнення графічних зображень при записі до файла. Основна ідея така: оскільки фрактали можуть репрезентувати дуже складні зображення за допомогою простих ітерацій, то опис цих ітерацій потребує значно меншого обсягу інформації, ніж відповідні растрові зображення. Дkя кодування зображень необхідно вирішувати обернену задачу — для зображення (або його фрагмента) підібрати відповідні коефіцієнти афінного перетворення. Цей метод використовується для запису кольорових фотографій у файли з ущільненням у десятки і сотні разів без помітного погіршення зображення. Формат таких графічних файлів було названо FIF (Fractal Image Format) і запатентовано фірмою Iterated Systems [40].
3. Засобами бібліотеки Opengl активізувати джерело світла на формі. Забезпечити операцію масштабування використовуючи клавіші “+” та “-“
object frmGL: TfrmGL
Left = 163
Top = 167
Width = 385
Height = 272
Caption = #1055#1079#1089'-504 '#1070#1088#1095#1091#1082' '#1057'.'#1051'.'
Color = clBlack
Font.Charset = RUSSIAN_CHARSET
Font.Color = clMaroon
Font.Height = -16
Font.Name = 'Times New Roman'
Font.Style = [fsBold, fsItalic]
OldCreateOrder = True
Position = poScreenCenter
OnCreate = FormCreate
OnDestroy = FormDestroy
OnKeyDown = FormKeyDown
OnPaint = FormPaint
OnResize = FormResize
PixelsPerInch = 96
TextHeight = 19
end
procedure TfrmGL.FormPaint(Sender: TObject);
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glPushMatrix;
glRotatef(Angle, 0.0, 1.0, 0.0); // поворот на угол
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @MaterialColor);
OutText ('ЮРЧУК С.Л.');
glPopMatrix;
SwapBuffers(DC);
end;
procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD) stdcall;
begin
With frmGL do begin
Angle := Angle + 0.2;
If (Angle >= 720.0) then Angle := 0.0;
MaterialColor [0] := (720.0 - Angle) / 720.0;
MaterialColor [1] := Angle / 720.0;
MaterialColor [2] := Angle / 720.0;
InvalidateRect(Handle, nil, False);
end;
end;
procedure TfrmGL.FormCreate(Sender: TObject);
begin
Angle := 0;
DC := GetDC(Handle);
SetDCPixelFormat;
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
wglUseFontOutlines(Canvas.Handle, 0, 255, GLF_START_LIST, 0.0, 0.15,
WGL_FONT_POLYGONS, nil);
Init;
uTimerID := timeSetEvent (1, 0, @FNTimeCallBack, 0, TIME_PERIODIC);
end;
procedure TfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(40.0, ClientWidth / ClientHeight, 1.0, 20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0.0, 0.0, -8.0);
glRotatef(30.0, 1.0, 0.0, 0.0);
InvalidateRect(Handle, nil, False);
end;
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
timeKillEvent(uTimerID);
glDeleteLists (GLF_START_LIST, 256);
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC(Handle, DC);
DeleteDC (DC);
end;
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = VK_ESCAPE then Close
end;
procedure TfrmGL.SetDCPixelFormat;
var
nPixelFormat: Integer;
pfd: TPixelFormatDescriptor;
begin
FillChar(pfd, SizeOf(pfd), 0);
with pfd do begin
nSize := sizeof(pfd);
nVersion := 1;
dwFlags := PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
iPixelType:= PFD_TYPE_RGBA;
cColorBits:= 24;
cDepthBits:= 32;
iLayerType:= PFD_MAIN_PLANE;
end;
nPixelFormat := ChoosePixelFormat(DC, @pfd);
SetPixelFormat(DC, nPixelFormat, @pfd);
end;
end.
Список використаної літератури
С.В.Глушаков, Г.А.Крабе Компютерная графика, Харьков 2002
Блінова Т.О., Порєв В.М. Комп’ютерна графіка / За ред. В.М.Горєва. – К.: Видавництво “Юніор”, 2004.
OpenGl, технология ставшая символов, Учебник в примерах.
Конспект лекцій.
Мережа Інтернет.