|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Консольне застосування
(частка|частина| 1, приклад|зразок| 21). {**********************************************************************} program| OpenGL_min|; uses| Messages|, Windows|, OPENGL|; const| AppName| = 'OpenGL_Min|'; Var| Window|: HWnd|; Message|: TMsg|; WindowClass|: TWndClass|; dc|: HDC|; hrc|: HGLRC|; // контекст відтворення OPENGL| MyPaint|: TPaintStruct|; // Процедура заповнення полів структури PIXELFORMATDESCRIPTOR| procedure| SetDCPixelFormat| (hdc|: HDC|); var| pfd|: TPixelFormatDescriptor|; // дані формату пікселів nPixelFormat|: Integer|; Begin| With| pfd| do| begin| nSize|:= sizeof| (TPixelFormatDescriptor|); // розмір структури nVersion|:= 1; // номер версії dwFlags|:= PFD_DRAW_TO_WINDOW| or| PFD_SUPPORT_OPENGL|; // безліч бітових прапорів, визначальний пристрій|устрій| і інтерфейс iPixelType|:= PFD_TYPE_RGBA|; // режим для зображення квітів cColorBits|:= 16; // число бітової площини|площини| в кожному буфері кольору|цвіту| cRedBits|:= 0; // число бітової площини|площини| червоного в кожному буфері RGBA| cRedShift|:= 0; // зсув|зміщення| від початку числа бітової площини|площини| червоного //у кожному буфері RGBA| cGreenBits|:= 0; // число бітової площини|площини| зеленого в кожному буфері RGBA| cGreenShift|:= 0; // зсув|зміщення| від початку числа бітової площини|площини| зеленого //у кожному буфері RGBA| cBlueBits|:= 0; // число бітової площини|площини| синього в кожному буфері RGBA| cBlueShift|:= 0; // зсув|зміщення| від початку числа бітової площини|площини| синього //у кожному буфері RGBA| cAlphaBits|:= 0; // число бітової площини|площини| альфа в кожному буфері RGBA| cAlphaShift|:= 0; // зсув|зміщення| від початку числа бітової площини|площини| альфа //у кожному буфері RGBA| cAccumBits|:= 0; // загальне|спільне| число бітової площини|площини| в буфері акумулятора cAccumRedBits|:= 0; // число бітової площини червоного в буфері акумулятора cAccumGreenBits|:= 0; // число бітової площини|площини| зеленого в буфері акумулятора cAccumBlueBits|:= 0; // число бітової площини|площини| синього в буфері акумулятора cAccumAlphaBits|:= 0; // число бітової площини |площини| альфа в буфері акумулятора cDepthBits|:= 32; // розмір буфера глибини (вісь z) cStencilBits|:= 0; // розмір буфера трафарету cAuxBuffers|:= 0; // число допоміжних буферів iLayerType|:= PFD_MAIN_PLANE|;// тип площини|площини| bReserved|:= 0; // число площини|площини| переднього і заднього плану dwLayerMask|:= 0; // ігнорується dwVisibleMask|:= 0; // індекс або колір|цвіт| прозорості нижньої площини|площини| dwDamageMask|:= 0; // ігнорується end|; nPixelFormat|:= ChoosePixelFormat| (hdc| @pfd); // запит системі - чи підтримується //вибраний формат пікселів SetPixelFormat| (hdc|, nPixelFormat| @pfd); // встановлюємо формат пікселів в //контексті пристрою|устрою| End|;
function| WindowProc| (Window|: HWnd|; Message|, WParam|: Word|; LParam|: LongInt|): LongInt|; stdcall|; Begin| WindowProc|:= 0; case| Message| of| wm_Create|: begin| dc|:= GETDC| (Window|); SetDCPixelFormat| (dc|); // встановити формат пікселів hrc|:= wglCreateContext| (dc|); // створює контекст відтворення OPENGL| RELEASEDC| (Window|, dc|); end|; wm_Paint|: begin| dc|:= BeginPaint| (Window|, MyPaint|); wglMakeCurrent| (dc|, hrc|); // встановлює поточний контекст відтворення {****** ТУТ РОЗТАШОВУЮТЬСЯ КОМАНДИ МАЛЮВАННЯ OpenGL*********|} glClearColor| (0.85, 0.75, 0.5, 1.0); // визначення кольору|цвіту| фону glClear| (GL_COLOR_BUFFER_BIT|); // встановлення кольору|цвіту| фону {************************************************************************} wglMakeCurrent| (dc|, 0); // перед завершенням роботи необхідно // щоб|аби| контекст ніким не використовувався EndPaint| (Window|, MyPaint|); RELEASEDC| (Window|, dc|); end|; wm_Destroy|: begin| wglDeleteContext| (hrc|); // видалення|віддалення| контексту відтворення DELETEDC| (dc|); PostQuitMessage| (0); Exit|; end|; end|; // case| WindowProc|:= DefWindowProc| (Window|, Message|, WParam|, LParam|); End|; Begin| With| WindowClass| do| begin| Style|:= cs_HRedraw| or| cs_VRedraw|; lpfnWndProc|:= @WindowProc; cbClsExtra|:= 0; cbWndExtra|:= 0; hInstance|:= 0; hCursor|:= LoadCursor| (0, idc_Arrow|); lpszClassName|:= AppName|; end|; RegisterClass| (WindowClass|); Window|:= CreateWindow| (AppName|, AppName| ws_OverLappedWindow| or| ws_ClipChildren| or| ws_ClipSiBlings| // обов'язково для OPENGL| cw_UseDefault|, cw_UseDefault| cw_UseDefault|, cw_UseDefault| HWND_DESKTOP|, 0, HInstance|, nil|); ShowWindow| (Window|, CmdShow|); UpdateWindow| (Window|); While| GetMessage| (Message|, 0, 0, 0) do| begin| TranslateMessage| (Message|); DispatchMessage| (Message|); end|; Halt| (Message|.wParam); end|. {**********************************************************************} 3) Приклад|зразок| малювання на поверхні візуального компоненту. (приклад|зразок| 10, частка|частина| 2). {**********************************************************************} program| Dots|; uses| Forms| Unit1| in| 'Unit1|.pas' {frmGL|}; {$R *.RES} begin| Application|.Initialize; Application|.CreateForm(TFRMGL|, frmGL|); Application|.Run; end|.
{**********************************************************************} 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|); private| hrc|: HGLRC|; end|; var| frmGL|: TFRMGL|;
implementation| {$R *.DFM} {==========================================Перерисовка вікна} procedure| TFRMGL|.FormPaint(Sender|: TObject|); begin| wglMakeCurrent|(Canvas|.Handle, hrc|); glViewPort| (0, 0, ClientWidth|, ClientHeight|); // область виводу|висновку| glClearColor| (0.5, 0.5, 0.75, 1.0); // колір|цвіт| фону glClear| (GL_COLOR_BUFFER_BIT|); // очищення|очистка| буфера кольору|цвіту| glPointSize| (20); // розмір крапок|точок| glColor3f| (1.0, 0.0, 0.5); // поточний колір|цвіт| примітивів glBegin| (GL_POINTS|); // відкриваємо|відчиняємо| командну дужку glVertex2f| (-1, -1); glVertex2f| (-1, 1); glVertex2f| (0, 0); glVertex2f| (1 -1); glVertex2f| (1, 1); glEnd|; // закриваємо|зачиняємо| командну дужку SwapBuffers|(Canvas|.Handle); // вміст буфера - на екран wglMakeCurrent|(0, 0); Canvas|.Brush.Color:= clGreen|; Canvas|.Ellipse (10, 10, 50, 50); 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|); begin| SetDCPixelFormat|(Canvas|.Handle); hrc|:= wglCreateContext|(Canvas|.Handle); end|; {=================================Закінчення роботи додатка|застосування|} procedure| TFRMGL|.FormDestroy(Sender|: TObject|); begin| wglDeleteContext|(hrc|); end|; end|. {**********************************************************************}
Додаток|застосування| 3. Мінімальний код програми для використання OPENGL| в програмі на С#|.
У додатку|застосуванні| приводиться|призводять| варіант програми, що дозволяє використовувати бібліотеку OPENGL| для графічного виводу|висновку|. Створення програми-заготовки|заготівлі| і підключення бібліотеки Tao OPENGL в С#. Спочатку створіть новий проект, як шаблон встановивши додаток Windows Forms. Назвіть його TaoGl_<grupa>_<prizvyshe>.
Дочекайтесь поки MS Visual Studio закінчить генерацію кода шаблону. Тепер перейдіть до вікна Solution Explorer. Перейдіть на вузол Links, який відображає зв'язки з бібліотеками, необхідними для роботи нашого застосування (рис. 1)
Рис. 1
Назвіть головне вікно «Графіка ……». (Властивості вікна, параметр Text). Клацніть по цьому вузлу (Links) правою клавішею миші, після чого, в контекстному меню, що відкрилося, виберіть «Додати посилання» (“Add Link”), як показано на рис. 2. У вікні, що відкрилося, «Додати посилання», перейдіть до закладки огляд. Після цього перейдіть до директорії, в яку була встановлена бібліотека Tao Framework. (По замовчанню - “C:\program Files\TaoFramework\”).
Рис. 2.
Нам буде потрібно теку bin - в ній зберігаються необхідні нам бібліотеки. Перейдіть в теку bin і виберіть 3 бібліотеки, як показано на малюнку 3: Tao.OpenGL.dll - відповідає за реалізація бібліотеки OPENGL Tao.FreeGlut.dll - відповідає за реалізацію функцій бібліоєки Glut. Ми її використовуватимемо для ініціалізації рендера та для інших цілей. Tao.Platform.Windows.dll - відповідає за підтримку елементів безпосередньо для візуалізації на платформі Windows. Рис. 3.
Тепер перейдіть до початкового коду вікна. Для роботи з нашими бібліотеками, нам необхідно підключити відповідні простори імен:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; // для работи з бібліотекою OpenGL using Tao.OpenGl; // для работи з бібліотекою FreeGLUT using Tao.FreeGlut; // для работи з елементом управління SimpleOpenGLControl using Tao.Platform.Windows; Рис. 4.
Тепер поверніться до конструктора діалогового вікна і перейдіть до вікна Toolbox (панель елементів). Клацніть правою кнопкою на вкладці «Загальні», і в контекстному меню, що розкрилося, виберіть пункт «Вибрати елементи» (Choose items), як показано на рис. 4.
Рис. 4.
У вікні, що відкрилося, знайдіть елемент Simpleopenglcontrol і встановіть біля нього галочку, як показано на рис. 5. Потім натисніть ОК.
Рис.5.
Тепер даний елемент стане доступним для розміщення на формі додатку. Перетягніть елемент на форму, і розмістіть так, як показано на малюнку 6. Праворуч від розміщеного елементу встановіть 3 кнопки - «Візуалізувати», «Очистити» і «Вийти». Наступним кроком буде виділити елемент simpleopenglcontrol1, розташований на формі і перейти до його властивостей. Змініть параметр name на значення “OnGl”. Рис.6.
Тепер нам необхідно ініціалізувати роботу Opengl. public Form1() InitializeComponent(); } Переходимо до конструктора і зробивши подвійне клацання лівою клавішею миші на формі - створюємо функцію обробника події завантаження форми. private void Form1_Load(object sender, EventArgs e) // ініціалізація Glut // очитка вікна // установка порта виводу у відповідності з розмірами элемента OnGl // настройка проекції // настройка параметрів OpenGL для візуалізації У вікні ми створили 3 кнопки. Обробник кнопки вийти будет виглядати наступним чином // Обробник кнопки "вийти" private void button2_Click(object sender, EventArgs e) Application.Exit(); } Обробник кнопки «Візуалізувати» буде містити код, що реалізує візуалізацію сіткового каркаса сфери, або іншої фігури, (за відрисовку тривимірної фігури відповідатиме бібліотека FREEGLUT). Код, який буде розміщений в даній функції, відповідає за різні технічні аспекти візуалізації. Код функції:
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); Gl.glLoadIdentity(); Gl.glPushMatrix(); // будуємо ромбододекаедр с допомогою бібліотеки FreeGLUT Glut.glutWireRhombicDodecahedron(); }
Обробник кнопки “Очистити” напишіть самостійно. Відкомпілюйте і запустіть додаток. Після натиснення на кнопку “Очистити” вікно зі сферою очиститься.
Рис. 7.
Додаток|застосування| 4. Посилання|заслання| на Інтернет-ресурси по використанню бібліотек OPENGL| в програмуванні графіки.
http://esate.ru http://gl.satel.ru http://www.sgi.com/software/opengl www|.opengl.org.ru/ - Підбірка матеріалів книг, документації, підручників|посібників|. Приклади|зразки| програм написаних з використанням OPENGL|. opengl|.gamedev.ru/ - Програмування комп'ютерної графіки засобами|коштами| OPENGL|. Документація, статті, ради|поради|. www|.codenet.ru/progr/opengl/ - Мінімальна програма OPENGL|. Введення|вступ| в OPENGL|. nehe|.gamedev.net/ - головна|чільна| сторінка компанії NeHe|, підручники|посібники|, ресурси. www.rsdn.ru/article/opengl/ogltut2.xml - Навчальний посібник по OPENGL. www.citforum.ru/programming/opengl/index.shtml - книга Ігоря Тарасова «OPENGL». Форум Стандарт візуалізації OPENGL|. pmg|.org.ru/nehe/ - OPENGL| - уроки від NeHe|: перекази|переведення| по OPENGL| тривимірна|трьохмірна| графіка, ігри, мультимедия| Translations| Russian| OPENGL|. www|.firststeps.ru/mfc/opengl/opengl1.html - перші кроки в створенні|створінні| програми з|із| OPENGL| www|.bib.com.ua/cat_art28.html - керівництво по написанню програм.
Контрольні питання: 1. Що розуміється під контекстом пристрою|устрою|? 2. Що є контекстом відтворення? 3. Які основні фрагменти повинна містити|утримувати| підпрограма OPENGL|. 4. Що входить в поняття формат пікселя? 5. Які бібліотечні файли мають бути підключені до програми для роботи з|із| OPENGL|? 6. Яка колірна модель використовується при визначенні кольору|цвіту| в даній програмі? 7. Які параметри слід вказати, щоб|аби| колір|цвіт| фону був зеленим? 8. Для чого потрібна функція масштабування сцени? 9. У якій секції коду можна записувати|занотовувати| команди малювання сцени? 10. Яке правило необхідно дотримувати, щоб|аби| мати можливість|спроможність| переходу в повноекранний режим?
Література: 1. Бореськов А. Графіка тривимірної|трьохмірної| комп'ютерної гри на основі OPENGL|. – М.: ДІАЛОГ-МІФІ, 2005. 2. Гашников М. і ін. Методи комп'ютерної обробки зображень. - М.: Фізматліт, 2001. 3. Павлідіс Т. Алгоритми машинної графіки і обробка зображень. - М.: Радіо і зв'язок. 1986. 4. Петров М. Компьютерная графика. Підручник|посібник| для вузів. - Спб.: Пітер, 2002. 5. Рейбоу В. Компьютерная графика. Енциклопедія. - Спб.: Пітер, 2002. 6. Роджерс Д. Алгоритмические основы машинной графики. - М.: Мир|світ|, 1989. 7. Сніжко Е. Компьютерная геометрия и графика: Конспект лекций. – Спб.: Видавництво БГТУ, 2005. 8. Шикин Е., Бореськов А. Компьютерная графика. Динамика, реалистические изображения. - М.: Діалог - Міфі, 1985. 9. Шикин Е., Бореськов А. Компьютерная графика. Полигональние модели. – М.: ДІАЛОГ-МІФІ, 2005. 10. Ейнджел Е. Інтерактивная компьютерная графіка. Вводный курс на базе OpenGl|. - М.: Видавництва Будинок|дім| «Вільямс», 2001. 11. Херн Д., Бейкер М. Компьютерная графика и стандарт OPENGL|. – М.: Видавництва Будинок|дім| «Вільямс», 2005. 12. Т.А.Блинова, В.Н.Порєв. Комп`ютерная графика. Изд-во “Юниор”, СПб, 2006.
[1] Лабораторні роботи практикуму можуть виконуватися в середовищі візуального програмування Delphi. У Додатках 1, 2 і 3 містяться варіанти мінімальної програми OpenGL на Delphi та C#.
[2] В програмі на C++ вказівник записаний у вигляді &pfd, в програмі на Delphi необхідно записати @pfd. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.029 сек.) |