Е. Жақсылықов мультимедиалық ЖҮйелерді жобалау және қҰрастыру


OpenGL графикалық кітапханасын қолдану



бет6/9
Дата21.07.2016
өлшемі3.19 Mb.
#214513
1   2   3   4   5   6   7   8   9

8 OpenGL графикалық кітапханасын қолдану


Графикалық стандарт OpenGL кітапханасы 1991-1993 жылдары сол кездегі белгілі фирмалармен құрылған. Оның негізіне Silicon Graphics компаниясымен жасалған IRIS GL кітапханасы алынған. Windows үшін OpenGL кітапханасының құрамына OpenGL32.dll және glu32 кітапханалары кіреді. Өзге графикалық жүйелер сияқты OpenGL бағдарламалық қамтамассыздандыру мен аппаратура арасындағы интерфейсті ұсынады.

OpenGL командаларын интерпретациялау моделінің негізінде клиент-сервер технологмясы жатыр: клиент-бағдарлама сол немесе басқа компьютерде орналасқан OpenGL серверіне бұйрықтар береді. Төменгі деңгейінде OpenGL командалары кадр буферінің ресурстарының орналасуына жауап беретін терезелік жүйемен өңделеді. Терезелік жүйе буфердің қай бөлігі OpenGL-ді пайдаланып отырған бағдарламалармен өңделетінін және осы буфермен байланыс қалай орнатылатынын анықтайды. Кадр буферінің мазмұнын монитор экранына шығару OpenGL-ға тәуелсіз.

Берілген интерфейс үш өлшемді графикалық объектілер мен олармен орындалатын операцияларды сипаттауға мүмкіндік беретін бірнеше жүзге жететін процедуралар мен функциялардан тұрады. Delphi-мен бірге осы процедуралар мен функциялардың OpenGL.dll glu32.dll кітапханаларына “обращение” жасауы көрсетілген OpenGL.dcu және OpenGL.pas файлдары жеткізіледі.

Бұл процедуры мен функциялардың мүмкіншілктері: геометриялық және растрлық примитивтерді салу, түспен RGBA және индексті режимде жұмыс жасау, түрлік және модельдік өзгертулерді жүзеге асыру, көрінбейтін қырлар мен қабырғаларды жою, түрлі эффектілерді қолдану (түстердің, мөлдірліктің жанасуы, текстураның жатуы, үлестірілген және нүктелік жарық көздерінің жарығының түсуі, “тұман”); B-сплайндарды қолдану.

Келесі графикалық примитивтер алдын ала қарастырылған: нүктелер, түзу сызықтар кескіндері, көпбұрыштар; пиксельдік көпбұрыштар және биттік карталар. Әр примитив өз төбелерінің координаттар жиынтығымен беріледі. Ол төбелермен келесі атрибуттар байланысады: түсі, нормаль және текстура координаттары. Барлық төбелер тәуелсіз, ағымдағы күй және режим негізінде өңделеді. OpenGL-де үш өлшемді және жазық объектілермен (қайта құруматрицалары, жарық түсуді есептеу теңдеуінің коэффициенттері және т.б.) жұмыс жасайтын көптеген операциялар дайындалған. Стандарт тек қана жасаушыдан тәуелсіз қосымша пайдаланушы интерфейсі арқылы жүзеге асырылатын визуализация үшін жауапты болғандықтан, онда күрделі объектілер құрылымын сипаттау құралдары жоқ. Сондықтан, кітапханаға дөңес емес көпбұрыштарды құру құралдары енгізілмеген. Алдымен дөңес емес көпбұрыштарды дөңес көпбұрыштарға бөлуге кеңес беріледі (мысалы, үшбұрыштар).

OpenGL-де геометриялық объектілерді беру үшін кординаттар, түстер, нормаль векторлары және glBegin(DrawMode) және glEnd командалары арасындағы текстуралардың байлану (привязка) нүктелер орнатуларын іске қосу қажет. Төбелері (10,10, 0), (10,20,0) және (20,0,10) нүктелерінде болатын үшбұрышты құру үшін келесі тізбекті жазуға болады:

Begin(GL_TRIANGLES) ;

glVertex3i(10,10,0);

glVertex3i(10,20,0);

glVertex3i(20,0,10);

glEnd () ;

Он түрлі геометриялық объект қарастырылған:

1) GL_POINTS – нүктелер тізбегі;

2) GL_LINE_STRIP – сынған сызық;

3) GL_LINE_LOOP – тұйық сынық сызық;

4) GL_LINES – сызық бөлігі;

5) GL_TRIANGLE_STRIP – үшбұрыштардың байланысқан жиыны;

6) GL_TRIANGLE_FAN – желпілеуіш түрінде байланысқан үшбұрыштар жиыны;

7) GL_TRIANGLES – жеке үшбұрыш;

8) GL_QUAD_STRIP – байланысқан төртбұрыштар;

9) GL_QUADS – жеке төртбұрыш;

10) GL_POLYGON – дөңес көпбұрыш.

Осы қарапайым объектілер негізінде қанша болса да күрделі объект құруға болады.

Координаттардан басқа әр объект төбесіне нормаль векторы, текстураның ағымдағы координаттары және түсі меншіктеле алады. Нормаль – мысалы, бетке жарық түсуді қалыптастыру үшін қолданылатын ориентацияны есептеуде қажетті үш өлшемді вектор.

Төбенің негізгі координаттары жылжыту, бұру және масштабтау операциялары бар 4x4 өлшемді матрицаға көбейту арқылы түрлік өзгеруге ұшырайды. Стекке бір немесе бірнеше түрлендіру матрицаны жүктегеннен кейін олардың төбе координаттарына көбейтілу тәртібін арнайы командалар көмегімен басқаруға болады. OpenGL-де геометриялық түрлендірулерді X, Y немесе Z өсітерін айнала ғана емес, еркін оське қатысты тізбекті бұрулар жасау жолымен жүргізу мүмкіндігі қарастырылған.

Түс RGBA моделінде беріледі. Сонымен бірге, әр түс бөлігін беру үшін 0…255 диапозондағы бүтін және 0.0 және 0.1 арасындағы нормальді заттық сандарды қолдануға болады. Жарықтылықты есептеу кезінде объект түсі келесі параметрлерге байланысты өзгеріп тұрады: материал қасиеттері, объект бетінің шағылыстыру қасиеттері және жарық көзінің параметрлері. Кескін түрін жарықтылық моделінің параметрлерін түрлендіре отырып, көздердің орналасуын, олардың қуаттылығын, орта қасиеттері және т.б. басқара отырып өзгертуге болады.

Төбелерді, олармен ассоцияланатын ақпаратты сипаттауда қолданылмайтын OpenGL командалары glBegin/glEnd блогынан тыс орналастырылуы мүмкін. Бұл қосымшаларды оптимизацияланған режимде, берілген жабдық үшін примитивтерді шығарудың максималды мүмкін режимін қолдана отырып орындауға мүмкіндік береді.
Мысал 15. OpenGL-ды инициализациялау бағдарламасы.

procedure TForml.FormCreate(Sender: TObject);

in

C := GetDC(Handle);



SetupPixelFormat(DC{,Palette}); // пиксельдердің форматын орнатады

С:=wglCreateContext(DC); //ойнатудың жаңа контекстін құрады

glMakeCurrent (DC, RC) ; //ойнатудың ағымдағы контекстін орнатады

gIViewPort(0,0,ClientWidth,ClientHeight); //шығару аумағын анықтайды

glOrtho(0,ClientWidth, 0,ClientHeight, 0,1) //glOrtho (параллельді проекцияны орнатады)

//left, - қиманың сол жақ жазықтығының координаттары

//right - оң жақ
//bottom - төменгі

//top - жоғарғы


//zNear, - жақындағы қима жазықтығына дейінгі қашықтық

//zFar: GLdouble) - алыстағы

ConvertWinColor(Color,r,g,b);

glClearColor(r,g,b,1);

//тазарту кезіндегі пайдаланылатын RGBA-түстерді анықтайды

//түстердің буферін

glClear(GL_COLOR_BUFFER_BIT); // RGBA- түсті орнату

//GL_COLOR_BUFFER_BIT – түсті жазуға мүмкіншілікті буферлер

//GL_DEPTH_BUFFER_BIT - тереңдік буфері

//GL_ACCUM_BUFFER_BIT - аккумулятор буфері

//GL__STENCIL_BUFFER_BIT - трафарет буфері

//

glFlus;



glFinish;

//командалардың белгілі бір немесе ақырғы

//уақытта аяқталуына кепілдік береді

end;
Мысал 16. Көлемді мәтінді жүзеге асыратын бағдарлама жазу.

Procedure TVFText.Paint; // Үшөлшемді мәтінді шығарады

var

X, Y: Integer;

UpColor. BtmColor: TColor;

begin

with Canvas do // Ескі бейнені өшіреді, егер бұл рұқсат етілсе:

1f not Transparent, then



begin

Brush.Style : = bsSolid;

Brush.Color : = Color:

FillRect(ClientRect)



End; // Шығару координаттарын анықтаймыз да, реңді жоямыз

X : = ClientRect.Left;

Y: = ClientRect.Top:

Brush.Style : = bsClear; // Стильді ескере отырып шығарамыз:

case.FStyle of

tsRaised. tsRecessed:



begin // ішіне қарай немесе жоғарыға қарай бағытталған мәтін
if FStyle - tsRecessed then
begin
UpColor : = clBtnHighUght

BtmColor : = clBtnShadow

UpColor : = clBtnShadow

End; // Мәтіннің төменгі жиегін шығарамыз

Font.Color : = BtmColor:

TextOut(X+l. y+1. Caption): // Жоғарғы жиегін шығарамыз

Font.Color : = UpColOP;

TextOut(X-l, Y-l. Caption):

End;

tsShadow:



begin // Көлеңкелі мәтін: көлеңкені шығарамыз

Font.Color : = FShadowColor;

TextOutCX+FShadowDepth, Y+FShadowDeptn, Caption);

end ;


end; // Негізгі жазуды шығарамыз

Font.Color : = Self.Font.Color;

if not Enabled then

Font.Color := clGrayText;

TextOut(X. Y, Caption):

End;


end;

Келесі операторларға назар аударыңыз:

1f not Transparent then

begin


Brush.Style := bsSolid;

Brush.Color := Color;

FillRect(ClientRect);

End;


Transparent қасиеті, өз аталығы TCustomLabel компонентінің «мұрагері» белгінің мөлдірлілігіне жауап береді . Егер оның мәні True болса, белгінің мәтіні реңді тазартусыз шығады. Осы жағайда TextStyle қасиетін өзгерту стильдердің араласуы эффектісін беруі мүмкін, мысалы келесі суретте көрстелігендей ( tsRecessed стилінен кейін tsShadow стилі орнатылған).

Алайда көптеген жағдайда Transparent қасиеті қалыпты жағдайда False-қа тең, ал жлғарыда келтірілген операторлар белгіні стильдердің араласуынан құтқарады.

Кірістірілген уақыт санағышы компоненттің конструкторында емес, BlinkMode қасиетіне bmNone-нан өзгеше мән бергенде ғана орнатылады.

OpenGL-мен жұмысты аяқтауды форманы жабу арқылы жүзеге асыруға болады:

Procedure TForm1.FormClose(Sender: TObject; var Action: CloseAction);

Begin

wglMakeCurrent(0,0);



wglDeleteContex(RC);

ReleaseDC(Handle,RC);

If Palette<>0 then DeleteObject(Palette);

End;
Жұмысты аяқтаған кезде қажет:

1) Ойнатудың контекстін ағымдағы емес ету wglMakeCurrent(0,0);

2) Ойнатудың контекстін жою wglDeleteContex(RC);

3) Ойнатудың контекстімен байланысқан ойнату контекстін босату ReleaseDC(Handle,RC);

4) Егер палитра қолданған болса, оны жою.


Мысал 17. 10 нүкте салатын бағдарлама

glDisable(GL_LIGHTTNG);

//жарық көздерін ажырату

//тегістеу режімін қосу

g!Enable(GL_POINT^SMOOTH);

//glDisable(GL_POINT_SMOOTH);

for i:=1 to 10 do

begin


glPointSize{i); //нүктелердің өлшемін беру

glBegin(GL_POlNTS); //нүктенің примитиві

gl Co1or3f(Random,Random,Random);

glVertex2f(Random(700),Random(б00));

glEND;

end;


glFinish;
Мысал 18. Кесінділерді салу бағдарламасы.

glDisable(GL_LIGHTING);

glColor3f(1,0,0);

// сатылылықты жою режімін қосамыз

glEnable(GL_LINE_SMOOTH);

//glDisable(GL_LINE_SMOOTH);



// сызықтың қалыңдығын орнатамыз

glBegin(GL_LINES) ;

for i: =1 to Random{20) do

begin


// әрбір төбенің кездейсоқ түсін орнатамыз

glColor3f(Random,Random,Random);

// төбелердің координаттарын орнатамыз

glVertex2f(Random(800),Rancom(600));

end;

glEnd;


glFinish;
Кесінділер, кіші қырлары көлденең келген параллелограмм түрінде бейнеленеді. Тегістеудің қосылған режімінде (сатылылықты жою)

glEnable(GL LINE SMOOTH) сызықтар тіктөртбұрышпен салынады. Бұл режім қосымша уақытша шығындарға әкеледі. Әрбір төбеге өз түсі тағайындалады. Сондықтан да кесіндінің нүктелерінің түсі бастапқы нүктеден соңғы нүктеге дейін бірқалыпты өзгеріп отырады.



Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8   9




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет