Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: läpinäkyvyys (OpenGL)

Sivun loppuun

Touho [05.12.2005 21:43:08]

#

Miten on helpoin tehdä helpoten läpinäkyvä kuva näytölle ilman maskia? Bmp on helpoin tapa ladata ohjelmaan kuva, mutta bmp ei tule alpha kanavaa, jota tarvitaan glAlphaFunc() funktiossa, joka muuten olisi loistava tähän tarkoitukseen. Olisi paljon helpompi piirrellä kuvia pinkillä tai mustalla pohjalla kuin tehdä jokaiseen kuvaan erillinen maski.

Metabolix [06.12.2005 09:36:57]

#

Purkkaratkaisuna voi tietenkin itse muuttaa kaikki tietyn väriset pikselit läpinäkyviksi, eli kuvan lukemisen ja glTexImage2D:n välissä for-silmukka. Tämä on varmaankin ainut tapa käyttää tuota pinkki tausta -tekniikkaa. Ja vaikka päätyisit tähän, suosittelen silti PCX:n tai TGA:n opettelua, kun ne menevät pienempään tilaan kuin BMP.

Parempana vaihtoehtona on tutustua äsken mainittuun TGA-muotoon (http://organicbit.com/closecombat/formats/tga.html). TGA:n lataaminen on hyvin helppoa. Suosittelen tekemään lataajan itse, niin tulee samalla kokemusta siitäkin. Valmiita toki löytyy Googlella.

PNG on ehdottomasti paras, suhteellisen tehokkaasti pakattu (ilman laatuhäviötä tietenkin). Siihen en enää suosittele oman lataajan tekoa, vaan sen sijaan suosittelen glpng:tä.

Alpha-kanavan kanssa ongelmanasi tulee lähinnä olemaan editori, joka tukisi sitä. Periaatteessa BMP-muotoiseen kuvaan voi sen tallentaa, mutta kukaan ei sen jälkeen ymmärrä enää, kun BMP:ssä ei ole koskaan sellaista käytetty.

Edit:
Tuli mieleeni, että toivottavasti et nyt sitten käyttänyt jotakin glaux-kirjastoa, joka lataa BMP:t puolestasi :) Jos käytit, niin on jo korkea aika opetella itse lataamaan noita kuvia.

Touho [06.12.2005 10:17:29]

#

Kyllä minä noita valmiita funktioita olen käyttänyt. Kaikissa mahdollisissa oppaissa on tähän mennessä tyrkytetty valmisfunktioita, niin ei ole tullut mieleenkään tehdä semmoista itse. Pitänee opetella. Samalla varmaan oppii, miten tehdään pikselit läpinäkyviksi.

Onko png kuvia vaikeampi ladata tai muokata läpinäkyviksi, kun et kerran suositellut siihen itse tehtyä systeemiä?

Metabolix [06.12.2005 10:54:50]

#

Siis, kun lataat kuvan, joudut joka tapauksessa muuttamaan sen täysin pakkaamattomaksi (BMP-tyyliin), jotta se kelpaa OpenGL:lle, ja siinä vaiheessa on mitä tahansa yhtä helppo muokata. Mutta koska PNG on pakattu huomattavasti mutkikkaammalla metodilla kuin PCX tai TGA, sitä on vähän ikävä lähteä purkamaan tiedostosta asti itse. Kun se kerran tiedostomuotona jo tukee läpinäkyvyyttä, niin saman tien voi editorilla tehdä läpinäkyvyyden ja ladata koko kuvan valmiilla funktiolla.

Totta kai TGA:kin tukee läpinäkyvyyttä tiedostona (ja teoriassa PCX:kin), mutta se on niin yksinkertainen tiedostomuoto, että se no itsekin mahdollista lukea tiedostosta.

Jos kaipaat esimerkkiä, niin aloin tässä juuri itse väsätä TGA-lataajaa (tietenkin vilkaisemattakaan tarkemmin mitään valmiita speksejä; kokeilemalla selviää :)

Touho [12.12.2005 17:08:35]

#

Miksi glpng lataa kuvat väärinpäin? Onko lausekkeessa vikaa tai pitääkö png kuvat vain tallentaa ylösalaisin?

pngBind("kuva.png", PNG_NOMIPMAP, PNG_ALPHA, &info, GL_CLAMP, GL_NEAREST, GL_NEAREST);

Meitsi [12.12.2005 17:11:38]

#

Voithan tehdä kaksi kuvatiedostoa, toinen normaali bmp, toinen maskikuva. Alpha-blend onnistuu tottakai, jos maskikuva on 256 värinen.

Touho [12.12.2005 17:14:57]

#

Jos peliin tulee paljon kuvia, niin kaksin kertainen määrä bmp kuvia tekisi pakkauksen koon turhan isoksi. Png systeemi vaikuttaa minusta ihan hyvältä.

Meitsi [12.12.2005 17:40:04]

#

Touho kirjoitti:

Jos peliin tulee paljon kuvia, niin kaksin kertainen määrä bmp kuvia tekisi pakkauksen koon turhan isoksi. Png systeemi vaikuttaa minusta ihan hyvältä.

Joo png on kyllä kätevämpi, mutta jos bmp olisi ainoa kätevä vaihtoehto, niin sen värien määrää saa kyllä pienennettyä.

Metabolix [13.12.2005 17:45:27]

#

Touho: pngSetStandardOrientation(1). Normaalisti PNG:t ovat niin päin, että (0,0) on vasen yläkulma, mutta OpenGL:ssä (0,0) on vasen alakulma.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta