Olen SDL :n dokumentaatioita ja NeHe :n tutoriaaleja soveltamalla saanut OpenGL :n toimimaan SDL :n kanssa yhteistyössä. Asettamalla näyttötilan OPENGLBLIT-valitsimen kanssa olen jopa onnistunut käyttämään 2d-piirtofunktioitani siinä samassa, mutta jostain syystä se hidastaa ohjelmaa kummallisen paljon. Olen piirtänyt pinnalle, jonka saan näyttötilan alustuksessa, ja siirtänyt sen näkyviin SDL_Flip :llä.
Minne piirto oikein olisi kohdistettava, että se menisi suoraa sinne, minne OpenGL :kin piirtää? Tupla-flippaaminen kun vaikuttaa olevan hitauden syynä. Missä välissä 2d-piirtäminen kuuluisi tehdä, vai onko sillä suurempaa väliä?
Toinen ongelma on OpenGL :n hitaus. Mikä maksaa, kun yhden teksturoidun kuutionkin pyörittäminen pätkii ja peleissä näytöllä vilisee sujuvasti satoja polygoneja? Kuution pyöritys on kopioitu NeHe :ltä. Eikö ohjelma tajua käyttää laittestoa piirtämiseen, vaan laskee kaiken ohjelmallisesti?
SDL_SetVideoMode palauttaa pinnan johon sinun tulee piirtää. Yleensä 3D renderöidään pinnalle ensin ja sen jälkeen 2D jolloin 3D jää taustalle.
Vaikea sanoa missä syy hitauteen on näkemättä koodia.
Vaikka en ole SDL:lää pahemmin käyttänytkään, niin voin sanoa, että älä käytä SDL:n ja OpenGL:n piirtofunktioita sekaisin. Käytä myös 2D grafiikan piirtoon OpenGL:ää, se on joka tapauksessa nopeampaa kuin SDL:n piirtorutiinit.
lainaus:
SDL_SetVideoMode palauttaa pinnan johon sinun tulee piirtää. Yleensä 3D renderöidään pinnalle ensin ja sen jälkeen 2D jolloin 3D jää taustalle.
Ongelma onkin siinä, että pinta, jonka SDL_SetVideoMode palauttaa, ei ole sama kuin pinta, jolle OpenGL piirtää. Tästä syystä pitäisi siis varmaankin piirtää 3d-jutut OpenGL :llä gl-pinnalle, piirtää sitten 2d-kama sdl-pinnalle, blitata sen jälkeen sdl-pinta (jollakin alfa-kopioinnilla) gl-pinnalle, ja vaihtaa lopuksi gl-bufferia, jotta tavaran saa näytölle. Vaikuttaa lievästi sanottuna monimutkaiselta! (tässä se sdl-pinnan kopioiminen gl-pinnalle tuntuu olevan aikaa vievin prosessi)
lainaus:
Käytä myös 2D grafiikan piirtoon OpenGL:ää, se on joka tapauksessa nopeampaa kuin SDL:n piirtorutiinit.
Sisältääkö OpenGL esimerkiksi viivojen tai ympyröiden piirtofunktioita? Mistä saan osoittimen sinne gl-piirtopinnalle, jotta pääsen muokkaamaan sitä pikseli kerrallaan? Ja ei se SDL tietääkseni mitään omia piirtofunktioita sisällä, vaan täytyy käyttää joko jotain lisäkirjastoa tai ohjelmoida rutiinit itse.
>Sisältääkö OpenGL esimerkiksi viivojen
> tai ympyröiden piirtofunktioita?
Viivan piirtoon kyllä.
glColor3fv(viivanVäri);
glLineWidth(viivanPaksuus);
glBegin(GL_LINES);
glVertex2f(alkuX, alkuY);
glVertex2f(loppuX, loppuY);
glEnd();
Ympyränpiirtoon sinun pitää tehdä oma funktiosi.
> Mistä saan osoittimen sinne gl-piirtopinnalle,
> jotta pääsen muokkaamaan sitä pikseli kerrallaan?
Et saa osoitinta mitenkään (tai no ehkä superbuffers extensionin kautta).
Voit tosin lukea pikselin glReadPixels()-funktiolla ja kirjoittaa glDrawPixels()-funktiolla.
En tosin heti keksi yhtään tilannetta miksi puskuria pitäisi päästä muokkaamaan "manuaalisesti"?
No eikö se sitten ole hidasta kutsua glDrawPixels()-funktiota erikseen joka pikselin piirtämiseen. ( Vai voiko sillä kenties piirtää monta pistettä kerralla kun se kerran on glDrawPixels()? )
Mitäs muuta sitten ajattelit? Vai mitä teet. Jos teet ymburan niin kannattaa piirtää se monella viivalla eikä pikseli pikseliltä, silmä ei kuitenkaan erota ympyrää n-sivuisesta monikulmiosta jos n on tarpeeksi iso suhteessa ympyrän kokoon.
> Vai voiko sillä kenties piirtää monta pistettä kerralla
> kun se kerran on glDrawPixels()?
Kyllä voi. Sillä voi piirtää neliön muotoisen alueellisen pikseleitä. Se on kuitenkin siitä huolimatta hidasta, koska dataa joudutaan siirtämään näytönohjaimen muistin ja keskusmuistin välillä.
Kertoisitko miksi sinun pitää muokata puskuria suoraan? Se ei nimittäin yleensä ole tarpeellista.
Onko opengl:ssä joku rutiini, jolla saa piirrettyä kuvan ruudulle tiedostosta?
SDL:n oma piirtorutiini on todella hidas. ;/ Miten sillä on muka pelejä tehty? ;>
Et ole sattunut kokeilemaan mitä tuo "NeHeGL SDL" basekoodi sanoo jos isket siihen tuon kuutionpiirron. Pätkiikö? http://nehe.gamedev.net/counter.asp?file=files/
Mikä näytönohjain sinulla muuten on? Ja niin, 2D-piirto tulisi tehdä OpenGL:llä, SDL:ää ei kannata mielestäni mukaan sotkea kuin ehkä musiikin ja tietysti ikkunanluonnin jne yhteydessä.
Vastaavaa olen testannut mutta en juuri ko.:aa.
Pätkiihän se, koska fps tippuu sdl:n piirtorutiinin nopeuden tasolle tai alle.
Radeon 9800 pro:lla ja 8500LE:llä on tullut testattua. Kivahan se olisi opengl:n 2d piirtoa käyttää jos vain osaisi ;p
lainaus:
Kertoisitko miksi sinun pitää muokata puskuria suoraan?
Ei ole mitään erityistä syytä. (Mutta mitäs jos haluaisinkin vaikkapa laittaa 3d-näkymän aaltoilemaan tai näyttää jonkin dynaamisesti(?) muuttuvan kuvan ruudulla (esim. tulen)?)
->fawkz:
Olen ennenkin kokeillut NeHen SDL-peruskoodia, mutta en saanut sitä toimimaan enkä jaksanut yrittää pidempään :-(. Nyt kokeilin uudestaan ja sain sen toimimaan eikä pätkinyt yhtään. Näytönohjain on Voodoo3.
lainaus:
Pätkiihän se, koska fps tippuu sdl:n piirtorutiinin nopeuden tasolle tai alle.
Kyllä, mutta eivät ne ilman OpenGL :ä niin hitaita ole. Tekeeköhän SDL jonkin muunnoksen kuvalle kopioidessaan sen gl-bufferiin?
Miksei OpenGL :ä tarvitse asentaa ja päivittää samalla tavalla kuin DirectX :ä (vai pitääkö)? Tuleeko se käyttöjärjestelmän tai pelien mukana vai eikö se tarvitse ollenkaan samanlaista asennusta?
lainaus:
Kyllä, mutta eivät ne ilman OpenGL :ä niin hitaita ole
Jaa, eivät vai? Minulla ovat ainakin.
lainaus:
Kyllä, mutta eivät ne ilman OpenGL :ä niin hitaita ole.
Tarkoitin kylläkin lähinnä SDL_Flip()-käskyä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.