Terve kaikki,
Olen vääntämässä pientä kuvankäsittelyohjelmaa ja mutkien kautta pääydin käyttämään piirtoon OpenGL:ää.
Tällä hetkellä olen koittanut pohdiskella kuinka rakentaa tekstuuri käsittelijä sekä layerit. Eli kuten kaikissa normaaleissa kuvankäsittelyohjelmissa, käyttäjä voi määrittää kuvan koon. Olen rajoittanut leveyden ja korkeus arvojen maksimiksi 30000. Eli käytännössä käyttäjä voi tehdä 30000 x 30000 kuvan.
Tässä tulee heti ensimmäinen mietinnän aihe. Eli jos käyttäjä määrittää esim. tuon maksimi kuvakoon eli 30000 x 30000 niin miten tämä kannattaisi rakentaa textuuri tasolla. Käsittääkseni textuureissa suositellaan koon olevan 2 potenssiin ja maksimi koko taitaa olla jotain 8192 x 8192 tasoa riippue näytönohjaimesta?
Eli ensimmäisenä tulee mieleen että tuo 30000 x 30000 kuva tulisi pilkkoa pienempiin tekstuureihin järjestelmä tasolla ja piirtää ruutuun. Mutta mitä jos pisteet eivät mene tasan tuon 2 potenssin kanssa?
Tämän lisäksi olen koittanut pohdiskella tuota layereitten rakennetta, mutta eiköhän tässä ole tälle päivää tarpeeksi abstraktista höpötystä.
...asia lyhyesti.
- Onko OpenGL:ssä hyvä tapa käyttää ei 2 potenssin kokoisia textuureja.
- Onko kuvan pilkkominen pienempiin ainoa tapa?
- Kiitos.
- jos tarvitset muunkokoisia, sen kun käyttää. Tuettu versiosta 2.0 alkaen (vuosikymmenen siis kai?). Jollain tasolla tehokkuus voi kärsiä, toisaalta nykyrauta ei oleta tekstuureja piirrettävän mitenkään tietyllä tavalla, joten ei välttämättä iso ero. Testaamalla selviää ainakin omalle kokoonpanollesi, muttei välttämättä kerro mitään seuraavasta GPUsta
- jos rauta ei tue niin isoja kuin tarvitaan, pilkkominen on pakollista ja voi hyödyttää muutenkin kuvan käsittelemistä. Toki myös voi aiheuttaa lisätyötä reunakohdissa, mutta muukaan ei aina onnistu.
Ja epälyhyeen "entä jos pisteet eivät mene tasan": voit vaikka käyttää tuota 8192^2-kokoa siihen osaan mihin voi ja loppuihin sitten 2-kakkosen-potenssi-kokoja.
Oletko huomioinut, että 30000 * 30000 px * 4 t/px = 3,35 Gt? Käytännössä kannattanee siis pitää tekstuurina vain näkyviä osia kuvasta ja vähän siitä ympäriltä ja ehkäpä pienennettyä versiota koko kuvasta.
Kyllä vaan. Eipä taida normaali kullutajalta löytyäkkään noin suuri resoluutioista näyttö, jotta saisi jokaisen pikselin ruutuun.
Tosin jollain tasolla tuo 30000 * 30000 pitäisi saada ajettua opengl shadereitten läpi, koska ajattelin että kaikki piirto tapahtuisi shadereitten kautta frame bufferiin.
En kyllä ole täysin varma kannattaako pirtoa toteuttaa GLSL:än kautta. Ensinnäkin vaikeuksia on tuottanut tuo Paint Bucket ( Flood Fill ) hahmottaminen GLSL:ä. Eli miten tuoon toiminnon GLSL voisi toteuttaa. Ja tosiaan Paint Bucket shaderissä pitäisi vielä ottaa huomioon noi kaikki pilkotut tekstuurit.
kayttaja-3842 kirjoitti:
Kyllä vaan. Eipä taida normaali kullutajalta löytyäkkään noin suuri resoluutioista näyttö, jotta saisi jokaisen pikselin ruutuun.
Ihan mielenkiinnosta, missä tuon kokoisia (30 000 x 30 000 pikseliä) näyttöjä ON käytössä?
No noilla on jo sinne suuntaan (35640 x 8000): http://www.itsartmag.com/features/hyperwall/
Nimenomaan. Itsellä ei ainakaan ole tietoa ko. kokoisista näytöistä. Laitoin tuon kommentin vain siksi ettei joku spede tule seuraavassa kulmassa itkemään, että tämä ja tämä taho toteuttaa tuon kokoisia näyttöjä.
Käytännössä tuo 30k x 30k on vain digitaalisen kuva datan koko. Eli käytännössä ei voida toistaa koko kuvaa näytössä, mutta ohjelman muistissa ja tiedostoon viennissä tulee koko data olla.
Piirtäminen näytölle kannattaa tehdä GLSLllä. Kuvankäsittelyä taas ei kannata, koska siinä on huonosti paralelisoituvia operaatioita; esim. flood fill.
Sen toteutus grafiikkakortille olisi vaikeaa ja prossutoteutus tekisi työn lyhemmässä ajassa. Voisi ehkä olla kannattavaa etsiä prossulla ääriviivat ja sitten täyttää grafiikkakortilla jokainen rivi erikseen.
Jos haluat tehdä flood fillin kokonaan grafiikkakortilla niin pitää syöttää shaderille se, mitä sieltä tuli viimeksi ulos Framebuffer objectilla. (Transform Feedbackilla tai Compute Shaderillä voisi myös ratkaista ongelman.)
Jos kuva ei ole tekstuurin kokoinen, voi käyttää vain osaa tekstuurista.
Aihe on jo aika vanha, joten et voi enää vastata siihen.