Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 20. prosinec 2011, 01:19:08 Předmět: OGL: Problém s framebuffery? |
|
|
Čaute,
chtěl bych se zeptat, co všechno musím "nastavit" po nabindování framebufferu? Všimnul jsem si, že se "musí" nastavit viewport přes glViewport, tedy pokud má jiné rozměry než ten předešlý.
Rendereju teď hodně do textůry, a mám těch framebufferů více, každý má jíný rozměr (tj. rozměr textůry), a dělám zřejmě něco špatně, protože mám výslednou textůru úplně "dotrhanou".
Obrázek toho co myslím:
Edit: Removed...
Jak můžete vidět, něco je hodně špatně. Ten bílý čtverec má být textůra kurzoru, a můžete tam vidět ten pohyb (schválně jsem nevolal glClear).
Z nějakého podivného důvodu se všude vykresluje hlavní framebuffer (prvně vytvořený, do kterého se blitují všechny ostatní framebuffery a textury), a to i na místech kde vůbec nic nevykresluju.
Napadá mě že to může být chyba driveru, ale všechny ostatní hry mi běží normálně, a i když nic exotického (si myslím) nedělám, bude ta chyba asi mojí straně.
Kontroluju všude jestli náhodou nebinduju omylem běžný framebuffer, a taky kontroluju všechny textůry a jiné parametry. Stále nemůžu přijít na to kde je chyba, a vyzkoušet to na jiném PC zatím taky nemůžu.
Trápím se s tím už skoro 5 dní, a pořád nemůžu přijít na to kde je problem... a kód jsem už několikrát úplně přepsal. Prostě lama, no
Edit: Problém vyřešen... _________________

Naposledy upravil Crypton dne 29. prosinec 2011, 13:55:11, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 20. prosinec 2011, 09:28:18 Předmět: |
|
|
to ti nehadze ten kod ziadne errory?
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); je chyba lebo tam moze ist len GL_FRONT GL_BACK ...
okrem toho vobec netreba volat glDrawBuffer() a glReadBuffer()
za dalsie nemas prehodene width height v glBlitFramebuffer()?
a potom
glBindTexture(GL_TEXTURE_2D, source.getTextureId()); GLCheckError();
...glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); GLCheckError(); // Draw as textured quad
kreslis kopec stvorcov ale nemenis texturu. preto ti kresli vsade rovnaku. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 20. prosinec 2011, 10:02:30 Předmět: |
|
|
nou napsal: |
to ti nehadze ten kod ziadne errory? |
Právě že žádné chyby to neháže...
nou napsal: |
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); je chyba lebo tam moze ist len GL_FRONT GL_BACK ... |
Google mi tvrdí pravý opak
nou napsal: |
okrem toho vobec netreba volat glDrawBuffer() a glReadBuffer() |
Já vím, dal jsem to tam jen pro jistotu, až na konec, když jsem hledal kde je chyba...
nou napsal: |
oza dalsie nemas prehodene width height v glBlitFramebuffer()? |
Mám, a to schválně, abych ten framebuffer blitnul převráceně. Tam chyba není...
nou napsal: |
a potom
glBindTexture(GL_TEXTURE_2D, source.getTextureId()); GLCheckError();
...glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); GLCheckError(); // Draw as textured quad
kreslis kopec stvorcov ale nemenis texturu. preto ti kresli vsade rovnaku. |
Binduju tu zdrojovou textůru (source), kterou se chystám vykreslit do toho cílového framebufferu (target), je to problém?  _________________
 |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 20. prosinec 2011, 10:11:44 Předmět: |
|
|
no som tie tri bodky pochopil ze volas glDrawArrays() viackrat a kreslis stvorce do sceny.
pochopil som to inak dobre ze mas jeden hlavny FBO do ktoreho kreslis rozne textury (nie glBlitFramebuffer) ktory nakoniec blitnes do okna? _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 20. prosinec 2011, 10:15:35 Předmět: |
|
|
citace: |
Google mi tvrdí pravý opak |
Někdy je dobré nevěřit google a podívat se na skutečnou funkci dokumentovanou v api - http://www.opengl.org/sdk/docs/man/xhtml/glDrawBuffer.xml. Pleteš si to s http://www.opengl.org/registry/specs/ARB/draw_buffers.txt kam se do toho dávají attachmenty (color, depth, etc.) a který slouží k MRT, ty však MRT neprovádíš.
U 3. části kódu neprovádíš glClear (ten bys měl provést vždy). a u 2. ostatně taky ne - měníš frame buffer, měl bys mu vymazat color i depth buffer každý snímek taky (nejen backbufferu), jinak ti tam zůstanou věci, které jsi tam měl předtím. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 20. prosinec 2011, 12:06:28 Předmět: |
|
|
heh a ono tam je chyba. podla specifikacie (PDF) ma byt argumentom glDrawBuffer[s]() GL_BACK, GL_FRONT ... ak je bindnuty klasicky framebuffer.
ak je bindnuty FBO tak tam musi ist GL_NONE a GL_COLOR_ATTACHMENTi
ale podla mna bude chyba v tom aku texturu vobec binduje pri kresleni cez glDrawArrays().
a je to glBlitFramebuffer() v tretej casti jedine? lebo hovorit ze blitujem je nepresne ak len kreslim otexturovany 2D stvorec. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 29. prosinec 2011, 13:52:58 Předmět: |
|
|
Tak už jsem to vyřešil. Byl to problém s pamětí, a to docela dost brutální. Problém byl hlavně na straně driveru, a nepomohlo ani kompletní přeinstalování a aktualizace na nejnovější verzi.
Konkrétně byl problém s UV koordináty, když jsem vykresloval ten otexturovaný obdelník. Nastavoval jsem je totiž vždy na [0, 0, 1, 1], a když jsem vykresloval ten obdelník na pozici, která i trochu přesahovala rozměr té cílové textury, aniž bych ty UV koordináty nějak "clampnul", tak došlo k úplnému "rozhození" té cílové textůry. Přitom jsem už na začátku zkoušel zapnout scissor test, a nepomohlo to.
Zjistil jsem to tak, že jsem si před a po každém vykreslování do té cílové textury tu texturu uložil do souboru.
P.S. Možná že to i bude tím, že mám graf. kartu AMD Mobility Radeon HD 4200, která má sdílenou paměť  _________________
 |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 30. prosinec 2011, 15:13:16 Předmět: |
|
|
Ta grafika má stejný ovladače, jako odpovídající normální Radeony, jen je o hodně pomalejší (ty integrované jsou obvykle 1-2 generace za tou řadou, jejíž jsou jakože lowend, tj. zde 4000). _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 31. prosinec 2011, 11:50:19 Předmět: |
|
|
Ovladač má často jiný kód pro různé karty. I v rámci jedné generace hw jsou rozdíly (např. úplně jiná implementace occlusion queries u ATI X1800 a ATI X1600). U grafik se sdílenou pamětí se např. musí memory controller nastavit jinak. Taky může jít o bug v hardwaru, který se projevuje pouze u těchto karet (takové bugy se obvykle musí v driveru nějak obcházet). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
|