Kompyuter grafikasi: OpenGL 1-qism

Kompyuter grafikasi: OpenGL 1-qism

Salom. Ushbu maqola haqiqiy kompyuter grafikasi va OpenGL haqida bo’ladi. Siz ushubu maqolani o’qib kompyuter grafikasi haqida ozgina bo’lsada tushunchaga ega bo’lasiz. Buning uchun sizda faqat ozgina vaqt ajaratib o’qish talab qilinadi holos. Keling gapni ko’p cho’zmayda maqsadga o’tay.

O’zim tarixni unchalik yoqtirmiman shuning uchun: GOOGLE kompyuter grafikasi tarixi.

Bilamizki kompyuter grafikasida eng katta rolni bu VIDEO CARD (Video karta) o’ynaydi. Nimaga? CPU (markaziy prosessor) unda nima ish qiladi?

Agar komyuter grafikasini tarixini o’qigan bo’lsangiz oldin grafikada CPU dan foydalanishgan, keyin CPU ishini osonlashtirish maqsadida GPU (graphics processor unit) ni chiqarishgan o’z navbatida grafikani tezligini oshirish maqsadida. Shu biz o’yin o’ynash uchun sotib oladigan video kartada GPU joylashgan.

GPU — bu ham prosessor bo’lib asosiy hisob kitoblari, maqsadi grafikaga mo’ljallangan. Ya’ni matritsalar, ranglar bilan ishlashga mo’ljallangandir.

Demak biz GPU bilan ishlashni bilsak, o’zimiz hohlagan narsamizni chizishimiz yoki o’yin yaratishimiz mumkin. Ho’sh qanday ishlash mumkin? Shu joyda biz OpenGL va DirectX haqida gapirsak to’g’ri bo’ladi.

OpenGL va DirectX lar bu funksiyalar to’plami bo’lib, GPU ya’ni grafik prosessor bilan ishlashga mo’ljallangan. Agar oldingi o’yin haqidagi maqolamni o’qigan bo’lsangiz shu yerda

glBegin(GL_QUADS);
glVertex2i(x, y);
...
glEnd();

kabi kod ishlatganman. glVertext, glBegin, glEnd bular OpenGL funksiyalari. Shu funksiyalardan foydalanib man GPU ga to’rtburchak chiz degan buyruqni berganman. DirectX da ham huddi shunga o’xshab ketadi, lekin man ishlatmaganman.

Keling endi oddiyroq usulda tushuntirsam. Har xil millatdan (har xil tilda gaplashadigan) rassomlarni bir zalga yig’ishdi. Shu rassomlarga endi tabiat haqida rasm chizish kerakligini tushintirish lozim. Demak bizga o’zbekchadan har bir millat rassomiga tushintiradigan TARJIMON kerak. Nechta bo’lsa shuncha. Bu yerda rassomlar GPU vasifasida, OpenGL va DirectX bular tarjimon vasifasida, siz bo’lsa rassomlarga nima chizish kerakligini etadigan dasturchisiz.

Endi o’zimga oldin juda ko’p bergan savolim: Shu OpenGL, DirectX kabin kutubxonalarni o’zimiz yozsak bo’ladimi?. Javob bo’ladi. Lekin siz hamma foydalanishi uchun va hamma video kartalarda ishlashi uchun har bir video kartani sotib olib, ularning har biriga drayver yozib chiqishingiz va shu drayveringiz orqali GPU ni boshqarishingiz kerak. Tasavvur qildingizmi? Qancha mehnatni talab qiladi. Umuman hamma millat (ya’ni har xil turdagi GPU) larni tilini o’rganib chiqishingiz lozim. Velosipedni qayta yaratmaylikda borini haydashni o’rganaylik.

Endi kompyuter grafikasining asoslarini ko’rib chiqsak ham bo’ladi.

Pixel — bu kompyuter grafikasining eng kichik birligidir. Ya’ni kompyuterda chizilgan har bir rasm pixel lardan iborat bo’ladi. Pixellar to’plami biron rasmni yoki obyektni ifodalaydi. Xuddi g’ishtli uyning g’ishtini PIXEL desak bo’ladi.

Color models — rang modellari, ya’ni kompyuter grafikasida ranglarni ifodalash uchun qo’llaniladigan modellar. Bulardan RGB, CYMK, HSB kabilar. Keling ranglar haqida keyingi maqolada. Chunki har bir model haqida bir kitobdan yozsa bo’ladi (kichkinaroq bo’lsada 🙂 )

Matrix — bu o’zimizni dasturlash tilida etsak a[n][m] ya’ni n,m o’lchamli massiv. Kompyuter grafikasida obyektlarni hisob-kitobini chiqarguncha matritsalardan keng foydalaniladi. Matritsaga misollar:

graphics 1

Bu ko’rsatganlarim bizga kerak bo’ladigan asosiylari, va ya’na mavjud. Shu joyga kelganda bitta narsa esimga tushib ketdi. Bizda endi dasturlash olamiga kirib kelyotgan yosh dasturchilarimiz matematik, fizikani bilmasdan turib dasturchi bo’lsa bo’ladimi? deya savollar ko’p berishadi.

Mani javobim: Bo’ladi, lekin dasturlash jarayonida ko’p muammolarga duch kelishingiz mumkin. Ayniqsa kompyuter grafikasida matematikani bilmasdan, hech bo’lmagandan matritsalar va oddiy hisob kitoblarni bilmay turib ishlash juda qiyin bo’ladi. Keyin matematikani juda kuchli bilib ham dasturchi bo’lish qiyin.

Nimaga matritsalarni tilgan oldim, chunki endi yozmoqchi bo’lgan hamma narsam matritsalarda ifodalanadi.

Ha yana kompyuter grafikasi ikkita qismga bo’ladi: 2D va 3D. 2D — bu tekislikka chizilgan grafika. 3D — bu uch o’lchamli fazoda chiziladigan grafika.

Matematikada A matritsani B ga ko’paytirgandagi natija B ni A ga ko’payirgandagi natijani bermaydi. Ya’ni AB != BA. Shuning uchun pastda keltirilgan ko’paytirishlarni o’z o’rnida qo’ygan holda hisoblang.

Kompyuter grafikasidagi asosiy tushunchalar.

Man 3D holat uchun ko’rsataman, 2D holat uchun qayerda Z qatnashsa shuni olib tashlasangiz 2D holatdagisi kelib chiqadi.

1. Surish matritsasi (transformation matrix) — nuqtani (nuqta biron bir obyekt yoki nuqtalar to’plami bo’lishi mumkin) dastlabki holatidan boshqa holatga o’tkazish (surish).

graphics 4

Bunda T bu surish matritsasi, p surilishi kerak bo’lgan nuqta, q bo’lsa p nuqtaning Dx,Dy,Dz ga surgandagi keyingi xolati.

Misol uchun: p(5, 4, 0) da tursa, va X o’qi bo’yicha 3 ga (Dx=3), Y o’qi bo’yicha pastga 6 (Dy=-6, pastga bo’lgani uchun), Z o’qi bo’yida tepaga 1 (Dz=1) birlikka surish kerak bo’lsa. Oxirgi natija q(8, -2, 1) holatga o’tadi.

2. Aylantirish matritsasi (rotation matrix) — nuqtani biron bir markazga nisbatan yoki o’z markazi atrofida aylantirish.

graphics 5

Tx, Ty, Tz lar mos holda X,Y,Z o’qi bo’yicha aylantirishdir. Agar siz p(x, y, z) nuqtani X o’qi bo’yicha 30 gradus burchakka aylantirmoqchi bo’lsangiz q(x, y, z) = Tx(30 gradus) * p ko’rinishida bo’ladi. q 30 gradusga burilgandan keyingi natija.

3. Siqish yoki kengaytirish matritsasi (scaling matrix) — X,Y,Z larni qiymatini Sx, Sy, Sz soncha oshirish yoki kamaytirish matritsasi.
graphics 6

T bu siqish (kengaytirish) matritsasi. Agar p(x, y, z) ni barcha o’qlar bo’yicha 2 marta siqish kerak bo’lsa, shunda Sx = Sy = Sz = 0.5. Shunda keyingi natija T * p qilsangiz q(x * Sx, y * Sy, z * Sy) = q(x * 0.5, y * 0.5, z * 0.5) nuqtada bo’ladi.

Ha yana bu matritsalarni matematik yo’l bilan keltirib chiqarsa bo’ladi. Lekin yana nima keragi bor velikni qayta yaratib. Oxir oqibat yana shu natijaga kelasiz. Shuning uchun shu matritsalarni bloknotingizning bir burchagiga yozib qo’ysangiz ko’proq as qotadi. Agar matritsalar bilan ishlashni o’rganib olsangiz kompyuter grafikasi bilan ishlash juda oson bo’ladi.

Endi bulardan tashqari kompyuter grafikasida asosiy rolni o’ynaydigan yana 3 ta matritsa mavjud. Bular World, View, Projection. Inglizcha nomlari shunaqa. Bularga tarif berishga o’zim ham qiynaldim. Shuning uchun misol ko’rinishida tushuntiraman. (Rasmlarni robertokoci.com/world-view-projection-matrix-unveiled/ dan olganman)

World matrix — Tasavvur qiling bizda p0, p1, p2, p3 to’rtburchakning to’rtta nuqtasi bo’lsin. Biz shu nuqtalardan foydalanib to’rtburchak chizdik. Endi shu to’rtburchakni X o’qi bo’yicha A burchakka burib chizish kerak bo’lsin. Unda biz tepadagi matritsadan foydalanib q0 = Tx * p0, q1 = Tx * p1, q2 = Tx * p2, q3 = Tx * p3 qilib q[0123] nuqtalardan foydalanib chizishimiz mumkin.

Endi tasavvur qiling shu to’rtburchakni X o’qi bo’yicha A burchakka aylantirib, Y o’qi bo’yicha surib yana Z o’qi bo’yicha aylantirish kerak bo’lsin. Har bir nuqtaga nisbatan 3 tadan amal bajarilib, jami 12 ta amal bajarish kerak.

q0 = Rz * ( Ty * ( Rx * p0 ) ) = Rz * Ty * Rx * p0
q1 = Rz * ( Ty * ( Rx * p0 ) ) = Rz * Ty * Rx * p1
q2 = Rz * ( Ty * ( Rx * p0 ) ) = Rz * Ty * Rx * p2
q3 = Rz * ( Ty * ( Rx * p0 ) ) = Rz * Ty * Rx * p3

Shu qiyinchilikni osonlashtirish maqsadida World matrix qo’llaniladi. Ya’ni siz aylantirish, surish kabi amallarni oldin bajarib olasizda keyin nuqtani chizasiz. Oddiy qilganda:

M = Rz * Ty * Rx
q0 = M * p0
...
q3= M * p3

ko’rinib turibdiki M bu World matrix. Ya’ni OpenGL da glRotate, glTranslate, glScale funksiyalari World matrixga o’zgartirish kiritadi. Keyin siz glBegin, glVertix, glEnd qilib nimadir chizsangiz World matrix ga ko’paytirilib chiziladi. Bu siz chiqmoqchi bo’lgan narsani surilgan va aylangan holatiga olib keladi.

graphics 7

Rasmda to’rburchakning dastlabgi holati va world matrix ga o’zgartirish kiritgandan keyingi holatini ko’rinsatilgan. Lekin to’rtburchakning kordinatalari o’zi o’qiga nisbatan saqlangan, asosiy kordinataga nisbatan o’zgargan bo’ladi. (Qizil asosiy kordinatalar o’qi). Manimcha tushuntira oldim.

View matrix (Camera) — bu ham World matritsaga o’xshagan matritsadir. Agar siz kamerani A burchakka Z o’qi bo’yicha bursangiz va kamerani joylashtirsangiz. Davomidan yana rotate, translate qilib obyektni chizdingiz. Shunda sizda 3 ta kordinatalar sistemasi hosil bo’ladi. Bittasi asosiy, ikkinchisiz kameraniki uchinchisi obyekt o’zining kordinatalar sistemasi. Qizil asosiy, yashil kameraniki, ko’k obyektniki.

graphics 8

Projection Matrix — proyeksiya matritsasi (o’zbekchada). Bu matritsa chizilgan obyektlarni oxirigi ko’rinish proyeksiyasini hosil qilish uchun qo’llaniladi. Ya’ni fazoda kub yaratsangiz va uni parallel proyeksiyasini olsangiz kvadrat bo’lib qoladi, agar ma’lum bir burchakdan qarab proyeksiyasini olsangiz kubga o’xshab ko’rinadi. Buni tushinish uchun CHIZMACHILIK degan fanni o’qish kerak ozgina.

Demak dasturchi bo’lish uchun har sohadan bir shingil bo’lishi lozim ekan 🙂

graphics 9

Oxirgi natijaviy matritsa (kompyuter grafikasi matematikasiga ko’ra):

mat4x4 World_View_Projection = World * View * Projection

ko’rinishida bo’ladi.

OpenGL da World va View matritsalar o’rnida ModelView matritsasi ishlatiladi. Keyin oxirgi natija ham boshqacharoq:

mat4x4 Projection_Model_View = Projection * ModelView

Ya’na OpenGL transformation matrix ga sal boshqacharoq ko’rinishda:

graphics 10

Shu bilan birinchi qism tugadi. Ikkinchi qismi OpenGL da shu matritsalar bilan ishlash haqida bo’ladi.

Texnologiyalar
Kompyuter grafikasi: OpenGL 1-qism