Featured Post

Helppo ja nopea kolmionpiirtorutiini.

Vau. Kehitys kehittynyt ja oppi opittu. public static void SolidTriangle(Point a, Point b, Point c, Color color) {             Point[] po...

Saturday, July 05, 2008

Viivanpiirtoa nopeasti.

Aioin alunperin tehdä nämä testit JavaScriptillä, mutta siitä ei löytynyt putpixeliä, joten sen
sijaan joudun käyttämään Javaa. Missä ei myöskään ole putpixeliä, joten kirjoitin setRGB:lle wrapperin.

Okei, tämä on nuoruuden traumoja: En koskaan saanut viivanpiirtoa toimimaan ihan niinkuin olisin halunnut - fixed pointeilla miten pitkiä viivoja hyvänsä, nopeasti ilman aukkoja. Tästä syystä 3d-koodauskin vähän jäi, kun ei saanut polygoneja täytettyä itse. Ja siihen aikaan Oma Sen On Oltava oli iso iso juttu.
Mutta no, tässä on viivanpiirtorutiini, jonka pitäisi olla kohtuunopea, se ei taida olla tosin.... Kaukana optimaalisesta - mutta sinne päin kallellaan. Muuttujia voisi karsia, sekä iteraatiomäärissä voisi hyppiä varmasti fiksumminkin. Porttaaminen toiseen järjestelmään pitäisi olla todella triviaalia.

Kuinka se toimii?

Um. Piirrämme aina oikealta vasemmalle, ja sellaisia viivoja joitten delta-x>delta-y. Teemme rotaatioita jotta tämä onnistuu. (y=x, x=y keikautus)

Käytämme fixed-pointteja jotta Y-siirtymä olisi riittävän tarkka. Jos piirrämme alhaalta ylös, painetaan asia mieleen( vähennetään eikä lisätä liikuttaessa ) ja muutetaan delta positiiviseksi.

Itse luupissa harpotaan x-suunnassa eteenpäin kunnes olemme lähellä paikkaa missä Y-koordinaatti vaihtuu. tässä pitää olla tarkempana, joten siirrymme hyödyntämään fixed pointtejamme.

Jotain sellaista, kai. Tuostakin voi vielä optimoida jos haluaa, mutta lähinnä tein tämän jotta tietäisin miten se toimii, ja koska nuorempana se ei ihan onnistunut. Tietty, kannattaa ennemmin käyttää valmista viivanpiirtorutiinia nykyaikana, ( Javan oma esim. on n. 40 kertaa nopeampi. ) mutta se on tarkka ja toimiva. Sitäpaitsi, voin syyttää hidasta putpixeliä. :P
Parempi tapa tämänhetkisen putpixelin sijasta olisi käyttää SetRGB:n sitä versiota joka mäppää tietyn alueen kerralla, mutta noh...

pikseleitten bufferointi näyttää nopeuttavan testiä n. 50 msec, mikä on mielenkiintoista - sen ei kuvittelisi vaikuttavan. Kaiketi Javan cache operoi fiksummin näinpäin, kun pitää monta kertaa kutsua setRGB:tä?

Mutta siis! Kun on viivanpiirtorutiini, voi siirtyä tekemään täytettyjä kolmioita, ja niistä pääseekin sitten jo teksturoituihin kolmioihin!

JavaScriptilläkin voi tehdä kolmedeetä, varsinkin jos käyttää Canvas-tagia apuna, mutta siinä
pitää kyllä sitten hyödyntää sen valmiita grafiikkakomentoja, muuten ei mikään onnistu. Ei omaa
putpixeliä siis voinut oikein tehdä.

Sain luettua toisen pelisuunnittelukirjan, sekä "Born to Code in C" opuksen, jossa tosin rupesin skippailemaan. Erittäin hieno kirja tosin, siinä tehdään mm. ikoni ja animaatioeditori, multitaskaava ohjelma ilman mitään threadeja ja tietokanta, muunmuassa.

Eilisen aamupaino oli 98.1, tänään 97.6. Kävi siis selkeästi ylempänä kiitos TexMexin. Nyt on taas alaspäin menossa. Sitten kun menee alle 96.0:n voisi kai palkita itseään jollain kivalla ruualla.

No comments:

Post a Comment