Використання бібліотеки OpenGL (исходники), Різне, Програмування, статті

Ця досить велика стаття присвячена огляду бібліотеки розширення OpenGL написана Ricardo Sarmiento. Всі приклади наведені нижче написані з використанням цієї бібліотеки – точніше я знайшов приклади і написав статтю. Стаття швидше огляд можливостей технології OpenGL, Ніж керівництво до програмування. Хоча деякі функції та процедури Ви можете використовувати і для своїх додатків – наприклад читання файлів DXF.


Хочу роз’яснити ситуацію з усілякими версіями бібліотек та заголовних файлів OpenGL.


Починаючи з Delphi 3 в каталозі Source можна знайти файл OpenGL.pas – це і є оригінальна версія заголовків бібліотеки OpenGL. Вона отримана трансляцією файлів Gl.h і Glu.h, відповідно з мови C.


Існує ще одне практично стандартне розширення – Glut. В оригіналі Glut.h і її трансляція на Delphi Glut.pas. Це розширення створено для більш швидкої побудови різних об’єктів OpenGL і набір корисних процедур.


Всі інші версії бібліотек і заголовків OpenGL є розширеннями стандартної версії і пишуться сторонніми виробниками. Як і та, про яку піде мова нижче.


Закликаю використовувати стандартну бібліотеку OpenGL. По перше ви отримаєте найбільшу швидкість виконання коду, і сумісність. Але в статті я використовую огляд бібліотеки розширення OpenGL, чому? Справа в тому, що новачкові деколи складно розібратися в нетрях програмування, а розширення стандартної бібліотеки дозволяє швидко написати код і отримати видовищний результат. Саме результат може підштовхнути вас на подальше вивчення бібліотеки OpenGL.
 


Отже почнемо. Наведу ієрархію об’єктів, використаних в даній бібліотеці:




Введення


Приклад 1


У цьому прикладі розглянуто наступні питання:


Створення сцени TSceneGL


Scene:TSceneGL;
… Scene: = TSceneGL.create; / / Створюємо нову сцену ….

Створення об’єкта TEntity – куб, завдання його за допомогою TFace, установка кольору і додавання на сцену.

….
cube:Tentity; Face:TFace; …. Cube: = TEntity.create; / / Створюємо порожній об’єкт TEntity Cube.SetColor (90,200,150); / / Ініціюємо кольору R, G, B
Face:=cube.addFace; / / Створюємо 1-й face у вихідному кубі всього 6 граней (в кубі) Face.AddVertex (1.0, 1.0, 1.0,0.0, 0.0, 1.0); / / додаємо 1-й vertex Face.AddVertex (-1.0, 1.0, 1.0,0.0, 0.0, 1.0); / / додаємо 2-й vertex Face.AddVertex (-1.0, -1.0, 1.0,0.0, 0.0, 1.0) ;/ / додаємо третій vertex Face.AddVertex (1.0, -1.0, 1.0,0.0, 0.0, 1.0) ;/ / додаємо 4-й vertex
…. Scene.Entities.add (cube) ;/ / додамо куб на сцену

Завдання джерела світла Tlight і додавання на сцену.

light: = Tlight.create (1); / / створимо джерело світла і додамо його на сцену
Scene.lights.add(light);

Ініціалізація сцени

/ / Передамо Handle Panel1 нашій сцені, на ній буде відбуватися рендеринг
Scene.InitRC(panel1.handle);
Scene.UpdateArea(panel1.width,panel1.height);

Найпростіший поворот об’єкту

procedure TForm1.Timer1Timer(Sender: TObject);
begin / / Змінюємо rx, ry, rz
…. Tentity (Scene.Entities.Items [0]). Rotate (rx, ry, rz); / / повернемо куб Scene.Redraw; / / … і оновимо сцену
end;


Приклад 2


Відмінності від попереднього прикладу: о’ектов TEntity – дельфін задається не через TFace, а загружається з DXF файлу – що дуже спрощує життя.


Dolphin:=TEntity.create;
Dolphin.SetColor(100,100,160);
Dolphin.LoadDXF(“..Dolphin.dxf”,true);
with dolphin do
begin move (0,0, -15); / / перемістимо трохи назад rotate (-30, -30, -30); / / і повернемо
end; Scene.entities.add (dolphin); / / додамо дельфіна на сцену



Приклад 3


Зміни: В об’єкта Dolphin шукаються нормалі до TFace, при цьому виходить ефект об’ємного простору:

…. Dolphin.CalcNormals; / / вираховуємо нормалі векторів об’єкта
Dolphin.Center;
….


Приклад 4


Додали клас T3DMouse – тепер можна маніпулювати об’єктами.

procedure TForm1.FormCreate(Sender: TObject);
…. Mouse: = T3DMouse.create (dolphin); / / Створюємо T3DMouse для нашого об’єкта Mouse.scale (1,1,0.1,1,1,1); / / задаємо швидкість переміщення і повороту
….

Переміщення об’єкту можна здійснити:

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin Mouse.move (x, y, shift); / / оновлюємо об’єкт – дельфін в нових координатах Scene.Redraw; / / перерісуем сцену
end;

Можна встановити блокування на переміщення:

… Mouse.Block (4, TspeedButton (sender). Down); / / блокування повороту rx



Приклад 5


Додамо управління відображенням:

….
case dolphin.wireframe of
0:begin speedbutton5.caption: = “Лінії”;
dolphin.wireframe:=1;
end;
1:begin speedbutton5.caption: = “Заливка”;
dolphin.wireframe:=2;
end;
2:begin speedbutton5.caption: = “Точки”;
dolphin.wireframe:=0;
end;
end; Scene.Redraw; / / оновимо сцену



Приклад 6


Зберемо все в один приклад, додамо можливість друку і покажемо FPS при повороті.


Ну от, сама основа повинна стати Вам зрозуміла. Якщо у Вас не запускаються приклади, перевірте наявність бібліотек Opengl32.dll і Glu32.dll. Исходники прикладів перебувають в каталогах Demo1-XXX.



Текстура


Ця глава присвячена текстуруванню об’єктів в OpenGL. У кожному прикладі я даю пояснення тільки до нового. За цим краще подивитися спочатку приклад 1 потім 2, а не починати з прикладу 5. У цьому розділі описані приклади використовують фільтрації текстур, і при використанні GL_linear потрібен 3D прискорювач, інакше працюватиме ДУЖЕ повільно.


Приклад 1


Зафарбовуємо полігони

….
point:TVertex;
….
begin / / Отримуємо вибраний полігон при натисканні на панель Panel1
mouse.FindVertex(x,panel1.height-y,Scene,point); for i: = 1 to numFound do / / Для всіх полігонів знайдених по Mouse.FindVertex
begin
poly:=VertexHits[i] shr 16;
vert:=VertexHits[i] mod 65536;
If (poly “<” Dolphin.Faces.count) and
(vert”<“Tface(Dolphin.Faces.Items[poly]).Vertices.count) then
begin / / Отримуємо складові кольору з ColorActual (TColor)
ir:=(ColorActual) mod 256; // R
ig:=(ColorActual shr 8) mod 256; // G
ib:=(ColorActual shr 16) mod 256; // B
Tvertex(Tface(Dolphin.Faces.Items[poly].
Vertices.items[vert]).point.setcolor(ir,ig,ib);
end;
end;
end;


Приклад 2


Формат DXF є дуже незручним для запису т.к. має великі розміри. Для цього автор створює інший формат запису. Додана функція читання-запису.



Приклад 3


Накладення текстур на об’єкт

  thing.CreateTexture; / / додамо текстури на об’єкт
thing.texture.LoadTexture(“texture.bmp”);
thing.texture.automatic:=False;
… / / А далі йде рутинний процес завдання вершин для текстур у кожної поверхні об’єкта
with thing do
begin
vertex:=Tvertex(Tface(thing.faces.items[1]).vertices.items[0]);// x,y,z =0,0,0
vertex.tx:=1;
vertex.tz:=0;

end;

Та в якості експерименту ви можете прибрати все починаючи з with thing do ….. end (завдання точок для текстур) і переписати thing.texture.automatic: = true.


Використання типів фільтрації текстур

thing.Texture.MagFilter:=GL_linear;

або

thing.Texture.MagFilter:=GL_nearest;


Приклад 4


Установка прозорості у текстур (альфа каналів)

thing.texture.EnvironmentMode: = GL_decal; / / Установка transparent texturing  thing.texture.envblendcolor [3]: = scrollbar1.position; / / Значення 0 – 255

При запуску програми спочатку створюється сцена з висвітленням, але об’єкт створюється тільки після установки, з виконання процедури FormCreate_partII.



Приклад 5


Програмна текстура 🙂 Процес простий – при натисненні на кнопки з цифрами ми створюємо TBitmap і через його Canvas пишемо ці цифри. Далі зберігаємо цей ТBitmap в файл “texture.bmp”. Видаляємо з екрану комп’ютера стару текстуру і завантажуємо нову з раніше створеного “texture.bmp”.



Вихідні тексти всіх прикладів перебувають в каталогах Demo2-XXX



Освітлення


Приклад 1


У цьому приклади показано як задати параметри джерела. Раніше джерело світла задавався за замовчуванням. Створимо джерело типу прожектор

(CLspot). Light:=Tlight.create(1);
Light.LightType:=CLspot;
Light.CutOffAngle:=5;
Light.SpotExponent:=100;

Параметр CutOffAngle – кут розбіжності променя.

SpotExponent – параметр загасання джерела.

Light.SetOrientation(0,-1,0);
Light.Source.SetPosition(0,5,-20);

Грубо кажучи це коефіцієнт показує як далеко пройде світло. Якщо SpotExponent = 0, то пучок світла йде в нескінченність. Йдемо далі:


Задаємо орієнтацію прожектора і його положення в системі координат.
При зміні позицій смуг прокрутки просто міняємо компоненти кольору в джерелі. Наприклад для Ambient:

SBlightRed.position:=round(Light.Fambient[0] * 100);
SBlightGreen.position:=round(Light.Fambient[1] * 100);
SBlightBlue.position:=round(Light.Fambient[2] * 100);


Приклад 2


Найбільш повно контролюємо параметри освітлення і навіть переміщений джерело в просторі.



Все, вихідні тексти всіх прикладів цієї глави ви знайдете в каталогах Demo3-XXX



Туман


Приклад 1


Встановити підтримку туману в сцені дуже просто:

scene:TSceneGL;

scene.fogEnabled:=True;

Все інше в прикладі це установка параметрів туману:


Тип туману може бути:

fogType:=Gl_Linear;
fogType:=GL_exp;
fogType:=GL_exp2;

Мінімальна і максимальна дистанція:



Інтенсивність:


Колір для кожної компоненти RGB:


Після кожної зміни параметрів не забувайте викликати Redraw. Для нормального ефекту туману дуже важливо підібрати правильний колір фону і самого туману. Вони повинні приблизно збігатися / см картинку /.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*