2.Geometrik obyektlar tushuncha va ularni chizish
Tasvirlami yangilash jarayoni Qoida sifatida, OpenGLni ishlatadigan dasturning vazifasi uch oicham li tasvirni qayta ishlash va kadr buferida interaktiv tasvirlash hisoblanadi. Tasvir kuzatuvchining joriy holatini aniqlaydigan uch o lchamii obyektlar toplami, yorug'lik manbai va virtual kameradan tashkil topadi.
Odatda OpenGL ilovasi uzluksiz siklda oynada tasvirni yangilash funksiyasini chaqiradi. Ushbu funksiyada OpenGLning asosiy buyruqlarini chaqirish joriy qilingan. Agar GLUT kutubxonasi ishlatilsa, unda bu giutDisplayFuncQ chaqiruvi bilan qayd qilingan teskari aloqali funksiya boladi. GLUT bu fimksiyani oyna tarkibini qaytadan chizish kerakligi togrisida operatsion tizim ilovaga m alumot berganda bu funksiyani chaqiradi. Hosil qilinadigan tasvir ham statik, ham animatsiya korinishida boTishi mumkin, yani vaqt bo'yicha ozgaradigan parametrlarga bogliq bolganda. Bu holatda yangilash funksiyasini mustaqil ravishda chaqirish maqsadga muvofiq. Misol uchun, glutPostRedisplay () buyrug'i yordamida. Yanada batafsil malumot A ilovada keltirilgan.
Tasvirni yangilashning tipik funksiyasi qanday vazifalami bajarishini korib chiqamiz. Qoida sifatida, u uch bosqichdan tarkib topadi:
1. OpenGL buferlarini tozalash;
2. Kuzatuvchining holatini omatish;
3. Geometrik obyektlarni chizish va ozgartirish.
Buferni tozalash quyidagi buyruqlar yordamida amalga oshiriladi: void glClearColor (clampf r, clampf g, clampf b, clampf a) // (clamp-fiksator) void glClear (bitfield buf) //( bitfield - bitovoe pole) glClearColor buyrug'i rangni o'rnatadi, ya’ni kadr buferi to‘ldiriladi. Buyruqning dastlabki uchta parametri ranglarning R, G 129 va В kotnponentlarini tayinlaydi va ular [0,1] kesma oraligida bolishi kerak. Tortinehi parametr alfa kompetentani beradi. Qoidaga kora, u 1 ga teng. Shart berilmaganda rang - qora (0,0,0,1). glClear buvrugM buferni tozalaydi, buf parametri tegishli bufer ozgarmaslari kombinatsiyasini belgilaydi. Odatdagi dastur bufer rangi va chuqurligini tozalash uchun gICIear(GL_COLOR_BUFFER_BIT | GL DEPTH_BUFFER_ BIT) buyrugini chaqiradi. Kuzatuvchi holatini omatish va uch o'lchovli obyektlarni o zgartirish (burish, kochirish va b.), almashtirish matritsalarini tayinlash yordamida nazorat qilinadi. Obyektlarni ozgartirish va virtual kamera holatini sozlash keyingi bolim!arda keltirilgan. Diqqatimizni sahnada joylashgan obyektlar tavsifini OpenGL ga uzatishga qaratamiz. OpenGL ning har bir obyekti primitivlar toplamidan tashkil topgan.
Uchlar va primitivlar Uchlar (nuqta) OpenGLning grafik primitivlari hisoblanadi va nuqtani, kesmaning oxiri, kopburchakning burchagi va boshqalarni tavsiflaydi. Qolgan barcha primitivlar uchlami tayinlash orqali shakllantiriladi. Masalan, kesma ikkita uchlar orqali ifodalanadi. Har bir uch bilan birga uning atributlari ham mavjud. Asosiy atribut sifatida uchning fazodagi holati, uchning rangi va vektor normallarini olish mumkin.
Uchlarning fazodagi holati Uchlarning holati ikki, uch yoki tort oMchovli (bir jinsli koordinatalar) fazoda uning koordinatalarini tayinlash orqali belgilanadi. Bu glVertex* buyrugMni bir qancha variantiari yordamida amalga oshiriladi:
void glVertex [2 3 4][s i f d] (type coords)
void gIVertex[2 3 4][s i f d]v (type * coords)
Har bir buyruq uchlarning to'rtta koordinatasini tayinlaydi: x, y, z, w.
glVertex2* buyrug‘i x va у qiymatlarini qabul qiladi. Bunday holatda z koordinatasi 0 ga teng, w koordinatasi - ! ga teng.
Vertex3* buyrug'i x, y, z koordinatalarini qabul qiladi va w koordinatasiga 1 qiymatini kiritadi.
Veriex4* barcha - to'rtta koordinatalarni tayinlash imkonini beradi.
Uchlar rangi, normallar va teksturlar koordinatalarini birlashtirish uchun mavjud malumotlaming joriy qiymatlari ishlatiladi. Ushbu qiymatlar ixtiyoriy vaqtda tegishli buyruqni chaqirish yordamida ozgartirilishi mumkin. Uchlar rangi Uchlarning joriy rangini tayinlash uchun quyidagi buyruqlar ishlatiladi:
void gICo!or[3 4] [b s i f] (GLtype components)
void g!Color[3 4][b s i f] v (GLtype components)
Dastlabki uchta parametr rangning R, G, В komponentlarini tayinlaydi, oxirgi parametr notiniqlik koeffitsiyenti (alfa-qism deb ataluvchi)ni belgilaydi. Agarda buyruqning nomlanishida ‘f (float) tipi ko‘rsatiigan bo‘lsa, unda barcha parametrlar qiymatlari [0,1] kesma oralig'ida joylashishi kerak. Bunday holda alfa-qism qiymati 1.0 ga tenglashtirilishi ornatiladi. ub (unsigned byte) tipi qiymat [0,255] kesmada joylashishi kerakligini ko'zda tutadi.
Uchlarga turli xil ranglami tayinlash mumkin, agarda mos rejim yoqilgan bolsa. Unda primitiv sirti bo'ylab ranglarning chiziqli interpolyatsiyasi amalga oshiriladi. Interpolyatsiya iarayonini boshqarish uchun quyidagi buyruqdan foydalaniladi void glShadeModei (GLenum mode) chaqiruv G LjSM G O TH parametr bilan berilsa, interpolyatsiya qoshiladi (tanlangan parametr asosida), GL_FLAT parametr berilganda esa ajratadi, o'chiradi.
Normal
Normallarni ifodalash uchun quyidagi buyruqlardan foydalaniladi
void glNormaI3(b s i f d] (type coords)
void gliNormal3[b s i f d]v (type coords)
Yoruglik hisobini togri olisli uchun normal vektori yagona uzunlikka ega boMishi zarur. glEnable(GL_NORMALIZE) buyrugi maxsus buyruqlami qoshishi mumkin, bunda tayinlanayotgan normal avtomatik normallashadi.
Avtomatik normallash rejimi modelli kengayish-torayish almashtirilishi ishlatilganda yoqilgan boiishi kerak, chunki bu holda normal uzunligi model-matritsasiga kopaytirilganda ozgaradi. Ammo, ushbu rejimni joriy qilish OpenGLning vizuallashtirish mexanizmi ishini sekinlashtiradi, xuddi shunday vektorlami normallash hisoblashning sezilarli qiyinchiliklariga olib keladi (kvadrat ildiz olish va b.). Shuning uchun birdaniga yagona normalni berish maqul.
Eslatib o tish kerakki,
void glEnable (GLenum mode)
void gIDisable (GLenum mode)
buyruqlari OpenGL konveyerining u yoki bu ish rejimini ochirilishi yoki yoqilishini taminlaydi. Ushbu buyruqlar kop hollarda qollaniladi va ulaming parametrlari har bir aniq holatlar uchun qaraladi.
Operatorli qavslar glBegin / glEnd Biz yuqorida bitta uchning atributlarini tayinlashni korib chiqdik. Ammo, grafik primitiv atributlarini tayinlash uchun, uchning bitta koordinatasi etarli emas. Ushbu uchlami zaruriy xususiyatini belgilovchi bir butunlikka birlashtirish kerak. Buning uchun OpenGLda operatorli qavs deb ataluvchi maxsus buyruqlarni chaqirishda xizmat qiluvchilardan foydalaniladi. Primitivlarni belgilash yoki primitivlar ketma-ketligi void glBegin (GLenum mode)', void glEnd (void); buyruqlarini chaqirish oraligida olib boriladi. Mode parametri primitivning tipini belgilaydi, qaysiki ichkarida tayinlanadi va quyidagi qiymatlarni qabul qilishi mumkin: GL_POINTS har bir uchlar bir qancha nuqtalar koordinatalarini belgilaydi. 132 GL_LINES har bir alohida uchlar jufitligi kesmani belgilaydi. Agarda toq sonli uchlar korsatilsa, u holda oxirgi uch etiborga olinmaydi. GL_LINE_STRIP liar bir keyingi uch oldingisi bilan birgalikda kesmani belgilaydi
GL_LINE_LOOP oldingi primitivdan farqli jihati shuki, oxirgi kesma songi va birinchi uchni berk togri chiziq timsolida belgilaydi. GL_TRIANGLES har bir alohida uchta uch uchburchakni belgilaydi. Agarda uchta sonli uchlar karrali berilmasa, unda oxirgi uchlar etiborga olinmaydi. GL_TRIANGLE_STRIP har bir keyingi uch oldingi ikkitasi bilan birgalikda uchburchakni belgilaydi. 133 GL_TRIANGLE_FAN uchburchaklar birinchi uch va har bir keyingi juft uchlar bilan beriladi (juftliklar kesishmaydi).
GL_QUADS har bir alohida to'rtta uch tortburchakni belgilaydi; agarda to'rtta sonli uchlar karrali berilmasa, unda oxirgi uchlar etiborga olinmaydi. G L Q U A D S T R IP n nomerli tortburchak 2n-l, 2n, 2n+2, 2n+l nomerli uchlar bilan belgilanadi. GL_POLYGON qavariq ko'pburchakning uchlarini ketma-ket berish. Masalan, uchlari turli rangda bo‘!gan uchburchakni chizish uchun, quyidagilami yozish etarli: GLfloat BlueCol[3] = {0,0,1}; glBegin(GL_TRIANGLES); glColor3f(l .0, 0.0, 0.0); /* qizil */ glVertex3f(10.0, 10.0, 0.0); glColor3ub(0,255,0); /* yashil */ glVertex2i(100, 100); glColor3fv(Blue€ol); /* ko‘k */ gIVertex3f( 100.0, 100.0, 0.0); glEnd();
Qoida sifatida, primitivlarning har xil turlari turlicha platformalarda turlicha vizuallashish tezligiga ega. Unumdorlikni oshirishda, serverga uzatish uchun kam sonli axborotlami talab etuvchi, GL_TRIANGLE_STRiP, GL QUAD STRIP, G L T R IA G L E F A N singari primitivlardan foydalanish afzalroqdir. Mazkur ko'pburchaklami tayinlashdan tashqari, ulami ekranda akslantirish usullarini ham berish mumkin.
Ammo dastlab old va orqa yoq tushunchalarini belgilab olish lozim. Yoq deganda kopburchakning tomonlaridan biri tushuniladi, va odatda soat strelkasiga teskari aylanuvchi uchlar joylashgan tomon old hisoblanadi. Old yoqning uchlari aylanish yonalishini quyidagi buyruqni chaqirish orqali o zgartirishi mumkin void glFrontFace (GLenum mode) mode parametrining qiymati GL_CW (clockwise) ga teng, qiymatni odatdagi holatiga qaytarish uchun GL_CCW (counterclockwise) ni korsatish kifoya.
Ko'pburchakni tasvirlash usulini ozgartirish uchun quyidagi buyruq ishlatiladi void gIPolygonMode (GLenum face, Glenum mode) mode parametri kopburchak qanday akslanishini belgilaydi, face parametri kopburchakning tipini omatishda qollaniladi va quyidagi qiymatlar ham qabul qilinishi mumkin: GL_FRONT korinadigan tomon (oid yoq) uchun GL_BACK korinmas tomon (orqa yoq) uchun GL_FRONT_AND_BACK barcha tomon (yoq)lar uchun mode parametri quyidagilarga teng bolishi mumkin: GL_POINT kopburchakning faqat uchlari tasvirlanadi. GL_LINE kopburchaklar qismlar toplamida ifodalanadi. GL_FILL yoruglikni hisobga olib kopburchaklar joriy rang bilan bo'yab chiqiladi, va bu odatdagi rejim sifatida qaraladi. Shu bilan birga, ekranda qanday chegara tasvirlanishini ko'rsatish ham mumkin. Buning uchun dastlab glEnable (GL_CULL_ FACE) buyrug'ini chaqirish rejimi o'matilishi kerak. shundan song quyidagi buyruqlar yordamida tasvirlanuvchi tomon tipi tanlanadi: void glCuIlFace (GLenum mode) Funksiya GL_FRONT parametri bilan chaqirilsa, tasvirdan barcha korinadigan tomonlar olib tashlanadi, G L B A C K - parametr bilan esa teskarisi (tanlov asosida ornatiladi).
Korilgan standart primitivlardan tashqari GLU va GLUT kutubxonalarida yanada murakkabroq figuralar mavjud, jumladan, sfera, silindr, disk (GLU da) va sfera, kub, konus, tor, tetraedr, dodekaedr, ikosaedr, oktaedr va choynak ( GLUT da). Teksturalarni avtomatik joylashtirish faqat GLU kutubxonasi figuraiari uchun ko'rilgan (OpenGL da tekstura yaratish 3.6 paragrafda koriladi). Misalan, sfera yoki silindr chizish uchun, avvalo quyidagi: GLUquadricObj* gluNewQuadric (void) buyruq yordamida maxsus tipdagi GLUquadricObj obyekti yaratiladi. 135 Undan song kerakli buyruq chaqiriladi: void gluSphere (GLUquadricObj * qobj, GLdoubie radius, GLint slices, GLint stacks) void gluCylinder (GLUquadricObj * qobj, GLdoubie baseRadius, GLdoubie topRadius, GLdoubie height, GLint slices, GLint stacks) bu yerda slices parametri z o qi atrofida siniq egri chiziqlar sonini beradi, stacks - esa z o qi atrofi boylab bolinishlar sonini beradi. Primitivlami qurishning ushbu va boshqa buyruqlari haqida yanada aniqroq m alumotlar В ilovada keltirilgan. Displeyli ro ‘yxatlar Agar biz bitta buyruqlar guruhiga bir necha marotaba murojaat qilsak, unda ulami displey ro‘yxati (display list) ga birlashtirish va zarur boiganda uni chaqirish mumkin. Yangi displey ro'yxatini hosil qilish uchun unga kirishi kerak boigan barcha buyruqlami quyidagi operator qavslari orasiga joylashtirish kerak: void glNewList (GLuint list, GLenum mode) void glEndList ( ) Royxatlarni ajratish uchun butun musbat sonlardan foydalaniladi, berilgan royxat list parametri bilan beriladi, mode parametri esa royxatga kirgan buyruqni qayta ishlash rejimini tavsiflaydi: G L_C O M PILE buyruq bajarilmasdan oldin royxatga yoziladi GL_COM PILE_AND_EXECUTE buyruqlar oldin bajarilib, keyin royxatga yoziladi 136 Ro'yxat tuzilgandan keyin, list parametrda kerakli royxatning identifikatorini korsatib, uni quyidagi buyruq bilan chaqirib olish mumkin: void glCallList (GLuint list) Birdaniga bir necha royxatni chaqirib olish uchun, quyidagi buyruqdan foydalanish mumkin: void glCallLists (GLsizei n, GLenum type, const GLvoid * lists) Bu buyruq identifikatorlari lists massivida bolgan n royxatlarni chaqirib oladi. lists massivi elementlarining turi type parametrda korsatiladi. Bular quyidagi turlar bolishi mumkin: GL BYTE, GL U N SIG N ED B YTE, GL_ShORT, GL_INT, GL_UNSIGNED_INT. Royxatlami ochirish uchun void gIDeleteLists (GLint list, GLsizei range) buyrugi ishlatiladi. Bu buyruq ID identifikatorlarga ega bo!gan list < ID < list+range-\ diapazonida royxatlami ochiradi. Masalan: glNewList(l, GL COMPILE); glBegin(GL_TRI ANGLES); glVertex3f(1.0f, l.Of, l.Of); glVertex3f(10.0f, l.Of, l.Of); glVertex3f(l0.0f, lO.Of, l.Of); glEndO; glEndList() glCallList(l); Displey royxatlari optimal, kompilyatsiya qilingan holatda server xotirasida saqlanadi. Bu shakl primitivlami maksimal tezlikda chizishga imkon beradi. Shu bilan birga, katta hajmli malumotlar xotirani kop qismini egallaydilar, bu o z navbatida, unumdorlikning pasayishiga olib keladi. Bunday katta hajmlami (bir necha on ming primitivlar) uchlar massivlari bilan chizish qulay. 137 Uchlar massivlari Agar uchlar soni kop b o isa va ulaming har birini g!Vertex*0 buyrug'i bilan chaqirmaslik uchun void glVertexPointer (GLint 'size, GLenum type, GLsizei stride, void* ptr) buyrugidan foydalanib, massivlarga birlashtirish qulayroq. Bu buyruq uchlarning koordinatalari va saqlash uslubini belgilaydi. Bu yerda size uchlarning koordinatalar sonini koisatadi (2,3.4 bo'lishi mumkin), type m aium otlam ing turini belgilaydi (GL_ShORT. GL_INT, GL_FLOAT, G LD O U BLE). Bazan bitta massivda boshqa uchlarning atributlarini saqlash qulayroq, shunda stride parametri bitta uchning koordinatasidan ikkinchisining koordinatasigacha kochishini belgilaydi. Agar stride nolga teng boisa, bu degani koordinatalar ketma ket joylashgan. Ptr parametrida m aium otlar joylashgan manzil korsatiladi. Shunga oxshab, quyidagi buyruqlardan foydalanib normal, ranglar va uchlami boshqa atributlarining massivlarini aniqlash mumkin: void gINormalPointer (GLenum type, GLsizei stride, void * pointer ) void glColorPointer (GLint size, GLenum type, GLsizei stride, void * pointer) Bu massivlami keyinchalik ham ishlatish uchun quyidagi buyruqni chaqirish kerak: void glEnableClientState (GLenum array) shu buyruq bilan keyingi parametrlar qoilaniladi: GL_VERTEX_ARRAY, G LN O R M A L ARRAY, G L C O L O R A R R A Y . Massiv bilan ishlashni tugatgandan song void glDisableClientState (GLenum array) buyrugini qoilaymiz. Massivning ichini qurish uchun void glArrayElement (GLint index) buyrugi ishlatiladi. Bu buyruq index nomerga ega massiv elementlaridan foydalanib uchlarning atributlarini OpenGL ga yuboradi. Uning omiga odatta void glDrawArrays (GLenum mode, GLint first, GLsizei count) 138 buyrug'i ishlatiladi. U mode parametri bilan aniqlanadigan count primitivlarni chizadi. Bunda u first dan first+count-1 gacha indeksli massiv elementlaridan foydalanadi. Bu glArrayElement() buyrugini chaqirish bilan teng. Agarda uch bir necha massivga kirsa, uning koordinataiarini qaytarish orniga massivda indeksini qollash qulayroq. Buning uchun void glDrawElements (GLenum mode, GLsizei count. GLenum type, void * indices) buyrugi ishlatiladi, bu yerda indices-uchlaming raqamlar massivi. Type bu massivning elementlarining turini belgilaydi G L_IJ N SIG N E D B YTE, GL_UNSIGNED_ShORT, GLUN SIG N EDIN T, count esa ulaming sonini belgilaydi. Massivlaming qollanishi OpenGL serveriga malumotlaming jo natilishini optimal holatga keltiradi va shu bilan birga uch o'lchamli sahnani chizishni tezlashtiradi. Bunday uslub primitivlarni aniqlash uchun juda tez va katta hajmli m alumotlami vizualizatsiyalash uchun juda qulay.
Do'stlaringiz bilan baham: |