Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 30. srpen 2014, 12:08:33 Předmět: OpenGL ES - vykopirovat konkretny mip level |
|
|
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
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? 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 |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 30. srpen 2014, 13:44:11 Předmět: |
|
|
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 |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 30. srpen 2014, 13:58:21 Předmět: |
|
|
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 |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 30. srpen 2014, 19:18:33 Předmět: |
|
|
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 |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 31. srpen 2014, 06:13:12 Předmět: |
|
|
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. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 1. září 2014, 08:05:34 Předmět: |
|
|
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 |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 1. září 2014, 09:25:07 Předmět: |
|
|
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 |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 1. září 2014, 10:08:27 Předmět: |
|
|
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 |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 1. září 2014, 10:26:48 Předmět: |
|
|
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 _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 1. září 2014, 10:41:23 Předmět: |
|
|
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 |
|
|
michalferko
Založen: 29. 09. 2008 Příspěvky: 83
|
Zaslal: 1. září 2014, 11:03:53 Předmět: |
|
|
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 |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 1. září 2014, 11:09:08 Předmět: |
|
|
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 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 |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 1. září 2014, 12:20:14 Předmět: |
|
|
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 |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 3. září 2014, 13:40:20 Předmět: |
|
|
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 |
|
|
|