Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Кафедра автоматизованих систем управління

Інформація про роботу

Рік:
2024
Тип роботи:
Збірник лабораторних робіт
Предмет:
Інформаційні технології

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти та науки України Національний університет “Львівська політехніка” Інститут комп’ютерних наук та інформаційних технологій Кафедра автоматизованих систем управління  ОПЕРАЦІЙНІ СИСТЕМИ ЗБІРНИК ЛАБОРАТОРНИХ РОБІТ Львів - 2018 Лабораторна робота №1 Тема ( Загальне розуміння операційної системи. Мета ( На прикладі роботи з OpenGL зрозуміти суть операційної системи. ТЕОРЕТИЧНІ ПОЛОЖЕННЯ Операційна система – це програмне забезпечення, яке встановлюється на електронне обладнання для забезпечення його функціонування. Наприклад, комп’ютер – це універсальний інструмент для обробки інформації. Тому і операційна система повинна реалізовувати універсальні функції – збереження файлів, запуск програм, розділення ресурсів комп’ютера між працюючими програмами. В ресурси, якими керує операційна система, входять: час процесора, оперативна пам’ять, дискова пам’ять, пристрої вводу даних, пристрої виводу даних. Розподіл вказаних ресурсів відбувається за допомогою системних функцій, які ви вивчали в курсі «системне програмування». Кожна програма має право взяти частинку ресурсів операційної системи (наприклад, виділити пам’ять) та використовувати їх на свій розсуд. Програму вибирає користувач в залежності від своїх потреб. Операційна система може працювати як підсистема загальної системи. Наприклад, Windows починала свій розвиток як звичайна програма в середовищі DOS. В сучасних системах Windows можна запускати VM-Ware – віртуальну машину з будь-якою віртуальною операційною системою, в якій можна запускати цілком реальні задачі. Сучасні смартфони також мають операційні системи, які дозволяють перетворювати їх на інші віртуальні пристрої. Ці віртуальні пристрої дозволяють: дивитись фільми по Інтернет, слухати музику, перетворювати звук на текст та навпаки, фотографувати з додаванням віртуальної реальності, знімати та розпізнавати відео, модифікувати та збагачувати звук, здійснювати відео зв’язок, визначати місцеположення, заміняти банківську картку, заміняти медичні прилади, бути проміжними серверами, заміняти дистанційний пульт, здійснювати віддалені платежі, тощо. Прості пристрої мають спеціалізовані операційні системи. Наприклад, побутова пральна машина повинна одночасно керувати мотором, вимірювати температуру, контролювати з десяток давачів, а також тримати зв’язок з кнопками та екраном на панелі управління. Програма, яку записують в постійну пам’ять контролера такої пральної машини можна вважати спеціалізованою операційною системою реального часу. Таким чином, можна зробити висновок, що операційна система завжди розширює можливості пристрою, на якому вона працює і завжди дає користувачу додаткові зручності в роботі. Розглянемо універсальну підсистему трьохмірної графіки OpenGL, яка є стандартною компонентою для всіх платформ і на основі якої можна будувати віртуальні об’єкти реального світу. Бібліотека функцій “Open Graphic Library” вперше була розроблена фірмою “Silicon Graphics” і увійшла у WINDOWS з 1990-х років. Ця бібліотека використовує прямі звернення до відео-драйверу за допомогою механізму DСI (Display Control Interface - DCIMAN32.DLL) і працює досить швидко. Для того, щоб використовувати бібліотеку функцій OpenGL необхідно створити вікно (наприклад, за допомогою функції “CreateWindowExA”). Після цього необхідно визначити графічний контекст вікна (наприклад, за допомогою функції “GetDC”) і передати його у функцію “ChoosePixelFormat”, яка дозволяє підібрати найкращій режим відображення відео-карти (ці параметри передаються в другому параметрі цієї функції як адреса структури PIXELFORMATDESCRIPTOR). В результаті виконання цієї функції регістр EAX буде містити індекс відео режиму, який найбільше підходить користувачеві, а структура PIXELFORMATDESCRIPTOR поповниться новими даними. Отриманий індекс та нову структуру PIXELFORMATDESCRIPTOR треба передати у функцію SetPixelFormat, яка буде використовувати вказаний режим відео-карти при спілкуванні з драйвером. Після вказаних дій відео-драйвер буде коректно налаштований. Наступним кроком буде створення структури графічного контексту OpenGL за допомогою функції wglCreateContext. Він потрібний для того, щоб відрізняти різні вікна OpenGL. Регістр EAX буде містити хендл цього контексту. Тепер треба вибрати один з графічних контекстів для роботи за допомогою функції wglMakeCurrent. Оскільки в нашій програмі лише одне вікно, то просто передаємо вміст регістру EAX в цю функцію. Після того, як ви таким чином вибрали вікно для роботи, всі команди OpenGL будуть спрямовані в нього. Перш за все треба задати властивості 3х-вимірної сцени, яка буде відображена у вікні за допомогою функції glEnable. Параметр GL_DEPTH_TEST в цій функції визначає, що 3х-вимірні об’єкти можуть перетинатись. Якщо необхідно задати інші властивості, то потрібно знову викликати glEnable для кожної властивості. Далі іде стандартний виклик glViewport щоб встановити всю площу вікна для спостереження сцени (див. програму). Далі необхідно встановити властивості спостерігача (або проекції сцени на екран). Переключитись в режим проекції можна за допомогою виклику: “call glMatrixMode, GL_PROJECTION”. В режимі проекції можна задати параметри відображення за допомогою gluPerspective. Зауважте, що довжина кожного параметру для цієї функції – 8 байт (для зручності коментарів ці параметри записуються в стек в явному вигляді). Стандарт OpenGL передбачає представлення всіх координат точок та кольорів в форматі дійсних чисел (real). Дійсне число можна представити довжиною в 4 байти (short real) або 8 байт (long real). Більшість функцій використовують перше представлення, але деякі – друге (наприклад, gluPerspective). Після налагодження відображення сцени переходимо до її малювання. Переключитись в режим малювання можна за допомогою виклику glMatrixMode з параметром GL_MODELVIEW. Для зручності розгляду все малювання оформлено як окрема підпрограма. Малювання починається з очищення стану за допомогою функції glClear. Далі іде традиційне встановлення початкового стану за допомогою glLoadIdentity (див. підпрограму DrawGLScene). Перед тим, як намалювати необхідну фігуру, необхідно відповідним чином змістити або повернути сцену. Переміщення виконується за допомогою функції glTranslatef з параметрами (X, (Y, (Z, де кожне значення означає переміщення вздовж відповідної осі. Поворот на певний кут ( здійснюється за допомогою функції glRotatef. Параметри наступні: ( ( кут повороту в градусах, X,Y,Z ( координати вектора навколо якого відбувається поворот. Наприклад: “glRotatef, r1, 0,p1,0” означає поворот навколо осі (OY) на кут r1. Всі параметри ( short real (4 байти). Нагадую, що (OX) ( іде зліва направо на екрані, (OY) ( уверх, а (OZ) ( від екрану до спостерігача. Вказані функції діють на фігуру лише поза зоною операторних дужок {glBegin, glEnd}; glBegin означає початок малювання фігури до якої відноситься поворот або переміщення. Після закінчення малювання фігури “glEnd” можна знову виконати поворот або переміщення сцени за допомогою тих самих операторів і намалювати ще одну фігуру. Фігури можна малювати різними методами: відрізками, трикутниками, чотирикутниками або послідовностями відрізків, трикутників та чотирикутників. Відповідний режим малювання вибирається за допомогою одного з параметрів функції glBegin, які вказані у наступній таблиці. Таблиця 9 Код Назва параметру Тип фігури  0 GL_POINTS Окремі точки  1 GL_LINES Окремі відрізки  2 GL_LINE_LOOP Циклічно замкнені відрізки  3 GL_LINE_STRIP Послідовність відрізків  4 GL_TRIANGLES Окремі трикутники  5 GL_TRIANGLE_STRIP Послідовність трикутників  6 GL_TRIANGLE_FAN Трикутники, які мають спільну вершину  7 GL_QUADS Окремі чотирикутники  8 GL_QUAD_STRIP Послідовність чотирикутників  9 GL_POLYGON Багатокутник   Кожна точка фігури має свій колір, який задається функцією “glColor3f, R,G,B” в форматі short real. Координати кожної точки в такому ж форматі задаються функцією glVertex3f, X,Y,Z. Після закінчення малювання сцени необхідно виконати glFinish і обміняти місцями відео-сторінки (за допомогою SwapBuffers), оскільки ми малювали в невидимій сторінці. ПОРЯДОК ВИКОНАННЯ РОБОТИ Запустити наступну програму: .486 .model flat,STDCALL extrn GetModuleHandleA:Proc, ExitProcess:Proc extrn CreateWindowExA:Proc, RegisterClassA:Proc, GetDC:Proc extrn DispatchMessageA:Proc, DefWindowProcA:Proc, LoadCursorA:Proc extrn ChoosePixelFormat:Proc, SetPixelFormat:Proc, wglCreateContext:Proc extrn wglMakeCurrent:Proc, glViewport:Proc, glMatrixMode:Proc extrn glEnable:Proc, glLoadIdentity:Proc,gluPerspective:Proc,glClear:Proc extrn SwapBuffers:PROC, PeekMessageA:PROC, glVertex3f:Proc, glColor3f:Proc extrn glTranslatef:Proc, glRotatef:Proc, glBegin:Proc, glEnd:Proc,glFinish:Proc WS_POPUP EQU 80000000h WS_VISIBLE EQU 10000000h WS_CLIPSIBLINGS EQU 04000000h WS_CLIPCHILDREN EQU 02000000h WM_KEYDOWN EQU 100h PM_REMOVE EQU 1 GL_MODELVIEW EQU 1700h GL_PROJECTION EQU 1701h GL_DEPTH_TEST EQU 0B71h GL_COLOR_BUFFER_BIT = 00004000h GL_DEPTH_BUFFER_BIT = 00000100h GL_TRIANGLE_FAN equ 00006h ;========================================== .data p8q dq 8.0 ; 8и-байтнi константи p45q dq 45.0 p1q dq 1.0 p1 dd 1.0 ; 4х-байтнi константи m1 dd -1.0 m4 dd -4.0 dt1 dd 0.09 ; крок повороту навколо OY dt2 dd -0.07 ; крок повороту навколо OZ r1 dd 0.0 ; кут повороту навколо OY r2 dd 0.0 ; кут повороту навколо OZ TEMP dq 0 ; робоча змiнна WndClassName db 'ABBA',0; WC dd 0023h,offset WndProc,0,0 ; структура WNDCLASS hInstance dd 0,0 hCursor dd 0,1,0,offset WndClassName hWnd dd 0 ; хендл вiкна hDC dd 0 ; графiчний контекст вiкна hRC dd 0 ; графiчний контекст OpenGL msg dd 0 msMESSAGE dd 0 msWPARAM dd 0,0,0,0,0 width dd 500 ; розмiри вiкна height dd 400 PIXELFORMATDESCRIPTOR: nSize dw 28h nVersion dw 2 dwFlags dd 25h ; прапорцi для використання OpenGL iPixelType db 0 cColorBits db 24 ;16 cRedBits db 13 dup(0) cDepthBits db 32 ;16 cStencilBits db 16 dup(0) ; R G B R G B R G B COLORS dd 0.9, 0.1, 0.0, 0.2, 1.0, 0.0, 0.5, 0.1, 1.0 dd 1.0, 0.5, 0.5, 0.5, 1.0, 0.5, 0.5, 0.5, 1.0 dd 0.8, 0.5, 0.5, 1.0, 0.7, 0.2, 0.9, 0.5, 1.0 dd 0.3, 0.6, 0.7, 0.1, 0.9, 1.0, 0.7, 0.4, 0.95 ARRAY_OF_POINTS: ; координати фiгури ; X Y Z X Y Z X Y Z dd 0.0, 0.0, 0.5, -1.0, 0.0, 0.0, -0.7,-0.7, 0.0 dd 0.0,-1.0, 0.0, 0.7,-0.7, 0.0, 0.7,-0.7, 1.5 dd 0.92,-0.38,0.5, 1.0, 0.0, 1.5, 1.0, 0.0, 0.0 dd 0.7, 0.7, 0.0, 0.0, 1.0, 0.0, -0.7, 0.7, 0.0 ;================================================ .code start: call GetModuleHandleA,0 mov hInstance,eax call LoadCursorA,0,7f00h mov hCursor,eax call RegisterClassA, offset WC call CreateWindowExA,0,eax,0,WS_CLIPSIBLINGS or WS_CLIPCHILDREN \ or WS_VISIBLE or WS_POPUP,100,100,width,height,0,0,hInstance,0 mov hWnd,eax call GetDC, hWnd mov hDC,eax call ChoosePixelFormat, hDC, offset PIXELFORMATDESCRIPTOR call SetPixelFormat, hDC,eax,offset PIXELFORMATDESCRIPTOR call wglCreateContext, hDC ; створити графiчний контекст OpenGL mov hRC,eax call wglMakeCurrent, hDC,eax ; вибрати дане вiкно для роботи ;=========================================== call glEnable, GL_DEPTH_TEST ; об’єкти можуть перетинатись call glViewport, 0,0,width,height ; встановити все вiкно для огляду call glMatrixMode, GL_PROJECTION call glLoadIdentity ; встановити початковий стан fild width fild height fdivp fstp TEMP ; TEMP = width / height push qword ptr p8q ; вiдстань до кiнця сцени push qword ptr p1q ; вiдстань до початку сцени push qword ptr TEMP ; width/height push qword ptr p45q ; кут огляду call gluPerspective ; встановити параметри спостереження call glMatrixMode, GL_MODELVIEW ;======================================== MSG_LOOP: call DrawGLScene ; пiдпрограма користувача call SwapBuffers,hDC ; обмiняти вiдео-сторiнки call PeekMessageA, offset msg,0,0,0,PM_REMOVE or eax,eax jz MSG_LOOP .if msMESSAGE == WM_KEYDOWN cmp msWPARAM,1bh ; якщо код <ESC>, то STOP jz STOP .endif call DispatchMessageA, offset msg jmp MSG_LOOP STOP: call ExitProcess,0 ;======================================== DrawGLScene proc call glClear, GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT call glLoadIdentity ; встановити початковий стан call glTranslatef, 0,0,m4 ; змiщаємося по OZ call glRotatef, r1,0,p1,0 ; повертаємо по OY call glRotatef, r2,0,0,p1 ; повертаємо по OZ call glTranslatef, m1,0,0 ; змiщаємося по OX call glBegin, GL_TRIANGLE_FAN ; малюємо з’єднанi в одну точку трикутники mov ecx,3*4 ; кiлькiсть точок в масивi mov esi,offset COLORS mov edi,offset ARRAY_OF_POINTS L1: pushad call glColor3f, dword ptr [esi],dword ptr [esi+4],dword ptr [esi+8] call glVertex3f,dword ptr [edi],dword ptr [edi+4],dword ptr [edi+8] popad add esi,12 ; колiр кожної точки займає 12 байт add edi,12 ; координати кожної точки займають 12 байт loop L1 call glEnd ; закiнчили малювати трикутники fld r1 ; змiна кута повороту по OY fadd dt1 fstp r1 fld r2 ; змiна кута повороту по OZ fadd dt2 fstp r2 call glFinish ; закiнчити малювати сцену ret DrawGLScene endp ;================================================= WndProc proc uses ebx edi esi, hwnd : DWORD, wmsg : DWORD, wparam: DWORD, lparam:DWORD call DefWindowProcA,hwnd,wmsg,wparam,lparam ret WndProc endp end start Поміняти з Таблиці 9 параметр функції glBegin і запустити програму з кожним з них. Поміняти поворот таким чином, щоб фігура оберталася навколо вісі (OX), потім – (OY), потім – (OZ). Додати в сцену ще одну таку ж саму фігуру, яка зсунута по вісі (OZ) на –0.5. Додати в сцену ще одну таку ж саму фігуру, яка повернута навколо осі (OX) на кут 180( Зробити так, щоб фігура, яка була додана в попередньому пункті оберталася відносно першої фігури навколо осі (OZ). Намалювати прямокутниками перші 4 букви свого прізвища та першу букву імені. Для цього кожний прямокутник представити як відрізок на площині з доданою координатою Z. Наприклад, відрізок (0.1, 0.2), (0.3, 0.4) перетворюється на прямокутник (0.1, 0.2, 0.0), (0.3, 0.4, 0.0), (0.3, 0.4, 1.0), (0.1, 0.2, 1.0). КОНТРОЛЬНІ ЗАПИТАННЯ Записати послідовність підготовки робочого вікна для функцій OpenGL. Як побудувати 3х-вимірну фігуру в OpenGL ? Які параметри має функція gluPerspective і для чого вона потрібна ? Які змінні відповідають за швидкість повороту фігури у просторі ? Які повинні існувати матриці окрім матриці моделі ? Як перейти від малювання трикутниками до малювання чотирикутниками ? Чи зберігається класичне управління повідомленнями в підсистемі OpenGL ? Форма звіту по роботі Звіт по роботі являє собою папку або архів з працюючими завданнями, що відповідають персональному варіанту студента. Звіт зараховується викладачем, якщо варіант співпадає з виданим завданням і студент дає усні відповіді на контрольні запитання.
Антиботан аватар за замовчуванням

29.10.2018 22:10-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!