Iš pradžių buvo tamsa. Gili tamsa. Nesimatė nieko. Ir vieną dieną į pasaulį atėjo visų spalvų spalva! Baltoji Atvykėlė atnešė žmonėms daug laimės, žinių bei bemiegių naktų. Bet žmonės norėjo daugiau, tad ši balta spalva suskilo į kelias kitas, kurios padėjo jiems praskaidrinti savo pasaulį ir lengviau priimti informaciją. Dieve, palaimink DOS‘ą :) Tačiau tie laikai baigėsi, mes jau mokame daugiau, nebėra tamsos, nebėra bereikalingų vargų „prievartaujant“ klaviatūrą, norint įvykdyti kokią nors komandą. Windows tau padės!

Na, manau užteks čia dramatizuoti, tad pereikime prie reikalo. Žinoma, Windows aplinka yra gerai. Kuriamos programos dabar pritraukia daug dėmesio: jomis paprasta ir malonu naudotis. Tie langai tikrai palengvino žmogaus gyvenimą. Ne tik palengvino, bet ir nenustoja tai daryti. Bet čia klausimas: ar tai gerai? Vieni atsakys „žinoma“, tačiau aš taip negalvoju. Asmeniškai man visa ši standartinė langų sistema įgriso, viskas nusibodo, matau tik paprastus blankius, niūrius langus, kurie tikrai nuotaikos nekelia. Man reikia kažko daugiau… Daugiau spalvų, daugiau… Trimatės erdvės!
Aš jau jus supažindinau su Win32 API pagrindais, kaip viskas atrodo. Dabar pasinaudosim įgytom žiniom ir žengsime į naują spalvų pasaulį. Manau, jis jums patiks. Asmeniškai aš mėgstu, kai parašius nemažai kodo prieš mane pasirodo stulbinantis paveikslas, o ne banalus langas.
Padirbėsime su grafika. Tikriausiai nemažai jūsų žino tokius žaidimus, kaip Quake, DOOM III, Need For Speed ir, žinoma, Counter Strike. Arba programą eJay. Kas tarp jų bendra? Jie visi naudoja biblioteką objektų vaizdavimui. Kodėl pasirinkau būtent , o ne, tarkim, DirectX? Todėl, kad ši biblioteka yra labai paprasta, turi labai daug galimybių ir nesunku išmokt programuot, ko nepasakysi apie DirectX programavimą. Galimybių ten daug, tačiau pats kodavimas atima visas jėgas. Taip pat čia yra vienas niuansas. Windows Vista operacinėje sistemoje yra (teoriškai) nebenaudojamas, dėl to, kad neretai ši biblioteka blogai veikia ant kai kurių kompiuterių. Šiam jų poelgiui apibūdinti neužtenka keiksmažodžių: vietoj to, kad pagerintų situaciją, jie pasirinko lengviausią kelią – atsisakyti ir „prasukti“ savąjį DirectX. Bet manau, kad tai ne ilgam, nes Windows vis mažiau naudojama, o veikia ir Linux sistemoje, tad šios bibliotekos pamiršt nevalia.
Kuo skiriasi programa nuo eilinės? Visų pirma ji turi savo langą, kuris skiriasi nuo paprasto Windows lango. Išvaizda panaši, bet funkcijos visai kitos. Tačiau, kad langas veiktų Windows operacinėje sistemoje jo pagrindas turi būti panašus į Windows lango, o šį pagrindą aš peržvelgiau savo straipsnyje „Back to Basics“. Ten langą sukurt buvo labai lengva ir kodo buvo mažai, tačiau čia kodo bus tikrai daug, todėl siūlau pasidaryti šabloną. Dažniausiai WinAPI programa užima apie 20Kb, bet šiuo atveju tiek vietos užims vien projektas. Taip pat aš nesigilinsiu į visas kodo eilutes, nes, vėlgi, mano tikslas tik supažindinti. Pirmiausia nusikopijuokite duotą kodą. Perspėju iškart: jis nebus labai trumpas!
Čia nemažai komentarų, bet jei ir komentarai pasirodys nesuprantami, tai nekreipkit demesio, tiesiog žinokit, kad taip turi būti. Visos šios eilutės reikalauja nemažų WinAPI žinių, tad aš ir pats negalėčiau pasakyt, ką kai kurios daro.
Kadangi visas kodas užima apie ~464 eilutes (su komentarais), jį patalpinau čia:
http://pixel.paste.lt/paste/c22ae0b4dfc3eebb62c8023e8025d962

Tiesą sakant tai pati nemaloniausia dalis programavime. Tiek pastangų dėl paprasto juodo lango. Bet šios pastangos tikrai nebus bevaisės, tą aš garantuoju. Šis programos šablonas yra naudojamas daugelio programuotojų, tarp jų esu ir aš. Manau, atėjo laikas paaiškint kai kurias vietas.
Kas išvis yra ? (Open Graphics Library) yra nemokama grafinių instrumentų (funkcijų ir papildomų failų) biblioteka, kuri nepriklauso nuo operacinės sistemos. Visos GL funkcijos prasideda priešdėliu „gl“. Taip pat programos turi pagrindinę Main funkciją bei savo komandinius skliaustus: glBegin ir glEnd. Jie veikia truputį kitaip nei standartiniai Begin ir End. turi ir savo tipus. Pavyzdžiui, Integer tampa glInt, Real - glFloat ir pan. Jei funkcijos argumentai yra skaičiai, tai jie gali būti ne vieno, bet kelių tipų. Tokiais atvejais prie funkcijos vardo pridedama tą tipą apibūdinanti raidė (pvz. glFloat apibūdina „f“ raidė, glInt – „i“ ir t.t.). Su tokiomis funkcijomis susidursime antroje dalyje.
Duotąjame kode galima pamatyt jau pažįstamas funkcijas, kurios buvo naudojamos, kuriant paprastą WinAPI langą. programa naudoją vaizdo ir kitas plokštes, jose užima tam tikrą atmintį, kurią galiausiai reikia atlaisvinti, jei norite, kad kompiuteris dirbtų taip pat efektyviai, todėl tam yra specialios funkcijos. Taip pat tokia programa dažniausiai naudojama pilnaekraniame rėžime, todėl ir tuo čia pasirūpinome. Bet ne visos vaizdo kortos teisingai atlieka savo funkciją, todėl ne visiems vartotojams FulScreen rėžimas gali būti taisyklingai vaizduojamas. Kadangi ši programa naudoja daug visokių prietaisų (įvedimo/išvedimo), reikia tikrinti kiekvieną bandymą, prisijungiant prie kokio nors prietaiso ir pan, o radus klaidą – apie ją pranešt, todėl nemažą kodo dalį užima klaidų apdorojimas. Kad kompiuteris dirbtų efektyviai, programos paslėpimo (minimizacijos) atveju reikia pristabdyti jos darbą, todėl ir tam yra sukurta atskira funkcija. Keičiant poziciją ir lango dydį, pastarajį kaskart reikia atnaujint ir pakeist matricą, pagal kurią viskas yra vaizduojama. Jei jau užsiminiau apie matricas, tai beliko pasakyt, kad čia viskas yra jomis pagrįsta, t.y. programose yra vykdomi įvairūs veiksmai su matricomis, tokie kaip transformacijos. Transformavimų pagalba galime keisti visos scenos ar atskirų objektų savybes. Kode yra taip pat nustatomas pikselio formatas. Kas tai yra? Tai tiesiog būsimų vaizdų savybės, pavyzdžiui, jie gali būti permatomi arba turėti tam tikrą spalvų skaičių. Kai ką nors vaizduojate programoje, tai matote daug objektų, foną ir t.t. Viskas kartu yra vadinama scena. Scena yra erdvėje. Tarkim, Windows lange esantys mygtukai yra plokštumoje, už kurios nieko nėra, ir kur baigiasi lango ribos. lango viduje – erdvė. Vadinasi, tas pats mygtukas gali būti pastumtas ne tik į šonus arba į viršų (ir pan), bet ir į lango vidų arba jo išorę. Tai vykdoma matricos transformacijomis.
Į atskirus dabartinės programos elementus aš dabar nesigilinsiu, kadangi tai užimtų visą knygą. Tačiau galite panagrinėti kodą patys, paskaityt komentarus, o jei dar turite nemažai anglų kalbos žinių, manau rasite dar kažką naujo. Sekančioje dalyje aš pagaliau supažindinsiu su labiau akį traukiančia puse. :)

Panašūs straipsniai


“Žingsnis į kitą pasaulį (OpenGL I dalis)” komentarų: 16

  1. care

    ačiū už straipsnį :) kaip tik neseniai teko su java opengl pažaisti

    patarimas: skaidyk tekstą į pastraipas (arba dėk tuščią eilutė tarp pastraipų), nes labai sunku skaityti ir sekti, kur skaitai bėgiojant tarp source ir teksto :)

  2. Retry
  3. Retry

    Oj pamirsau parasyti :) Siaip pacioje pradzioje lango sukurimui labai paprasta naudoti Glut ar FreeGlut. ;)

  4. JudicatorMX

    Care, pastraipos tai yra. Bet del tarpu didesniu, cia gal ir tavo tiesa.
    Retry. Del Vista paminejau zodi “teoriskai”, nes yra visokiu kalbu. Asmeniskai man Vista kol kas ne prie sirdies, kadangi ten daug kas kol kas neveikia :) Del GLUT - taip, tai yra kur kas paprasciau. Taciau si biblioteka tiems, kurie neketina rimtai imtis OpenGL, kadangi sumazina galimybes :) Nors naujokeliams tai dazniausiai yra puikus pasirinkimas. Bet geriausia kurt savo moduli :) My opinion.

  5. Retry

    Na tos kalbos buvo, bet ju nebeturetu buti, nes tas straipsnis ish OpenGl ARB ( konsorciumo, kuris nusprendzia tolesni OpenGl likima ) irodo, kad dauguma kalbu apie vista ir OpenGL buvo ish pirsto lauztos.

    Ims dar ir tokios kalbos atbaidys zmones nuo OpenGl :D ;)

  6. loputis

    Man pasirodė kažkoks šališkas straipsnis, kodėl manai, kad DirectX labai sudėtinga? Tai yra visiška nesamonė.(Taip buvo prieš 6-5 metus) Neužtenka padaryti besisukanti kubą ir nuspręsti, kuri biblioteka yra paprastesnė. Remiantis tai kas rašoma wikipedijoje abi bibliotekos yra vienodai lengvos-sudėtingos. Žinoma, nors man asmeniškai DirectX(Direct3D)žymiai paprastesnis.
    Anyway, nebloga pradžia. Lauksiu tęsinio.

  7. JudicatorMX

    Retry, tikekimes, kad tai tiesa ;) As labai Vista nesidomiu, tad per daug isvadu ir negaliu padaryt, kadangi kol kas nezadu prie jos pereit :)
    Loputis, as apie sudetinguma niekad nesprendziu is kitu nuomoniu ir savo straipsnyje isreiskiau savo nuomone. Kiek teko dometis DirectX, tai priejimas prie sios bibliotekos labiau matematinis, nei dirbant su OpenGL. Nors ir programuoju, as nesu matematikas ir, tiesa sakant, matematikos negaliu pakest, todel man kur kas suprantamiau yra OpenGL. Cia lygiai tas pats, kas lyginti paskali ir C++. Paskali lengviau mokintis tiems, kas gerai supranta anglu ir nemegsta labai gilintis i detales. Taciau tie, kurie megsta labiau papluset ir pan, pasirinktu kaip pirmaja programavimo kalba - C++. My opinion.

  8. Aras Pranckevičius

    Tą dalį apie Vista ir OpenGL reikia iš viso išmesti, nes ten grynas melas. Vistoje OpenGL veikia lygiai taip pat, kaip ir Windows 95, 98, 2000, XP ar 2003. Absoliučiai niekas nepasikeitė - instaliuoji draiverį iš vaizdo plokštės gamintojo, ir turi tokį OpenGL, kokį draiveris realizuoja. Jei kas nors neveikia - tai draiverio kaltė, MS čia absoliučiai neprieko. Jei ką - aš ant Vistos dirbu nemažai, ir žinau kaip ten yra.

    Nesuprantu argumento kad “OpenGL yra lengviau”. Tu taip manai pats pabandęs, ar taip internete paskaitei? Ar su OpenGL bandei ką nors sudėtingesnio nei besisukantis trikampis? (realūs modeliai, dinaminė geometrija, šeideriai, render-to-texture ir t.t.)

    Aš bandžiau tiek D3D9, tiek OpenGL. Mano kvaila galva, OpenGL yra labai ir labai blogai. Prieš 10-15 metų tai turėjo prasmę, dabar - nebe. Galbūt su OpenGL Mt Evans versija jie sugrįš į dabartį, o gal ir ne. Pamatysim.

    Dar vienas dalykas - OpenGL draiveriai Windows sistemoms yra labai ir labai blogi. Pas mus darbe visame kode turime apie 50 įvairių “workaround”, kai aptinkam blogą draiverio versiją ir ką nors atjungiam arba bandom daryt kitaip, bo to nedarant programa tiesiog nulūš. Direct3D draiverių workaroundų turime lygiai vieną.

    Vo, pasakiau :)

  9. JudicatorMX

    1. Apie lengvuma. 4 eilute mano paskutinio komentaro.
    2. Apie sudetingesnius modelius. Tam egzistuoja specialios programos (paminejau kitoj daly). Nera prasmes kurti sudetingus modelius grynai programuojant, nes tada bus tikrai taip, kaip tu sakai.
    3. Apie draiverius. Taipogi sita dalyka paminejau, tik “paprastesne” kalba.
    Pakartojei tai, ka pasakiau :) As zinau, kad su draiveriais daug problemu ir tai jau nurodziau, kaip minusa.

    Kadangi esu parases 3 straipsnius, kuriuose tik supazindinu, as nesigilinu giliai i pliusus ir trukumus, kaip ir nesigilinu i koda. Gerai viskas, kas patinka. Cia jau kiekvieno skoniui.

  10. Aras Pranckevičius

    2. Aš nekalbu apie 3D softą. Kaip OpenGL’e pieštum modelius, kurie sudėtingesni nei pora trikampių? Kaip šeiderius rašytum? Kaip spec. efektus suprogramuotum? Tai yra realios užduotys, kurias reikia atlikti bet kokiame darbe, kuris yra daugiau nei “va nupiešiu trikampį”. Pabandyk jas padaryt su GL ir su D3D ir tada pasakyk, katras lengviau.

  11. JudicatorMX

    Va, butent modeliams (ir dar visokiems pribambasams) ir reikalingos tos programos. O efektai… Taip, cia jau daug darbo labai. Pateiksiu pavyzdi. As labiau programuoju su Delphi, negu su kokiu nors C++ kompiliatoriumi. Nors ir sako, kad C++ geriau, bet tas paskalis man priimtinesnis, nes, kad daug ka suprasciau, amn uztenka ir mano anglu kalbos ziniu. Tas pats ir su OpenGL.
    Ir vel gi pakartosiu - skonio reikalas. Sako, kad ir asembleris sunkus, o taip yra tik tiems, kurie juo nesidomi, arba nenori mokintis. Ka dalykas domina, tas ji supranta geriau.
    Mane DirectX taip pat domina, bet pirmenybe teikiu OpenGL, nes man priimtinesnis sirdziai, daug suprantu is funkciju pavadinimu (kaip su paskaliu). Kai pradedi programint sunkius dalykus, reiskia esi pazenges, ir tau nebus labai sunku nei su viena kalba (ar biblioteka), kuria mokinies savo noru.

  12. JudicatorMX

    Sunku kartais isaiskint savo minti :D

  13. Aras Pranckevičius

    Ok, matau kad vis dar klausimo nesupratai, arba aš blogai išaiškinau.

    Trys paprastos užduotys:

    1) su 3D programa susimodeliavai kažką, įsirašei į kažkokį formatą, užsikrovei kažkaip, žodžiu turi jau viršūnes/normales/UV ir t.t. Modelis didesnis nei keliolika trikampių. Kaip su OpenGL jį nupieši?

    2) reikia “bump-mapping” padaryt (t.y. šeiderius panaudot). Kaip su OpenGL tai padarysi?

    3) reikia padaryt vandenį, kuris atspindėtų vaizdą ir permatomas būtų (reflection + refraction). Kaip su OpenGL tai padarysi?

    Ką aš visu tuo noriu pasakyt: OpenGL yra lengvas ir suprantamas, kol žaidi glBegin/glVertex/glEnd smėlio dėžėje. Kai pradedi daryt tikrą darbą, tada ir išlenda visos “grožybės”.

    Mano atsakymai į mano paties klausimus:
    1) OpenGL - galbūt ARB VBO, galbūt tiesiog vertex arrays, galbūt display list’ai, galbūt compiled vertex array’ai, galbūt NVIDIA VAO, galbūt ATI VAO, galbūt Apple VBO; priklausomai nuo hardwaro/platformos/situacijos. D3D - vertex buferiai.

    2) OpenGL - galbūt Cg, galbūt ARB vertex/fragment programos, galbūt NVIDIA extensionai, galbūt ATI fragment shaderiai, galbūt GLSL, galbūt ATI text fragment shaderiai, galbūt NVIDIA combineriai, galbūt NVIDIA extensional GLSL’ui. D3D - šeideriai.

    3) OpenGL - galbūt PBuferiai, galbūt PBuferiai + WGL_render_texture, galbūt FBO. Plius visos kombinacijos iš 2) klausimo šeideriams padaryt. Plius visos kombinacijos iš 1) klausimo patiems modeliams paišyt. D3D - rendertargetai.

    Bet kam padaryti OpenGL’e yra penki+ būdai. Ir ne tai kad vieni vieniems atvejams, kiti kitiems - oj ne; penki būdai kurie iš esmės daro tą patį, bet neveikia vienais ar kitais atvejais, arba veikia kreivai vienais ar kitais atvejais, arba veikia tik ant tam tikro hardwaro. D3D praktiškai bet kam padaryti yra vienas paprastas būdas.

    Mano požiūriu, ta biblioteka kur yra mažiau makalynės, yra paprastesnė.

    Ok, užteks blevyzgot, laikas miegot.

  14. asterisk

    Jūs abu truputį nusgrybavot, baikit ginčytis.
    Esmė, jog straipsnis yra apie tai kaip naudotis OpenGL, o ne apie tai jog OpenGL yra geresnis už DirectX ar atvirkščiai.

  15. Justas

    1) ARB VBO
    2) GLSL shaders
    3) FBO

    P.S alternatyvos niekam juk nemaišo ;)

  16. Benas

    Sveiki visi, man reikia pagalbos. Perskaiciau abu straipsnius, t.y. 1 ir 2 dalis.
    Ieskojau atsakymo i viena klausyme, bet neradau :(
    Tai va: Pas mane Counter-Strike 1.6 zaidimas neveikia ant OpenGL vaizdavimo, tik ant Software ir ant D3D.
    Be to man kazkodel neveikia ir visos eJay dalys, kai isijungiu bet kuria eJay dali, ji man pradeda ziauriai strigti, ir neimanoma kurti muziko kai taip stringa.
    Labai noreciau kad man kai kas padetumet per skype: benas1994 ; arba email: WANTE2@one.lt ; Bet labiau noreciau kad per skype :)

    Tai ga gi, dekui kad isklausete, ir tikiuosi kad jus man padesite :)

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.