.[ ČeskéHry.cz ].
OpenGL ES - vykopirovat konkretny mip level

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1824

PříspěvekZaslal: 30. srpen 2014, 12:08:33    Předmět: OpenGL ES - vykopirovat konkretny mip level Odpovědět s citátem

Zdar!

Snazim sa uz par hodin, ale zatial sa mi nedari prist nato, ako v OpenGL ES vykopirovat z textury konkretny mipmap level. Proste mam texturu, ktora ma napriklad 10 mipmap a v tej poslednej (cislo 9) mam pre mna zaujimave data. A chcel by som si to skopirovat najlepsie z GPU nazad na CPU alebo aspon do inej GPU textury, ktoru by som si potom cez FBO + glReadPixels vykopiroval.

Nejako nechapem, ako ma presne glCopyTexImage2D fungovat Sad

Skusam to takto:
mam tex0, ktora ma 10 mipmap a zaujima ma mip 9 (1x1 px)
mam tex1, ktora ma 1x1 a jedinu mipmapu
glBindFrameBuffer(GL_FRAMEBUFFER, generatedFBO)
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex0)
glBindTexture(GL_TEXTURE_2D, tex1)
glCopyTexImage2D(GL_TEXTURE_2D, 9, GL_RGB, 0, 0, 1, 1, 0)

No a predpokladam, ze moja tex1 by mohla takto vykopirovat level 9 z tex0 do tex1 level 0. No ale tak to zjavne nebude celkom, co? Very Happy Ked tam dam namiesto 9 nulu, tak mi to krasne vykopiruje pixel z rohu. Ale ked tam dam 9, tak hovno. Aky je teda vyznam toho level parametru?

Predstavujem si, ze by sa to mohlo dat i pomocou nasamplovania vo fragment shaderi pomocou texture2D(sampler, vec2(0,0), bias), kde bias bude asi tych 9.0? A potom si moj 1x1 FBO image vykopirujem pomocou glReadPixels.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 30. srpen 2014, 13:44:11    Předmět: Odpovědět s citátem

toto by malo zvladnut glGetTexImage() ktore v OpenGL ES 2.0 je dostupne.

ten kod nefuguje uz len kvoly tomu ze level v glCopyTexImage2D() urcuje mip mapu cielove textury. teda snazis sa nakopirovat ten jeden pixel do 9 mipmy ktora ale neexistuje.

ked uz tak ta 9 by mala byt ako stvrty parameter do glFramebufferTexture() ktory ti v tom priklade chyba.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1824

PříspěvekZaslal: 30. srpen 2014, 13:58:21    Předmět: Odpovědět s citátem

glFramebufferTexture2D ma povinne level 0 v ES (Specifies the mipmap level of the texture image to be attached, which must be 0.)

glGetTexImage nie je v ES 2.0 (https://www.khronos.org/opengles/sdk/docs/man/xhtml/)

Mylim sa?
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 30. srpen 2014, 19:18:33    Předmět: Odpovědět s citátem

Přímo tam ta fce. není (maximálně jako nějaká EXT, nevím na co cílíš), nicméně je tam glReadPixels. Můžeš zkusit ten mipmap level vyrenderovat do FBO a to pak přečíst.
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 31. srpen 2014, 06:13:12    Předmět: Odpovědět s citátem

pcmaster napsal:

glGetTexImage nie je v ES 2.0 (https://www.khronos.org/opengles/sdk/docs/man/xhtml/)

Mylim sa?


nie. ja som omylom otvoril OpenGL 2 specification a nie naozajstnu ES spec. Confused
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 1. září 2014, 08:05:34    Předmět: Odpovědět s citátem

Co je to mipmapa? Ale udělej to v Unity hele, tam je všechno! :-D

Jinak asi tak, jak psal perry. glReadPixels funguje. Co přesně děláš? Nějakej efekt, kde potřebuješ průměr scény? Jsou potřeba i ostatní levely mipmapy?
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1824

PříspěvekZaslal: 1. září 2014, 09:25:07    Předmět: Odpovědět s citátem

V skutocnosti to bolo spracovanie obrazu. Renderoval som do FBO, tam sa ale smie len do levelu 0. Ale ten je velmi velky (napr. 1k) a potreboval som urcit, ci nastala od poslednej iteracie v texture zmena. Takze napad bol vygenerovat si mipmapu (resp. inu redukciu 2x2 -> 1 s inym filtrom) a porovnat s predchadzajucou verziou. No a porovnat sa to da jedine na CPU tak, ze si stiahnem tie data nazad. Proste nemal som dost casu a prenosoveho pasma na to, aby som si stiahol celu velku texturu nazad na CPU, chcel som porovnat len 1 pixel namiesto 1k x 1k. OpenGL ES 2.0 bez extensions.

Takze paralelnou redukciou v GLSL som to chcel zredukovat na 1x1 px, to si pomocou glReadPixels precitat a pripadne iteracie ukoncit.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1558

PříspěvekZaslal: 1. září 2014, 10:08:27    Předmět: Odpovědět s citátem

No a povedlo se? Něco podobného jsem kdysi taky okrajově řešil, ale uspokojivě nevyřešil.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1824

PříspěvekZaslal: 1. září 2014, 10:26:48    Předmět: Odpovědět s citátem

Ukazuje sa, ze API mi v tom nepomoze, na desktope alebo v ES 3.0 by to uz slo. Tak este vymysliet, ako precitat poslednu mipmapu. Alebo ako vlastne prekopirovat urcitu mipmapu do 1x1 textury. Pomocou shadera a bias parametra v texture2D? Proste vykreslit 1x1 viewport, v nom pouzit texture2D(sampler, vec2(0,0), 14) a z neho glReadPixels? A preco bias 14? Lebo 2^14 = 16384 a vacsiu texturu mat urcite nebudem. Btw, tusite z dokumentacie k texture2D, ake hodnoty smie mat bias a co sa stane, ak dam vyssiu hodnotu nez ma textura pocet mipmap? Clamping? Undefined?

Edit: Haha, no tak ani v referencnej prirucke k GLSL ES som nenasiel nic o tom, ako sa aplikuje a clampuje bias v texture2D. Funkcia texture2DLod zase nie je pre FS pristupna. Takze... da sa predpokladat, ze ak mam sampler na texturu 1024x1024 a viewport 1x1 (takze bude len 1 invokacia FS) a budem samplovat tu texturu na koordinate 0,0, tak sa mi automaticky vyberie posledny lod/mip/level? Alebo mam samplovat na 0.5, 0.5? Help Smile
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 1. září 2014, 10:41:23    Předmět: Odpovědět s citátem

No, já to používám na picking, vykreslení do 1x1 viewportu a glReadPixels. Myslím, že to takhle můžeš udělat taky, vytvoření mipmapy nebude interně asi nic jinýho, než vykreslení do dvakrát menšího framebufferu. Výkon bych tam čekal stejný, ale to je jen moje doměnka.

Ještě mě napadlo: když si uvědomíš, že při vytváření dalšího levelu mipmapy se počítá pro nový pixel průměr 4 pixelů, mohl bys to i urychlit. Tím, že bys rovnou spočítal průměr z více než 4 pixelů a tím zmenšil počet potřebných renderů než je řetěz klasický "1024->512->256->...->1". Ve fragment shaderu by sice vzrostl počet přístupů do textury, ale měl bys třeba jen 1024->256->64->16->4->1. Nebo i jinak :-).
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
michalferko



Založen: 29. 09. 2008
Příspěvky: 83

PříspěvekZaslal: 1. září 2014, 11:03:53    Předmět: Odpovědět s citátem

Podobne som robil na analyzu priemernej a max. intenzity v HDR obraze kvoli tone-mappingu. Downsamplovat 4x4 -> 1x1 davalo najlepsie vysledky (teda na PC so silnou grafikou, na ES to mozno bude inak), ale riesil som to cez dve FBO. Vyrenderujes do jedneho zmenseninu, nastavis viewport do druheho na velkost predchadzajuceho deleno 4, vyrenderujes do druheho. Striedas az kym nemas v velkost viewportu 1x1 (stale mas iba 2 textury) a nakoniec vies cez glReadPixels precitat ten jeden pixel, kedze ho mas v bindnutom FBO.
_________________
Moje minihry a ine projekty
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1824

PříspěvekZaslal: 1. září 2014, 11:09:08    Předmět: Odpovědět s citátem

Btw, myslite si, ze GL ES 2.0 zvladne nieco taketo vo FS?

kód:
vec4 sample = texture2D(sampler, texcoord);
if (sample.r == 0) discard;
...more and more samples here...

Sa bojim, ze sa mu to nebude pozdavat. Rozmyslam takto napred, lebo si to nemozem v praci vyskusat, skusim si to vecer doma Smile Nemam tam depth, stencil ani nic, kazdy pixel sa vzdy spracuje, ale ak mam hlavny sample 0, tak mi vzdy vyjde nula, tak uvidim, aky to bude mat dosledok na vykon. Mozno namiesto discardu proste preskocim branch s dalsimi samplami.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 1. září 2014, 12:20:14    Předmět: Odpovědět s citátem

Zvládá to v pohodě. Ad výkon, záleží na zařízení, ale asi bych se toho nebál.
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1824

PříspěvekZaslal: 3. září 2014, 13:40:20    Předmět: Odpovědět s citátem

Toz tak nakoniec som na vykopirovanie konkretneho mipu pouzil prostre viewport s jeho rozmermi a uplne primitivnym shaderom, kde necham samplovat na pozicii pixelu a ono si to vyberie spravny mip. A nakoniec glReadPixels.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna