OPENGL - ДІҢ НЕГІЗГІ ҚАСИЕТТЕРІ



Жұмыс түрі:  Дипломдық жұмыс
Тегін:  Антиплагиат
Көлемі: 55 бет
Таңдаулыға:   
МАЗМҰНЫ

Кіріспе ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. ... 4

1 ТАРАУ Delphi FOR.NET жобаларында OPENGL-ді қолдану

1.1 Құрылатын қосымшаның түрлері ... ... ... ... ... ... ... ... ... ... ... .6
1.2 Open GL кітапханасының негізгі құрылымы ... ... ... ... ... ... ... ...6
1.3 OpenGL-дің негізгі мүмкіндіктері ... ... ... ... ... ... ... ... ... ... ... 7
1.4 OpenGl – кітапханасының құрылымы ... ... ... ... ... ... ... ... ... ... 9
1.5 OpenGL-ді іске қосу ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...12
1.6 Екі өлшемді салулар ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...14
1.7 Терендік буфері ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .19
1.8 Delphідің алдынғы нұсқауларындағы ОpenGL ... ... ... ... ... ... ... .23
1.9 Delphi.NET жобаларындағы OpenGL ... ... ... ... ... ... ... ... ... ...31

2 ТАРАУ OPENGL-ДІҢ НЕГІЗГІ ҚАСИЕТТЕРІ

2.1 Хабарлар, аударымдар, жағдайлар ... ... ... ... ... ... ... ... ... ... 37
2.2 Неліктен Delphi қосымшасында үлкен өлшем болады ... ... ... ... .40
2.3 Delphi- де VCL-сіз программалау ... ... ... ... ... ... ... ... ... ...41
2.4 Open GL типтері (түрлері) ... ... ... ... ... ... ... ... ... ... ... ... ..43
2.5 OpenGL-дің құралдарымен Delphі компоненттерін шығару ... ... 48
2.6 OpenGL-дің матрицалары ... ... ... ... ... ... ... ... ... ... ... ... .52

Қорытынды ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. ..58
Пайдаланылған әдебиеттер ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .59

КІРІСПЕ

Бағдарламалаушы қосымшаны жасауға кіріскенде, оның алдында: “өз
компоненттерімді құрсам ба немесе басқа жасаушының компоненттерін қолдансам
ба”,-деген сұрақ туындайды. Әрине бұл нақты жағдайға байланысты. Бірақ
дайын шешімдерді қолдану басынан бастағаннан тиімдірек деп ойлау қате
болады.
Сапалы бағдарламалық қамтамасыз ету қолданушылық және бадарламалық код
деңгейінде жақсы ойластырылған интерфейсімен ерекшеленеді.
Әсіресе, бұл сұрақ визуалдау мен графиканың өнімділігі жоғары
құрылғыларын қолдануды қажет ететін графикалық қолданушылық интерфейсті
(GUI) ұйымдастыру кезінде туындайды.
Сапасы жоғары графика қосымшаның сыртқы көрінісі мен деңгейін
(дәрежесін) айтарлықтай жақсартады, бірақ оны қолдану бағдараламалаушыдан
ерекше білім мен тәжірибені талап етеді. Басқа жасаушылардың компоненттері
өкінішке орай, көбінесе тек пайдасыз болып қана қоймай, олар негізделген
алгоритмдер мен бастапқы принциптерді меңгеру мен түсіну қажеттілігіне
байланысты жұмыстың орындауына үлкен кедергі жасайды, ал бұл жағдай
коммерциялық (ақылы) жобаларды жасауға мүлде рұқсат етілмеген болып,
күтпеген нәтижелерге алып келуі мүмкін. Кәсіби графикалық компоненттерді
қолдану тек бағдарламалаушы жеткілікті білімге және осы компоненттерді
құруда қарастырылатын сұрақтарды меңгерген болса ғана қолдануға болады.
Қарапайым қосымшаны жазған кезде көпшілігі тегін болса да қандай да
бір ерекше талаптарды орындайды, мысалы код авторлығы туралы хабарламаны
талап ететін үлкен көлемге ие және қолайсыз компоненттерді қолдану қажет
емес.
Open GL компьютерлік графика саласындағы стандарттардың бірі болып
саналады. Бүкіл әлемдегі қолданушылардың сенімін ақтаған қосымшалардың
үлкен саны дәл осы бағдарламалық құрылғының көмегімен графикалық ақпартты
шығаруды жүзеге асырады. Open GL кітапханасы қолдануды қарапайым және бір
уақытта тиімді етіп жасалынған, сондықтан ол осы салада кейінірек шыққан
бағдарламашылар мен бірге жаңа бағдарламалық қамтамассыз етуде қолданылады.
Open GL негізінде (әртүрлі) күрделілік деңгейі әртүрлі қосымшаларды
құру компоненттернің саны өте көп. Бірақ, олардың басым бөлігі С, С#, Java,
Visual Basic, Phiton сияқты бағдарламалау тілдерні қолданып жазылатындығын
атап өту қажет. Delphi-де орындалатын Open GL-ге негізделген компоненттер
саны, әсіресе, Delphi for Net-тің 8, 9, 2005, 2006, 2007, 2009
нұсқаларындағы жаңартылған пакеттерде өте аз болады.
Бұл жұмыста Open GL-дің графикасын қолданығысы келетін Delphi-ді
қолданатын бастапқы бағдарламамен Интернет желісінде қысқа баяндалады.
Желнің әртүрлі форумдарында берілген бадарламаушылардың Open GL-ді Net
Freamwork-қа өткеннен кейінгі Delphi-дің жаңа ортасында құру туралы
сұрақтарын жауап берушілер басқа өңдеушілердің сайттарына жібереді.
Сондықтан жұмыстың нақты мақсаты Delphi.Net жобаларында Open GL
графикалық кітапханасының қолдану негіздерін түсіндіру болып табылады.
Win32-нің ең аз бастапқы кодқа ие демонстрациялық (көрсету) қосымшалары
толығымен қарастырылған.
OpenGL (Open Graphics Library) ашық графикалық стандарт, яғни ашық
және жылдам жылжымалы стандарт деп айтсақ та болады. OpenGL стандарты
негізінде жазылған бағдарламаларды барлық платформаларға (граф.комп.,
дербес, серверлер, үй, суперкомпьютер және т.б.) қолдануға болады. Осы
барлық жағдайда да, бірдей шешім шығады. OpenGL библиотекасы бағдарлама
түзушіні көптеген әртүрлі компьютерлер үшін әртүрлі графикалық бағдарлама
түзуден босатады. Компьютердің ішіндегі жабдық кез келген функцияны орындай
алса, осы функция апаратты түрде (видеоадаптер VGA) орындалады болмаса
OpenGL библиотекасы ол функцияны бағдарлы түрде орындай алады.
Ендеше OpenGL дегеніміз не? – деген сұраққа жауап берейік: Бағдарлама
түзушінің тілімен айтатын болсақ, OpenGL ол – графикалық құрылғылар үшін
(графикалық жылдамдатқыш-видеоадаптер) арналған бағдарлама. Ол интерфейстің
ішіне бағдарлама жазушы үшін арналған шамада 150 командасы бар негіз
кіреді. Қарапайым тілмен айтқанда, сол 150 команданың көмегімен
программист үш өлшемді кеңістіктің ішінде түрлі обьектілерді белгілеп,
олардын орналасу бұрышын градусын, түсін, текстурасын, материалын,
бақылаушының орналасу нүктелерін белгілеп, және т.б. амалдарды жасай алады.
Ал OpenGL библиотекасы осының барлығын экранға шығару жұмысын атқарып
(рендеринг) жасап береді. Осымен OpenGL библиотекасы үш өлшемді
объектілерді экранға шығару функциясын атқарады деп шешім шығардық.
OpenGL ішкі құрамы терең ойластырылған структурадан және қарапайым
процедуралық интерфейстен құрылған. Оған қарамастан OpenGL – дің көмегімен,
басқа графикалық библиотекалармен салыстырғанда, қиын және үлкен бағдарлама
комплекстерін аз уақыт ішінде құруға болады.

1 ТАРАУ DELPHI FOR.NET ЖОБАЛАРЫНДА OPENGL-ДІ ҚОЛДАНУ

1. Құрылатын қосымшаның түрлері

Delphi мен біреге (көптеген) қызіргі бағдарламалау тілдернің
көпшілігінің жаңа Net Freamwork технологиясын қолдануы, бағдарламаның
тәсілдерін қайта қарастыруға алып келеді.
Borland корпорациясы ұсынған VCL кітапханасы Delphiдің 8-ші нұсқасына
дейін қолданып, өзін ақтамады. Жасаушылардың еңбектеріне қарамастан, бұл
кітапхананың компоненттері қосымшаларды жасаудың стандарты бола алмады,
сонымен қатар көптеген тәжірибелі сарапшылардың айтуынша, VCL коды кейбір
белгісіздіктерден қаралған, әрине сонымен бірге NET Freamwork жүйесі өте
тиімді болады. Осыған байланысты әртүрлі бөліктелген обьектілі бағытталған
бағдарламалау тілдерін қолдайтын компаниялар Microsoft-тың кез-келген өңдеу
пакетінен алдын-ала компиляциялаудан орындауға болады, бірегей жүйелі JL
тілін құру туралы ұсыныс қабылдады. Borlandтың өкілдері көп рет айтқандай,
VCL.NET кітапханасы ескі нұсқасы жобаларды NET жобаларын ауыстырудың
қолайлы құралдары ретінде Delphiдің жаңа нұсқаларын жүзеге асырылды.
Өңдеудің жаңа ортасын меңгерумен бір уақытта орындалатын мұндай ауысу
бағдарламашылардың біраз уақытын алуы мүмкін.

2. Open GL кітапханасының негізгі құрылымы

Open GL-дің құрылымы қарастырайық.
Кітапхан C:\WINDOWS\SYSTEM32\Opengl32.dll жүйелі бумасында орналасқан
және Microsoft Windows операциялық жүйесімен бірге жеткізілетін
Opengl32.dll файылында орналасады. Бұл файлда қосымша жұмыс істеуі қажет
болған Open GL-дің негізгі типтері, процедуралары мен функциялары
сипатталады бұдан басқа жиынтықта C:\WINDOWS\SYSTEM32\gen32.dll файылында
орналасқан Open GL Utility компоненті де болады. Бұл қолданбалы
бағдарламаларды да қолданылатын Open GL-дің есептерін орындауға арналған
утилиттер (функциялардың) жиынтығы. Бағдарламалаушыға C:\WINDOWS\SYSTEM32
жүйелі бумасының (папка, қалта) құрамын тексеріп, осы екі файылдардың бар
екеніне көз жеткізу ұсынылады.
Open GL(байынша)-дің кейбір дереккөздерінен графиканы шығарудағы
интерфейстің негізгі элементі болған тереземен және т.б-мен жұмыс жасауға
арналған құралдар жиынтығынан тұратын GLNT кітапханасына берілген сілтемені
табуға болады. Бірақ бұл стандартты компонент емес және оны Интернет желісі
арқылы алуға болады.
Opengl32.dll мен gln32.dll файлдарында сіздің қосымшаңызбен (тұтынушы,
клиент, қолданушы) Open GL жүйесі (сервер) арасындағы ақпарат алмасуға
арналған функциялар сипатталады. Қосымша OpenGL жүесіне қандай графикалық
ақпаратты құру және қай әдіспен құру туралы сәйкес командалар жинағын
құрады, ал Opengl операциялық жүйе арқылы компьютердің аппараттық
құрылғыларымен байланысады және қалыптасқан графикалық ақпаратты шығаруды
жүзеге асырады. Кітапхананың ерекшелігі, онда компьютер платформасымен
байланыс болмайды және нақты графикалық құрылғылар немесе олардың
модельдерінің сипаттамасы болмайды. Кітапхана тек бағдарламалаушы өз
жиынтығынан ғана құралады, сонымен қатар ол қосымша, операциялық жүйе және
графиканы бейнелеудің шеткі құрылғысының арасындағы өзіндік “делдалдық”
қызмет атқарады. Графикалық құрылғымен жақсы байланыс орнату үшін OpenGL-
дің серверіне кем дегенде екі обьект-жанама құрылғыға сілтеме мен пикселдің
форматы туралы мәлімет қажет болады. Device Context құрылғы контексті нақты
жүйенің графикалық режимімен үзінділері туралы мәліметтерден құрылған
құрылым болып табылады. Бұл құрылым стандартталғандықтан, ол арқылы
графикалық ақпаратты салуға арналған құрылғыны көрсететін Rendering Context
орындау контекстінің сілтемесін орнатуға болады, cілтемені орнатуға болады.
Бұл контекст opengl-дің жұмыс жасауы үшін өте қажет болып табылады.
Құрылғы контекстіне сілтеме НДС типті шама болады, ал, орындау
контекстінің сілтемесі - HGLRC болады.
Келесі бөлімді жазудың маңызды бір себебі бар. Delphі, Net-ке өту.
Бағдарламалаушыларға Windows Forms қосымшасын құруға мүмкіндік берді,
бірақ Delphі-дің алдыңғы модульдеріне мыс: Windows.pas. модулін қосу
мүмкіндігі жоғалды. Сондықтанда, біздің қосымшаның жұмысын ұйымдастыратын
код блоктарын Delphі, Net арасындағы келісімді көп рет қолданып, өзіміз
жаңадан жасауымыз қажет.

1.3 OpenGL-дің негізгі мүмкіндіктері

Кейбір OpenGL бибилиотекаларының ішіне (мысалы X Windows) үш өлшемді
кеңістігін бір ғана экранда шығара қоймай, ол үшін LAN байланысын қолданып,
басқа да машиналарда шығару мүмкүндігі кіреді. OpenGL командасын беруші
компьютер – клиент аталып, ал командаларды қабылдп, орындап, экранға
шығаратын компьютер сервер аталады. Осы байланыстын негізінде бір-бірімен
байланыста болған компьютерлерді қолданып, мықты бағдарлы серверлік
комплекстерді құруға болады.
OpenGL-дің негізгі мүмкіндіктері төмендегідей:
• Геометриялық және растрлық (түрлі-түсті) негіздер, осынын арқасында үш
өлшемді объектілер құрылады. Библиотека қарапайым – нүктелер,
кескендер, полигондарды шығару мүмкіндігін береді. Растрлық(түр-түс) –
биттік өлшем, түр (дененін көрінісін) бреді.
• В-сплайндарды қолдану – нүктелер арасынан қисық сызық сызу қабілеті
• Түрдік және модельдік құрылымдар – олар арқылы кеңістікте үш өлшемді
денелерді (модельдерді) орналастырып, оларды бұрып, жалжытып, формасын
өзгерту қабілеті.
• Түспен жұмыс – OpenGL библиотекасы бағдарламашыға RGBA (қызыл-жасыл-
көк-альфа) түстерімен жұмыс ісей, палитрадағы барлық бояуларды
қолдануды әзіреу қабілетін береді.
• Көрінбейтін сызықтарды және денелерді жою қабілеті (Z-буферизация).
• Екілік буферизация – Денелерді экранға шығарған кезінде, экранның беті
жалпылдамауы үшін қолданылады. Мұнда әр кадрдағы сызба, бірінші
буфердің ішінде сызылып, кейіннен ғана экранға шығарылады. Сонда экран
жалпылдамай, плавно көрсетеді.
• Текстура құру. Объектіге шындық көрінісін береді. Мысады домалақ
объектінің сртына сурет орналыстырылады (түрлі-түсті доптың суреті),
сондағысы қарапайым қара кеңістіктегі шарымыз – түрлі түсті шарға
айналады.
• Туралау. Объектінің үстінде, жан-жағындағы қисық сызылған ойық немесе
қырларды туралау қабілеті. Туралау – объектінің кескіннің шеттеріндегі
пикселдерді (нүктелерін) жарықтығын азайтып немесе көбейтудін
арқасында өзгертеді.
• Жарық сәуле беру. Кеңістікте жарық көздерін орнату – жарық нүетесін
жан жақты орналастыру, жарықтығын жоғарлату, пәсейту, түр-түсін
өзгерту қабілеті.
• Ауа райы құбылыстары. Тұман, түтін, т.б. ауа райы құбылыстарды еңгізу
қабілеті.
• Объектілерге айқындық қабілет беру.
• Суреттердің тізбелерімен жұмыс.
Қосымша OpenGL библиотекаларды қолдану
Модельдеу үшін OpenGL библиотекасында барлық мүмкіндіктердің барлығына
қарамастан, үш өлшемді сахналарды модельдеу кезіндегі кейбір функциялар
жетпейді. Мысалы үш өлшемді еңістіктегі сахна камерасының орналасу
нүктесін, бұрыш нүктесін, биіктігінің модельдік матрицасын құру кезінде өте
қиын есептер қажт етіледі, сондағы осы есепту әркімнің қолынан келе
бермейді. Осыған байланысты OpenGL үшін жәрдемші есебінде библиотекалар
құрылған.
Солардын бірі GLU атты бибилиотека болып келеді. Осы библиотека
стандартқа айналып, барлық бағдарламаларды OpenGL стандартты библиотекамен
бірге келеді. Осы библиотеканың құрамын едәуір қиындау функциялар
енгізілген. Осынын көмегімен цилиндірдің немесе дисктің денесін анықтау
үшін тек бір ғана команда қолданылады. Және де осы библиотеканын құрамына
сплайндармен жұмыс істеу мүмкіндігі енгізілген. Көмекші матрицамен,
проекциялармен жұмыс істеу функциялары енгзіліп, толықтырылған. Кейінгі
қарастырылатын библиотека – GLUT. Бұл да платформаға байланысты емес
библиотеканың бірі болады, OpenGL-дің көмекші құралы болып келеді. Бұл
библиотеканың мүмкіндіктерінін арқасында пернейтақта және тышқанмен жұмыс
істеуге болады. Осы библиотеканың көмегімен конус, тетраэдр, және т.б. қиын
фигураларды анқтап шығаруымызға болады. Бұл жерде GLAUX мынау GLUT мынаудан
жаман деп жатыр ғой. өйткені GLAUX мынау тек Windows-пен ғана жұмыс
істейді. GLUT ал мынау барлық платформалармен байланыста бола алады.
Қазіргі кезде көптеген библиотекалар шығарылып, қолданылып жатыр. Олар
әртүрлі қиын іс әрекеттерді орындауға бейімделген, және OpenGL
библиотекасына көмекші ретінде келеді. Мысалы GLX - X Windows үшін
қолданылатын Windows OpenGL көмекші құралы болы келеді. Оның міндеті тек
бір ғана компьютерде объектілерді шығармай, LAN (сетевое окружение)
байланысы арқылы басқа компьютерлердің экрандарына шығаруы.

1.4 OpenGl – кітапханасының құрылымы

Төменде көрсетілген 1.4.1-сурет Book3D – атымен сақталған Delphi
проектісінде компьютерлік графика бағдарламасын OpenGl арқылы қолдану
кітапханасы.
Book3D – бағдарламасы бірнеше құрылымдарардан тұрады.
1. Book3D – редактор, программа коды орындалу барысында нәтижесін
көрсетеді.
2. Листинг программасы (код) – параметрлерді өзгеру барысында
немесе нақты уақытта ағымдағы листингтің кодының мәні бірден
өзгеретін және сол мезетте Book3D редакторында көрінетін
командалар мен функцияларының орындалуын көрсетеді.
3. (Help) Листингте қолданылатын процедуралар мен командалар
анықтамалығы.
4. Глоссарий – бұл жерде OpenGl командалары мен оның толық
сипаттамасы жиналған. Барлық командалар алфавит бойынша реттелген.
Командаларды мәні бойынша іріктеу үшін Мәнді бойынша реттеу шертсек
болғаны, бұл керекті команданы немесе функцияларды табу үшін жасалған.

1.4.1 сурет. OpenGL кітапханасының командалардың қызметі мен
түсіндірмесі.

OpenGL-ді үйрену – оқу бағдарламасы таңдалады.
Түсініктеме – бастамаларға өту (экранның сол жағында).
Бағдарламалар коды – команда анықтамалығы (бірінші бөлім – мұнда
таңдалған оқу бағдарламасының тексті толтырылады).
Бағдарлама – бұл бөлім оқу бағдарламасын таңдағанда активті болады.
Мұнда 5 ішкі пункт орналасқан.
1. Программа кодын орындау - оқу бағдарламасында таңдалған ағымдағы
код орындалады, осы ішкібөлімді таңдағанда “Басты терезе”
бастамасына өтеді, бұл кезде “ OpenGL-ді үйрену ” бөлімі
активтелмеген болады, “ПРограмманы тоқтату” ішкібөлімді орындағанда
активтеледі.
2. ПРограмманы тоқтату – бағдарлама орындалуы тоқтатылды. “OpenGL-ді
үйрену ” бөлімінен келесі оқу бағдарламасын алуға болады.
3. Бағдарлама кодын сақтау - бағдарлама кодын HTML немесе TXT
фарматты файл түрінде сақтайды.
4. бағдарлама кодын баспадан шығару – стандартты баспа диалогын
шығарады және орнатылған принтерден баспаны шығарады.
5. Book3D-редактор - в файл – Book3D – редакторды JPG және BMP
фарматты графикалық файыл түрінде сақтайды.
Жүктеу - әрқашан қолайлы 2 ішкі пунктен тұратын пункт мәзірі.
1. Соңғы программаны жүктеу – соңғы оқылған программаны жүктейді,
ұмытқан жағдайда өте ыңғайлы.
2. Book3D+HTML программасын жүктеу –Book3D бағдарламасында
Программа\Сақтау код программасы арқылы алдын ала сақталған программа
жүктеледі. Файл типін сақтау кезінде міндетті түрде Веб-страница HTML
форматта таңдалады.
Жөндеу – шрифт өлшемін өзгертуге, құжат түсін таңдауға болатын және де
хинттарды қосу\өшіру мүмкіндігі бар диалогты терезе ашылады.
Программа туралы – Book3D бағдарламасының авторы туралы қысқаша
мәлімет.
Интерфейсті сипаттау. Барлық интерфейс шартты түрде екі сплиттерге
бөлінген (түсті кесінді программанның екі облысына бөлінген: программаны
қосқанда ортаға шығатын тік сплиттер, (сол бөлігінде) ортадан сәл
төменіректе шығатын көлденең сплиттер). Сплиттерді ауыстырумен қалауымызша
терезенін енін реттеуге болады.
Программанның сол жақ бөлігі үш белгіден тұрады:
Негізгі терезе – бұл программаның ең негізгі бөлімі, ол мыналардан
құралады:
Book3D-редактор - программанның коды орындалуының жұмыс нәтижесін
көрсетеді, ал оң жақ терезеде орналасқан Программа коды және Help
қосымшаларында тексті көрсетілген.

1.4.2 сурет. OpenGl командаларын өзгерту панелі.

1. Көрсетілген тізім команда параметірлерін өзгертуге арналған қолайлы
команда таңдалған, Ал жақша ішінде командаларға қысқаша түсінінік жазылған.
2. Цифр, текст кодында командалардың реттік номері көрсетілген.
3. Ауыстыру кнопкасы - 1-ші пункте таңдалған тексттік кодта бірдей
командалар бойынша орналасқан.
4. Ағымдағы командалардың параметірлерін өзгерту - өзгеру Book3D-
редактор терезесінде бірден көрінеді, бірақ программа коды өзгермейді,
кодты өзгерту үшін Программа кодында команда мәнін өзгерту кнопкасын басу
қажет.
5. Ағымдағы кез-келген командаға түсіндірмелерін өзгерту және қосуға
болады.
Коментарий – (түсіндірме) бұл белгіде оқу программасында таңдалған
кеңестер мен түсіндірмелерге нұсқау берілген.
Программа кодын салыстыру терезесі – бұл жерде барлық оқу программа
текстін көруге болады және таңдалған программаның айырмашылығын табуға
болады. Сонымен қатар программаны HTML, PAS және TXT форматта жүктеуге
мумкіндік бар.
Программанның оң жақ бөлігі екі белгіден тұрады:
1. Программа коды және Help командаларға көмек – жоғарғы бөлігінде
таңдалған оқу программасының коды көрсетілген. OpenGl командалары
гиперссылка түрінде көрсетілген, гиперссылканы таңдау барысында төменгі
бөлігінде ақпарат мәліметін шығарады. Төменгі және жоғарғы бөліктің
арасында белгінің бөліктерінің көлемін өзгертуге болатын сплиттер
орналасқан.
2. OpenGl-дің барлық командалары – бұл жерде OpenGl командаларының барлық
оқу программаларын қолданылатын ақпарат мәліметтері бар.
1.5 OpenGL-ді іске қосу

Оқиға , хабарлау , сілтеме. " Оқиға " ұғымы Delphi-ді қолданатын әрбір
бағдарламашыға таныс. " Хабарлау " термині тікелей Delphi концепциясында
қолданылмайды. Бұл өте жиі синонимдер операциялық жүйе терминімен бірдей,
қосымшалармен (терезелермен) сигналдарды жіберу арқылы қатынасушысы.
Код , Delphi жобасында жазылған OnCreate оқиғалары өңдеуші сияқты,
WM_GREAT хабарын алғанда орындалады, сондай-ақ WM_PAINT хабарлрына
OnPaint оқиғасы сәйкес келеді және т.б.
Сондай оқиғалар - операциялық жүйелердің хабарлардың ұқсастығы,
мнемониканы қолданады, хабарлаулардың мнемоникасымен ұқсас келеді, сондай-
ақ хабарлау " WM _"( Windows Message ) префикстен басталады, ал ұқсас
оқиға " On " префикстен басталады.
Барлық терезелердің өз құруында операциялық жүйеде тіркеледі және "
терезеге сілтеме " деген бірегей идентификаторды алады. Мына мөлшер үлгісі
Delphi-де – HWND ( Handle WiNDow ). Терминнің синониміне " сілтеме "
дескриптор болады.
Терезеге сілтемені тек қана операциялық жүйемен емес сонымен бірге
терезенің идентификациясына арналған қосымшалармен қолданыла алады, олар
амалдар шығару қажет.
Нақтылы түрде күрделі емес үлгіде терезеге сілтеме мысалын байқап
көреміз.
Delphi ең аз қосымшасын құрастырып және жаңа жобаны бастаңыздар.
Форманы Form2 деп атап, оған кнопка орнатамыз. Оқиға өңдеушісі OnClick
кнопкасын басып келесі түрге келтіреміз. (1-Ех-01)
procedure TForm2.ButtonlClick(Sender: TObject);

var
H : HWND; терезеге сілтеме
begin
H := FindWindow ('TForm1', 'Form1'); терезені іздейміз
If H 0 then ShowMessage ('Есть Form1!') терезе табылды
else ShowMessage ('Нет Form1!') терезе табылмады
end;

Енді кнопканы басқанда хабарлау береді, терезесі тобы ашық па, 'Form
1' тақырыбының бар болуы, операциялық жүйеде 'TForml 1' қалай тіркелгенді.
Егер біздің екі бағдарламаларымыз бір уақытта жіберілсе, онда кнопканы
басқанда бір хабарлау берілген болады, ал егер терезе 'Form 1' тақырыбымен
жабық болса, онда ол басқа. Біз ол жағдайда FindWindow функциясын
қолданамыз, табылған терезеге сілтеме - HWND типі қайтарушы мөлшерін, егер
сондай терезе табылмаған жағдайда нөл жазамыз. Функциялар аргументі –
терезенің тобы немесе оның тақырыбы. Егер ізделіп отырған терезе тақырыбысы
қажетсіз болса, екінші аргументке nill беру керек.
Сонымен, терезеге сілтеме бір мағынада терезені анықтайды. Handle
түрінің қасиеті – бұл сілтеме, ал дәлдікте THandle типі HWND типіне сәйкес
келеді, сондықтан алдындағы үлгіде Н өзгергішті Thandle типінің өзгергіші
сияқты суреттеп айтуға болады.
Терезе фокус болмай жасай алады, хабарлаулар алу және оларды
әрекеттендіру. Нақтылы үлгіде мысал келтіреміз.
OnMouseMove формасын өңдеуші оқиғаны келесі түрге келтіріңіздер: (1-Ех-02)

procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer) ;
begin
Caption := 'x=' + IntToStr (X) + ', y=' + IntToStr (Y) X, Y -
координаты курсора
end;

Тышқан курсоры қозғалысы кезінде форма тақырыбында оның координаталары
шығады.
Бағдарламаның екі көшірмесін жіберіңіздер және назарды салыңыз,
терезенің фокустың жоқ болуы сонымен бірге анықталмаған. Терезеге
сілтеменің болуы - қосымша оларға - кез-келген( дерлік ) әрекетпен,
жолымен оған хабарлауларды жібере алады.
Кнопканы шерту арқылы кодын өзгертеміз: (1-Ех-03)

procedure TForm2.ButtonlClick(Sender: TObject);
var
H : HWND;
begin
H := FindWindow ('TForml', ' Forml');
If H 0 then SendMessage (H, WM_CLOSE, 0, 0)табылған терезені жабу
end;

Неге Delphi қосымшалары үлкен мөлшерлі болады.
Ең аз қосымша , Delphi –дің әртүрлі версияларында жасалған, 170 290
Кбайт шейін жете алады. Бұл өте үлкен цифр Windows операциялық орталары
үшін, С++ құрастырушыларында ол ақырғы 40 Кбайтты құрастырады, Әрине бұл
апатты проблема емес, қашан жинақтағыштардың сыйымдылықтары гигабайттармен
өлшенсе, және орта пайдаланушы, файл мөлшеріне назар аудармаңыздар.
Ыңғайсыздық қосымшалардың желі арқылы таратылуы кезінде пайда болады.
Пакеттердің қолдануы масштаб жобаларға арналған проблема өткірлігін
маңызды шешеді, бірақ қосымшаның жиынтық салмағы және қолданылатын пакеттер
бәрі-бір маңызды.
Delphi арқылы қосымшаларды жазу жеңіл, мысалы интерфейстік элементтер
кез-келген типін динамикалық түрде жасалады.
Бірақ орта деңгейлі қосымшаларды қолданбайды және бұл қуатты
мүмкіншіліктерге мұқтаж болмайды. Ал компиляция жасалған модуль өзіне
барлық кодты құрайды, Delphi қасиеттермен және объектілердің әдістерімен
амалдар мен әрекеттер дәл осылай жеңіл өндіру арқасында жүзеге асады.
Мысалы , егер компиляция жасалған модульді көріп шығу кезінде, онда біз
оған сөйлемнің, фразаның өзіне меншікті операциялық жүйенің бар болуын,
мысалы, " OnKeyDown " немесе Delphi . басқа терминдерін көре алмыз.
Мұнда нағыз жұмыс – құрастырушы емес , Delphi құрастырушысы кодты
ықшамдайды. Тек қана Delphi кітапханасын қолдануынан қабылдамауы арқылы
кардиналдың проблема шешіледі.

1.6 Екі өлшемді салулар

Примитив және атрибуттар
Компьютерлерде істейтін көп мамандардың арасында Примитив деп нені
санау керек?, және Қандай примитивтерді АРІ-дің құрамына келтіруге
болады? деген сұраққа көптеген әңгімелер жүргізіледі. Бірақ бұл сұраққа
ортақ жауап айту қиын болатыны мәлім. Минималисттердің көзқарасы бойынша,
прмитив деп графикалық системада тек апаратты жолмен құрылған объектілерді
атауға болады деген болжам бар. Бұдан орай примитивтер жиынтығы тек
ортогоналді түрде келу керектігі айтылады, қарапайым айтқанда, осы
элементтердің құрамын басқа элементтерден алуға болмайды деген сөз.
Минималды жүйенін құрамына әдетте тек қана кесінді, көпбұрыш және
кейбір әріптер жиыны кіреді. Осы жүйедегі барлық элементтер апаратты түрді
қолайлы пайдалануға болады. Оған қарсы максималисттердің пікірлері
бойынша - графикалық жүйе құрамына домалақ, әртүрлі қисық сызықтарды тағы
басқа да түрлі объектілерді енгізу керек. Аргумент ретінде жүйені
қолданушынын тыйымды жақтары алынады, өйткені осы көптеген объектілерді
қолмен программалы түрде құрудан босатылады. Осы мәселе көптеген дамыған
графикалық орталарда қарастырылады. Бірақтан апаратты түрде көптеген
примитивті объектілермен жұмыс істейтін графикалық станциялар аз
болғандықтан, осы коптеген жиындарды қолданатын программаны бір
платформадан екіншісіне аударуға қиынға соғады.
Осы пікірайқастын ортасында OpenGL-ді құрушылар ең қолайлы орын алды.
Бастапқы бибилиотеканын құрамын бірнеше ғана примитивтердің жиынтығы кіріп,
ал көмекші GLU бибилиотекасынын құрамына қиын объектілерді құрайтын
функциялар орналасқан. Бастапқа OpenGL примитивтері деп – төбе
кеңістіктегі нүктелер жиынтығын айтсақ болады.
Объектілерді анықтау түрі төменде берілген:

glBegin(ivw7);
glVertex*(...)?
glVertex*(...);
glEnd();

ivw7 көрсеткіші объектінің түрін анықтап, OpenGL-ге төбелер тізімін
орнату ақпаратын алып келеді. glBegin() және glEnd() операторлары арасына
OpenGL-дің басқа функцияларды шақыртатын операторлардын орналасуы мүмкін.
Мысалыға, төбелердің орналасу координаталарын немесе қосымшаларын анықтап
беретін функцияларды шақырту оперлаторлары, т.б. Әртүрлі примитивтердін
бірі-бірінен айырмашылығын олардын ішкі құрылысынан ажырата білсек болады.
Барлық примитивтер (нүктелерден басқа), төбелердін немесе кесінділердін
жинақталуынан анықтап алынады. Негізі кесеңдіні де примитивтер қатарына
орналастырсақ болады, өйткені ол екі төбеден құралып, көптеген
объектілердін құылуында маңызды рөл атқараып отырады. Кесіндіні кеңістікте
орналасқан екі нүктені біріктіру үшін қолдансақ та болады, немесе берімен
бірін қосып фигуралардың ішкі немесе сыртқы құрылысын анықтасақ болады.
(GL_LINES) кесінділері
GL LINES түрі кесіндінін екі төбеден құрылғандығын анықтап беретін,
және оның бас нүктесі мен аяқ нүктелерінін орналасуын береді. Осы әдіспен
құрылған кесінділер бір нүктеде қиылыспайтынын ұғуымыз қажет.
Сынық кесінділері (GLLINESTRIP)
Бірімен бірі қосылып келетін кесінділерді қолданып, (polyline) – сынық
кесіндіні анықтауымыз үшін GL LINE_STRIP түрін қолдансақ болады. Көбінде
мұндай сынық сызықтар қисық сызықтардың аппроксимациясы үшін қолданылады.
Егерде жабық контур алуымыз керек болса бастапқы және соңғы төбені бір етіп
көрсетуге болады, немесе арнайы жабық сынықты анықтап беретін түрді
қолдансақ болады GL_LINE_LOOP. Осы жағдайда OpenGL бибилиотекасы өзі
кесінді арқылы соңғы төбені тізімдегі бірінші тұрған төбемен
байланыстырады.

Түстін (түрін) атрибуттарын анықтау
Біз түрлі варианттарда қарастыратын Серпинский оюын құрайтын
программаның ішінде толықтүсті RGB түсөзгертуді басқару жүйесі
қолданылады. Осы бағдарламада үш мәнді өзгертуіміз қажет. Біріншіден
{clear color) функциясы шақыртылып, экранның беті тазартылады.

glClearColor():
glClearColorA.0, 1.0, 1.0, 1.0);

Бұл мән көптеген програмисстерге таныс {background color) функциясына
ұқсас болып келеді.
Нүктелердің түсінің көрінісі glColor3f () функциясы арқылы
орнатылады.
Төменде келтірілген оператор арқылы келе жатқан түс орнатылады.
glColor3fA.0, 0.0, 0.0);
Примитив нүктенің өлшемін өзгертсек те болады. Бұны OpenGL-дегі
glPointSize() функциясы арқылы жүзеге асырамыз. Төмендегі келтірілген
оператор нүкте примитивінің размерін 2 пикселге тең етіп орнатады.
glPointSizeB.0);
Графикалық элементтердің (объектілердің) мәндерін – нүкте үлкендігі,
сызық қалыңдығы, т.б. екі пикселдің өзгеруімен анықталатынына мән беруміз
қажет.
Осымен әртүрлі мониторлармен жабдықталған компьютерлерде бағдарлама
орындалған кезде, біршама өзгерген объектіні көрсек болады.
Бірқатар графикалық АРІ-лерде барлық өлшемдер бірлік жүйесі бойынша
беріледі. Олар апараты жабдықтаудан егеменсіз болып келеді. Бірақтан ондай
әртүрлі платформаларда бірдей тұрақталған көріністі алу қиынға соғады.
OpenGL ді құрушылар мұндай есепке оңайырақ шешім тауып шықты.

Нүктелер мен кесінділер
Нүкте. OpenGl – облысының сол жақ төменгі бұрыш координаталары [-1;
-1], оң жоғары бұрышы координаталары [1, 1] болады. Ең қарапайым нүкте
салудан бастаймыз. Экранда бес нүкте, төртеуін төрт бұрышқа біреуін центрге
саламыз.

glViewPort (0, 0, ClientWidth, ClientHeight); область вывода
glPointSize (20); нүктенің өлшемі
glColor3f (1. 0, 1. 0, 1. 0); кескіннің түсі
glBegin (GL_POINTS); командалық жақшаны ашамыз
glVertex2f (-1, -1); сол жақ төменгі бұрыш
glVertex2f (-1, 1); сол жақ жоғарғы бұрыш
glVertex2f (0, 0);
glVertex2f (1, -1);
glVertex2f (1, 1);
glEnd; SwapBuffers(Canvas. Handle)

Кесінді. Нүктеден енді кесіндіге өтеміз. Келесі мүмкіндікті
қарастырамыз. Константа Gl_LINES – кесінді функциясы.

glBegin (GL_LINES);
glVertex2f (-1, 1);
glVertex2f (1, -1);
glVertex2f (-1, -1);
glVertex2f (1, 1);
glEnd;

Терезеде диоганал бойынша бұрыштарды біріктіретін екі кесінді
сызылады. Кесіндінің қалыңдығын үлкейту үшін командалық жақшалардан алдын
сызықтың енін көрсетіңіз glLineWidth(2. 5). Сонымен қатар сызықтарды сатылы
етіп салуға болады glEnable (GL_LINE_SMOOTH). GL_LINE_STRIP төбелерді
ретпен бірінің соңынан бірі біріктіріп салады.

glBegin (GL_LINE_STRIP);
glVertex2f (-1, -1);
glVertex2f (-1, 1);
glVertex2f (1, 1);
glVertex2f (1, -1);
glEnd

Нәтижесі терезенің шекарасында П-әрпі шығады. Ал GL_LINE_LOOP дәл осы
сияқты бірақ соңғысы бастапқысымен бірігеді. glLineStipple (1, $FOFO);
glEnable (GL_LINE_STIPPLE); командалық жақшаның алдына қойсақ үзік
сызықтарды сызады.

Үшбұрыштар мен көпбұрыштар
Үшбұрыш. Сызықтардан кейін GLJTRIANGLES константантамен берілген
үшбұрышқа өтеміз.

glBegin (GLJTRIANGLES) ;
glVertex2f (-1, -1);
glVertex2f (-1, 1);
glVertex2f (1, 0);
glEnd;

Сол сияқты GL_TRIANGLE_STRIP константасы байланысқан топ үшбұрышы.
Бастапқы үш төбесі бірінші үшбұрышты салады, екінші төбесі төртінші төбеден
– екінші үшбұрыш, үшінші төбе бесінші төбеден – үшінші үшбұрыш т.с.с.

Көпбұрыш. Жазықтықта тік бұрышты салу үшін glRect командасын
қолдануға болады. Константа GL_QUADS примитиві төрт төбе берілсе төртбұрыш,
бес төбе берілсе бесбұрыш т.с.с. көпбұрыштар салады.

glBegin (GL_QUADS);
glColor3f (random, random, random);
glVertex2f (-0. 6, 0. 2);
glVertex2f (-0. 7, 0. 7);
glVertex2f (0. 1, 0. 65);
glVertex2f (0. 25, -0. 78);
glColor3f (random, random, random);
glVertex2f (0. 3, -0. 6);
glVertex2f (0. 45, 0. 7);
glVertex2f (0. 8, 0. 65);
glVertex2f (0. 9, -0. 8);
glEnd;

Константа GL_QUAD_STRIP үш төбеден төртбұрыш, төрт төбеден бесбұрыш
жасайды және де сол сияқты, жалпы айтқанда бастапқы төбемен соңғы төбені
қосады.

1.7 Терендік буфері

Мәтіндік жүргізуді құру кезінде, пиксел параметірінің көрсеткішінің
санына, OpenGL – дің еске сақтау (память) өлшемі бөлігі кіреді. Оны
кадрлық буфер деп атайды. Кадрлық буферден тыс 3 буфер бар: тереңдік
буфері, трафаретті буфер және көмекші буфер. Керекті кейбір жағдайлар үшін
қосымша таңдау буфері және қайта байланыс буфері қолданылу мүмкін.
Буферлермен жұмыс істеуге алда толығырақ қарастырамыз. Әзірше терендік
буферінің мағынасын көрсетіп өтейік. Бұл буфер кеңістікпен жұмыс істеу
ретінде қолданылады. Әр пикселді көрсеткен кезде, бұл буферге пикселдін Z
координатасы (мәзірлік Z) жазылады. Егерде 1 пикселге бірнеше нүкте келетін
болсаа, экранға осы нүкте ең кіші мәнді координаталы болып шығарылады.
Кеңістіктік құрылымдарда тереңдік буферді қолданудан бас тартқан
кезде, кеңістіктін қате көрінісі шыға келеді. Осыны қарастырып өтейік. Оңай
болу үшін, X, Y және Z – тен тұратын, остік координаталары бар процедура
енгізілсін:

ProcedureAxes;
var
Color: Array [1.. 4] of GLFloat;
begin
glPushMatrix;
glGetFloatv (GL_CURRENT_COLOR, @Color),
glScalef (0. 5, 0. 5, 0. 5);
glColor3f (0, 1, 0);
glBegin (GL_LINES);
glVertex3f (0, 0, 0);
glVertex3f (3, 0, 0);
glVertex3f (0, 0, 0);
glVertex3f (0, 3, 0);
glVertex3f (0, 0, 0);
glVertex3f (0, 0, 3);
glEnd;

Х әріпі

glBegin (GL_LINES)
glVertex3f (3. 1,-0. 2, 0. 5);
glVertex3f (3. 1,0. 2, 0. 1);
glVertex3f (3. 1,-0. 2, 0. 1);
glVertex3f (3. 1,0. 2, 0. 5);
glEnd;

Y әріпі
glBegin (GL_LINES);
glVertex3f (0. 0, 3. 1, 0. 0);
glVertex3f (0. 0, 3. 1, -0. 1);
glVertex3f (0. 0, 3. 1, 0. 0);
glVertex3f (0. 1, 3. 1, 0. 1);
glVertex3f (0. 0, 3. 1, 0. 0);
glVertex3f (-0. 1, 3. 1, 0. 1);
glEnd;
Z әріпі
glBegin (GL_LINES);
glVertex3f (0. 1, -0. 1, 3. 1);
glVertex3f (-0. 1, -0. 1, 3. 1);
glVertex3f (0. 1, 0. 1, 3. 1);
glVertex3f (-0. 1, 0. 1, 3. 1);
glVertex3f (-0. 1, -0. 1, 3. 1);
glVertex3f (0. 1, 0. 1, 3. 1);
glEnd;
Ағымдағы түстін мағынасын қайта құрайық
glColor3f (Color [1], Color [2], Color [3])
glPopMatrix;
end;

Көңілді аударып қарасақ, остердің жасыл түспен сызылып жатқаның
байқауға болады, ал түстін натройкалары көмекші массивтін есінде сақталынып
қалады. Сол массивтен ол настройкалар процедуранын аяғында қайта алынады.
Остер (0, 0, 0) нүктесінен шығады да, тура бағытта ғана көріне бастайды.
Жоба Ex20 бағыныңқы каталогының ішінде орналасқан. Бастауыш ретінде
glFrustum процедурасы мысал ретінде етіліп алынып, кубтын контурдық
көрінісі алынып тасталынған. Онда кеңістіктің шығарылу рені бұзылып, куб
координата остерін толығынан кесіп жатқандығы мәлім болады.
Терендік буфердің қолданбайтын жағдайда кеңістік сахынасының
көрінісінін тура еместігі байқалып жатыр
Келесі мысалда, Ex21 бағыныңқы каталогында, дәл осы сахына дұрыс
көрініп отыр.
Енді дұрыс: остер кубтын шегін кесіп өтеді
Ойнау мәтіндегіні алғаннан кейін, OpenGL системасына – құрылыстын
терендікке сәйкестіріп дұрыстау керектігін көрсетеміз:
glEnable (GL_DEPTH_TEST); терендікті сынау тәртібін іске қосамыз
Сахна коды екі буферді тазалаудан басталады: кадр буферін және
терендік буферін:
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); +терендік
буфері
Дәл осылайша келесі құрылыстан алдын ала, сурет салудын үстін тазалау
қажет. Ал дұрыстап экранға шығару үшін, кеңістік буферін тазалап алуымыз
керек. Осы алдағы мысалдағы іс-әрекеттер болашақтағы мысалдардың көбісінде
қолданылады.
OpenGL дің дайын үлгілері
OpenGL-дің бірнеше дайын үлгілері бар. Ол үлгілер дайын командалар
жиынтығын құрап, коддтауды жеңілдететін көмекші құрал ретінде келеді.
Стандартты OpenGL-мен бірге жіберілетін үлгінін аталуы glu библиотекасы
болып келеді. Ол библиотека glu32.dll файлында орналасқан. Осы
библиотеканын бірнеше командасын қарастырып шыққанбыз, және кейінгіде оны
зерттеуді жалғастырамыз. Стандарттық үлгіден басқа, программисттердің
арасында әйгілі библиотека glut болып келеді. С тілін қолданатын
программисттер үшін бұл библиотека ерекше қолайлы болып келеді, өйткені
операциялық жүйеден егеменді болып келеді. Ол библиотеканы қолдану арқылы,
бағдарламаларды коддтау едәуір жеңілденеді. Ойткені мәзірді құру, пикселдің
форматын анықтау, контексттерді анықтау және т.б. деген сияқты қара
жұмыстын барлығы библиотекалардын функциясын қолдануымен жасалынады.
Мысалыға бағдарламанын бастапқы кезі – мәзірдің glut библиотекасының
көмегімен берілген өлшемдерімен шығарылуы.

glutInitDisplayMode(GLUT_DOUBLE GLUT_RGB GLUT_DEPTH);
glutInitWindowSize(400, 400);
glutInitWindowPosition(50, 50);
glutCreateWindow(argv[0]);

Delphi жүйесінде бағдарлама жазатын программисттер де осы
библиотеканын көмегінен қолдана алады. Delphi-де бағдарлама жазған кезінде
біз операциялық жүйеден егеменді бола алмаймыз, ал библиотеканын
командалары ішінен програмисттерді кейбір көлемді фигуралар үшін құралған
функциялардың жиынтығы ғана қызықтырады. Сондықтан стандартты емес
библиотеканын орнына DGLUT.pas модулін қолдануға қолайлы деп есептеймін.
DGLUT.pas ол - glut библиотекасының файлдарын Delphi тіліндегі аудармасы
болып келеді. Кейінгі мысалдардын көбінде осы библиотеканы қолданатын
боламыз. Және де осыған сәйкес команданын көбісі glut перфиксінен бастала
жазылады. Мысалы, кубтын суретін салу үшін жиырма шақты бағдарлама
жолдарынын орнына біреуін ғана жазамыз.
glutSolidCube (1. 0);
Кубтан басқа модуль (библиотеканың) құрамына саланы (сфераны), торды,
конусты, тетраэдр, додекаэдр және т.б. сол сияқты дұрыс көпбұрыштарды құру
командалары да енеді.
Бұдан басқа классикалық объектілерді суреттеу командалары да құрамына
енеді, ол – машиналық графикаға сызу, шәйнек құру сияқты, т.б. Дұрыс
көпбұрыштардың құрылуы көпүшбұрыштарға сай біртұтасты болып келеді. Осы
бибилиотека арқылы құрылатын басқа да объектілер жайлы кейінірек қарастырып
өтеміз. DGLUT модулі жайлы толығырақ көзқарас тудыру үшін бір қиын емес
мысалды қарастыра өтейік. Ол Ех30 бағыныңқы каталогында (подкаталог)
орналасқан. Қолданушының таңдауымен модульдік қалаған объектіні құруға
болады. Ол объектіні нүктеден, түзу сызықтан немесе жазықтықтан құрауға
болады. Объектінін түрін және көрсетілу режимін белгілеу үшін ауыспалы
түрлер (есеп аудару) енгізілген.

mode: (POINT, LINE, FILL) = FILL;
glutobj: (CUBE, SPHERE, CONE, TORUS, DODECAHEDRON,
ICOSAHEDRON, TETRAHEDRON, TEAPOT) = CUBE;

Үнсіздік бойынша, тұтастай шекті кубтың мәні енгізілген. Сахынаны
ойнаған кезде тәртіп құрылып, керекті команданы қолдану пайда болады:

case mode of
POINT glPolygonMode (GL_FRONT_AND_BACK, GL_POINT);
LINE: glPolygonMode (GL_FRONT_ANDJ3ACK, GL_LINE);
FILL: glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
end;
case glutobj of
TEAPOT: glutSolidTeapot (1. 5);
CUBE: glutSolidCube (1. 5);
SPHERE: glutSolidSphere (1. 5, 20, 20);
CONE: glutSolidCone (0. 5, 1. 5. 20, 20);
TORUS: glutSolidTorus (0. 5, 1 5, 20, 20);
DODECAHEDRON: glutSolidDodecahedron;
ICOSAHEDRON: glutSolidIcosahedron;
TETRAHEDRON: glutSolidTetrahedron; end,

Бірінші үш цифрлі пернелерді басып, тәртіп орнатуға, төртінші цифрлі
пернені басып объектінін түрін өгертсе болады.
If Key = 52 then begin
inc (glutobj); установить следующее значение – ағымды мәнді орнату
If glutobj High (glutob]) then glutobj: = Low (glutobj);
InvalidateRect(Handle, nil, False);
Шәйнекті сызып отырған команданың өлшемдері, кубтын сызбасына сәйкес
мәні болады. Сфераны сызу үшін, онын радиусын, кескін санын, ұзақтылық және
кендік бойынша бөлшектенуін көрсету қажет.

1.8 Delphідің алдынғы нұсқауларындағы ОpenGL

Егер сіз Delphі 6-ны қолдансаңыз барлық негізгі функциялары
C:\programm filesBorlandDelphi 6SoursRtlWinOpengl.pas бумасында
үнсіздік бойынша орналасқан Opengl.pas файылына импортталады.
Көбінесе Opengl.pas-дің авторлары ұсынатын Delphi-дің мысалдары,
келесі кодпен басталады:

unit SomeUnit;
uses SysUtils, Classes, Windows, OpenGL;
interface
implementation
end.

Бұл мысалдарда Delphi-нің стандартты модульдерімен Opengl.pas-тың
модульдерін қолдану ұсынылады. Біз басқа жолды қолданамыз және (Opengl-ден
тікелей) қажетті фнукцияларды Opengl-ден тікелей импорттау арқылы өзіміздің
жеке тақырыптық файлымызды құрамыз.
Windows – қосымшаның Myapplication Opengl-ден атты жаңа жобасын
құрамыз. Негізгі форманың модулін UnitVainForm.pas деп, ал, негізгі
форманың өзін Formgl деп атаймыз. (1.8.1-сурет)

1.8.1 сурет. Қосымшаның негізгі формасының модулі.

Жобаны Opengl-ден импортталған барлық функциялар мен берілгендер
типтері орналасатын GLImports.pas модулімен толықтырамыз.
Opengl кітапханасы бағдарламалаушы қолданатын тілдің құрамында
болмайтын, өзіндік берілгендер типін қолданады. Сондықтанда, Opengl типіне
сәйкес келетін қолданылатын тілдегі, біздің жағдайымызда Delphі-дегі
типтерді қою қажет.
Opengl-дегі берілгендердің толық көрсетілген. Олардың кейбіреулерін
өз бағдарламамызда қолдану үшін GLImports.pas модулін type секцимясымен
толықтырамыз:

unit GLImports;
interface
type
стандартты реттік типтері:
BOOL = System.LongBool;
DWORD = System.LongWord;
контексті құрылғыға сілтеме:
HDC = type System.LongWord;
контексті келтіру сілтеме:
HGLRC = type System.LongWord;
Delphi түсіндірмесінде OpenGL типтері :
GLenum = System.Cardinal;
GLbyte = System.Shortint;
GLfloat = System.Single;
GLint = System.Integer;
GLsizei = System.Integer;
пиксел форматы:
PPixelFormatDescriptor = ^TPixelFormatDescriptor;
TPixelFormatDescriptor = packed record
nSize: Word;
nVersion: Word;
dwFlags: DWORD;
iPixelType: Byte;
cColorBits: Byte;
cRedBits: Byte;
cRedShift: Byte;
cGreenBits: Byte;
cGreenShift: Byte;
cBlueBits: Byte;
cBlueShift: Byte;
cAlphaBits: Byte;
cAlphaShift: Byte;
cAccumBits: Byte;
cAccumRedBits: Byte;
cAccumGreenBits: Byte;
cAccumBlueBits: Byte;
cAccumAlphaBits: Byte;
cDepthBits: Byte;
cStencilBits: Byte;
cAuxBuffers: Byte;
iLayerType: Byte;
bReserved: Byte;
dwLayerMask: DWORD;
dwVisibleMask: DWORD;
dwDamageMask: DWORD;
end;
implementation
end.

Бұл жердегі (кейбір типтердің) Delphi-нің стандартты типтеріне ұқсас
кейбір типтер GL префиксімен басталуына назар аударыңыз.
НДС пен HGLRC типтері, негізінде, system.рas модуліндегі THandle
типіне сәйкес келеді. Бұл модуль Delphi жобасына автоматты түрде қойылады
және оны айқын сипаттаудың қажеті жоқ. Бірақ, бұдан кейін біз жүйеліктермен
бірге модульдердің атауын анық сипаттау талап етілетін Net Framework
технологиясын қолданамыз.
Бұл мысалда, код Windows.pas-тың стандартты модулінен алынған.
Opengl графикалық кітапханасы платформадан тәуелсіз орындалатынын еске
түсірейік. Егер Delphi жобаларында қолданылатын Windows.pas тақырыптық
файлын жақсылап қарастырсақ, онда Opengl-ге жататын бірақ Windows жүйесінде
орындалатын процедуралармен функциялар бар екенін көреміз:(w префиксі
осыны көрсетеді)
...
function wglCreateContext(DC: HDC): HGLRC;
function wglDeleteContext(p1: HGLRC): BOOL;
function wglMakeCurrent(DC: HDC; p2: HGLRC): BOOL;
...
Сондықтанда, Borland-тың бағдарламалаушылары осы және басқада
функцияларды Opengl.pas файлына емес, Windows.pas файлына енгізген. Бұл
олардың тек қана Windows операциялық жүйесінде ғана қолданылуымен
сипатталады, ал, олардың қызметі толығымен көрсетілген: WglCreate Context
және Wgl Delete Contexte функциялары сәйкесінше Opengl-дің орындалу
контекстін құрады және жояды, ал, Wgl Make Curent функциясы ағымдағы
контексті орнатады. Opengl жүйесі қосымшалар stdcall-ды шақыру үшін
стандартты келісімге сілтеме жасайтын Opengl 32.dll glu 32.dll қосылатын
екі динамикалық кітапханалардың файлдарында жинақталады.
Егер сіз кодта {SEXTERNAL SYM функция аты} компилятор
директивасының кәсібі жазылған модульдерін кездестірсеңіз, оны С + + - пен
байланыс ретінде түсінуге болады. Біздің минималды Opengl бағдарламамыз
форма ретінде қызыл түсті диагналь сызық сызады. Бұл үшін [1,4,5]-те
сипатталған сызықты сызуға арналған бірнеше функциялар мен тұрақтылар
керек:
...
procedure glBegin(mode: GLenum);
procedure glColor(red, green, blue: GLbyte);
procedure glEnd;
procedure glVertex2f(x, y: GLfloat);
procedure glViewport(x,y: GLint; width, height: GLsizei);
...
Операциялық жүйе gdi 32.dll файлында орналасқан өзінің графикалық
кітапханасы GDI-нің көмегімен басқару элементтерінде төмен деңгейлі
графикалық амалдарды орындайды. Қосымша мен Opengl арасында байланыс
орнату үшін пиксельдің форматын орнату қажет. Бұл үшін біздің
GLImports.рas модулімізге TPixelFormatDescriptor типімен оған сәйкес
келетін РpixelFormatDescriptor көрсеткіші енгізілген. Енді сипаттамалары
Windows.pas модулінде орналасқан және 5 нұсқадан бастап, Delphi-інің
анықтамалық жүйесінде қолжетімді болған екі функция қажет:
...
function ChoosePixelFormat(DC: HDC; p2: PPixelFormatDescriptor): Integer;
function SetPixelFormat(DC: HDC; PixelFormat: Integer; FormatDef:
PPixelFormatDescriptor): BOOL;
...
Нәтижесінде CLImports модулі мына түрінде болады:
unit GLImports;

interface

type
стандартты реттік типтері:
BOOL = System.LongBool;
DWORD = System.LongWord;
контексті құрылғыға сілтеме:
HDC = type System.LongWord;
контексті келтіру сілтеме:
HGLRC = type System.LongWord;
Delphi түсіндірмесінде OpenGL типтері:
GLenum = System.Cardinal;
GLbyte = System.Shortint;
GLfloat = System.Single;
GLint = System.Integer;
GLsizei = System.Integer;
пиксел форматы:
PPixelFormatDescriptor = ^TPixelFormatDescriptor;
TPixelFormatDescriptor = packed record
nSize: Word;
nVersion: Word;
dwFlags: DWORD;
iPixelType: Byte;
cColorBits: Byte;
cRedBits: Byte;
cRedShift: Byte;
cGreenBits: Byte;
cGreenShift: Byte;
cBlueBits: Byte;
cBlueShift: Byte;
cAlphaBits: Byte;
cAlphaShift: Byte;
cAccumBits: Byte;
cAccumRedBits: Byte;
cAccumGreenBits: Byte;
cAccumBlueBits: Byte;
cAccumAlphaBits: Byte;
cDepthBits: Byte;
cStencilBits: Byte;
cAuxBuffers: Byte;
iLayerType: Byte;
bReserved: Byte;
dwLayerMask: DWORD;
dwVisibleMask: DWORD;
dwDamageMask: DWORD;
end;

{ OpenGL }

function wglCreateContext(DC: HDC): HGLRC; stdcall;
function wglDeleteContext(p1: HGLRC): BOOL; stdcall;
function wglMakeCurrent(DC: HDC; p2: HGLRC): BOOL; stdcall;
procedure glBegin(mode: GLenum); stdcall;
procedure glColor(red, green, blue: GLbyte); stdcall;
procedure glEnd; stdcall;
procedure glVertex2f(x, y: GLfloat); stdcall;
procedure glViewport(x, y: GLint; width, height: GLsizei); stdcall;

{ GDI }
function ChoosePixelFormat(DC: ... жалғасы

Сіз бұл жұмысты біздің қосымшамыз арқылы толығымен тегін көре аласыз.
Ұқсас жұмыстар
Графикалық объектілердің жарықты өткізу қабілетін басқару
Дескрипторлық графиканың объектілері
Растрлік графика форматтары
Opengl архитектурасы. Компьютерлік графика
Android ОЖ қосымшаны құрастыру технологиясын қарастыру
Астрофизикалық құбылыстарды моделдеу үшін cuda қолдану
«Қазақ тілі бойынша онлайн тестілеудің мобильді қосымшасын құру»
Қоңырау кестесі бойынша автоматты түрде қоңырау соғуға арналған Автоматтандырылған Қоңырау бағдарламасы
Ақпараттық жүйелердің түрлері
Android Studio ортасында Мобильді қосымшаларды әзірлеу
Пәндер