АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Консольне застосування

Читайте также:
  1. Еластичність попиту: сутність, види, розрахунки, застосування.
  2. Контракт, як особлива форма трудового договору і сфера його застосування.
  3. Привід та порядок його застосування.
  4. Розділ 4. Похідна та її застосування. Інтеграл

(частка|частина| 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.
В конструкторі класу ініціалізуємо роботу елементу OnGl:

public Form1()
{

InitializeComponent();
OnGl.InitializeContexts();

}

Переходимо до конструктора і зробивши подвійне клацання лівою клавішею миші на формі - створюємо функцію обробника події завантаження форми.
У ній ми помістимо код ініціалізації Opengl.

private void Form1_Load(object sender, EventArgs e)
{

// ініціалізація Glut
Glut.glutInit();
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);

// очитка вікна
Gl.glClearColor(255, 255, 255, 1);

// установка порта виводу у відповідності з розмірами элемента OnGl
Gl.glViewport(0, 0, OnGl.Width, OnGl.Height);

// настройка проекції
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Glu.gluPerspective(45, (float)OnGl.Width / (float)OnGl.Height, 0.1, 200);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();

// настройка параметрів OpenGL для візуалізації
Gl.glEnable(Gl.GL_DEPTH_TEST);
}

У вікні ми створили 3 кнопки. Обробник кнопки вийти будет виглядати наступним чином

// Обробник кнопки "вийти"

private void button2_Click(object sender, EventArgs e)
{

Application.Exit();

}

Обробник кнопки «Візуалізувати» буде містити код, що реалізує візуалізацію сіткового каркаса сфери, або іншої фігури, (за відрисовку тривимірної фігури відповідатиме бібліотека FREEGLUT). Код, який буде розміщений в даній функції, відповідає за різні технічні аспекти візуалізації.

Код функції:


// обробник кнопки "візуалізувати"
private void button1_Click(object sender, EventArgs e)
{

Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);

Gl.glLoadIdentity();
Gl.glColor3f(1.0f, 0, 0);

Gl.glPushMatrix();
Gl.glTranslated(0,0,-6);
Gl.glRotated(45, 1, 1, 0);

// будуємо ромбододекаедр с допомогою бібліотеки FreeGLUT

Glut.glutWireRhombicDodecahedron();
Gl.glPopMatrix();
Gl.glFlush();
OnGl.Invalidate();

}

 

Обробник кнопки “Очистити” напишіть самостійно.

Відкомпілюйте і запустіть додаток.
Результат роботи додатку показаний на малюнку 7.

Після натиснення на кнопку “Очистити” вікно зі сферою очиститься.

 

Рис. 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».
talk.mail.ru/forum/fido7.ru.opengl - Форумы@Mail.Ru:

Форум Стандарт візуалізації 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.


1 | 2 | 3 | 4 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.032 сек.)