Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 5. červenec 2012, 22:23:39 Předmět: OpenGL :: FBO :: Scissor testy |
|
|
Zdravím, chtěl jsem se s vámi podělit o zajímavý bug, kterého jsem si všiml (už když jsem dělal na bakalářce, teď mě to ale teprv začalo s*át), tedy jen na GMA X3100. Týká se renderování do FBO. Když mám více FBO, každý má jiné rozměry a renderuji je za sebou v jednom průchodu, některé části FBO se nemažou když volám glClear...
Myslel jsem, že je to bug driveru pro GMA, ale nakonec se ukázalo, že z mně neznámého důvodu jsou pro attachmenty FBO zapnuté scissor testy... Nedokáži si to logicky vysvětlit, ale stačilo pomocí glDrawBuffer zvolit GL_COLOR_ATTACHMENT0 (což také nechápu, když v dokumentaci není ani zmíňka, že by se dala do této funkce tato hodnota vecpat) a pak vypnout scissor test.
Na jiných grafikách mi to nedělalo, pouze na tom integrovaným shitu...problém sice vyřešen, ale nechápu to... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 5. červenec 2012, 23:29:49 Předmět: |
|
|
Tak problém není vyřešen...
Je to nějaké zku*vené...u jednoho fbo to se to spraví a u druhého se to posere...omg...
A hlavně vůbec nechápu, proč to ovlivňuje zrovna scissor test...
EDIT: Doufám, že poslední příspěvek v tomto vlákně není pravdivý... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. červenec 2012, 07:47:36 Předmět: |
|
|
Opravdu zajímavé, vypadá to na chybu driveru pro intelácké grafiky. Celou noc jsem pokusoval a zjistil jsem, že když mám připojený FBO a vypnuté scissor testy (což je normální), glClear nevyplní celou oblast (není to problém viewportu, normálně se vše vyrenderuje, ale už se to nesmaže). Zatím jsem to vyřešil tak, že při aktivaci FBO a změně viewportu na velikost FBO textur zapnu scissor test a nastavím ho stejně jako viewport, když končím s kreslením do FBO, vypnu scissor test. Jako zázrakem to začalo fungovat, uvidíme co se stane, když těch framebufferů přidám více...
Intel mě jebe, když jsem stejný program, který u mě nefungoval správně, zkoušel na NVIDIA kartě, tak žádný problémů, na bráchově ATI, žádný problémů, dokonce i na jeho druhé integrované intel grafice nebyl žádný problém (on používá Windows 7, já XP, drivery pro XP jsou pravděpodobně žalostně nakóděné)...
Ach jo... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 6. červenec 2012, 07:54:08 Předmět: |
|
|
Intel+OpenGL+Windows nejde dokopy. na Linuxe maju omnoho lepsie ovladace. napr taky Minecraft bezi casto aj s dvojnasobnymi FPS oproti Win. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. červenec 2012, 08:43:23 Předmět: |
|
|
Uvidíme co to udělá až aplikaci enginu budu kompilovat pro Linux...také předpokládám, že tam nebude žádný problém...
Je pravda, že na Ubuntách mi najednou karta začala podporovat extensiony, které ve Windows sice jsou také údajně podporovány, ale vždy mi to při inicializaci vrátilo chybný pointer na funkci a celá aplikace šla do kytek (viz. UFO: Aftershock, Afterlight - wglChoosePixelFormatARB)... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 6. červenec 2012, 11:38:56 Předmět: |
|
|
nou napsal: |
Intel+OpenGL+Windows nejde dokopy. na Linuxe maju omnoho lepsie ovladace. napr taky Minecraft bezi casto aj s dvojnasobnymi FPS oproti Win. |
Linux driver je možná lepší z hlediska podpory extenzí a korektnosti implementace, ale zatím to stále vypadá, že Windows driver je častěji rychlejší. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. červenec 2012, 16:50:27 Předmět: |
|
|
VODA napsal: |
Opravdu zajímavé, vypadá to na chybu driveru pro intelácké grafiky. Celou noc jsem pokusoval a zjistil jsem, že když mám připojený FBO a vypnuté scissor testy (což je normální), glClear nevyplní celou oblast (není to problém viewportu, normálně se vše vyrenderuje, ale už se to nesmaže). Zatím jsem to vyřešil tak, že při aktivaci FBO a změně viewportu na velikost FBO textur zapnu scissor test a nastavím ho stejně jako viewport, když končím s kreslením do FBO, vypnu scissor test. Jako zázrakem to začalo fungovat, uvidíme co se stane, když těch framebufferů přidám více... |
Ne, tak jsem to nevyřešil...když tam mám více FBO, je to v pohodě, jakmile tam mám jen jeden, tak to dělá to, co to dělalo, když jsem jich tam měl více před tím, než jsem se to pokusil fixnout... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. červenec 2012, 17:53:38 Předmět: |
|
|
Takže, napsal jsem si vlastní "mazací" funkci, protože jak to tak vypadá, problém je v glClear a začalo vše fungovat...
A jako vedlejší efekt se mi zvedlo FPS cca o 30 snímků (do každého fbo kreslím model Zoji).
Sice jsme si na nedávném srazu dělali srandu (ze mě), jestli si náhodou nebudu implementovat vlastní renderovací API...pokud mě intel bude takhle srát, asi se pustím do vývoje vlastních driverů.
EDIT:
Abyste neřekli, dám sem mojí mazací verzi...myslím, že by to vymyslel leckdo, ale třeba se to někomu bude hodit...
Místo volání glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) použiji toto:
kód: |
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_ALWAYS);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, 1.0, 1.0, 0.0, -1.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glColor4f(clearColorValues[0], clearColorValues[1], clearColorValues[2], clearColorValues[3]);
glRectf(0.0f, 0.0f, 1.0f, 1.0f);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glDepthFunc(GL_LESS); |
Dalo by se to pochopitelně napsat rozumněji, ale měření dávají jasné výsledky a rychlost je lepší než u glClear... _________________ Opravdovost se pojí s trýzní...
Naposledy upravil VODA dne 6. červenec 2012, 19:01:51, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 6. červenec 2012, 18:23:46 Předmět: |
|
|
myslim ze je vidno ake zle su tie ovladace ak je takyto manualny glClear() rychlejsi ako normalny. len takmimochodom aky vplyv to ma na ATI/nVidia kartach? _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. červenec 2012, 18:31:02 Předmět: |
|
|
Chystám se to změřit. Dám sem výsledky, až brácha dopaří Diablo 3. _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. červenec 2012, 19:00:50 Předmět: |
|
|
Takže, dostal jsem se ke dvěma NVIDIA kartám, ATI zkusím později, až se naskytne příležitost.
Takové malé srovnání na jedné stejné scéně (průměrné hodnoty):
Intel GMA X3100 - glClear: 130 FPS, vlastní: 156 FPS
NVIDIA GeForce 5500FX - glClear: 60 FPS, vlastní: 60 FPS
NVIDIA GeForce GT 630M - glClear: 254 FPS, vlastní: 250 FPS
Pokud to opravdu funguje správně (testoval jsem to na všech možných stavech, kde mi to dělalo chyby), tak jsem jasně zvítězil. Na Intel kartách to pojede rychleji a na zbytku nebude rozdíl skoro znát. Popř. dám do konfigu možnost vybrat si, zda-li použít "native" verzi nebo "safe" verzi mazání bufferů... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 9. červenec 2012, 09:30:17 Předmět: |
|
|
OT: Už to tu na fóru zaznělo mnohokrát, ale připomenu: zvykni si měřit čas v nějakých časových jednotkách, milisekundách. Je to mnohem lepší, než 1/T, uvidíš :-).
A vůbec šikovná věc je, napsat si nějaký malý, snadno použitelný timer, který hodíš před měřenou funkci (cyklus) a on se už v konstruktoru inicializuje aktuálním časem a za funkcí použiješ nějakou metodu timer.logResult(), která zdokumentuje, jak dlouho ta funkce trvala. Je to trapně jednoduchý, ale dost šikovný. Pro měření rychlosti OpenGL funkcí, sem používal verzi, která volala před měřením a před logResult funkci glFinish - ale výsledky můžou bejt zavádějící. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 9. červenec 2012, 10:26:00 Předmět: |
|
|
]semo[ napsal: |
OT: Už to tu na fóru zaznělo mnohokrát, ale připomenu: zvykni si měřit čas v nějakých časových jednotkách, milisekundách. Je to mnohem lepší, než 1/T, uvidíš .
A vůbec šikovná věc je, napsat si nějaký malý, snadno použitelný timer, který hodíš před měřenou funkci (cyklus) a on se už v konstruktoru inicializuje aktuálním časem a za funkcí použiješ nějakou metodu timer.logResult(), která zdokumentuje, jak dlouho ta funkce trvala. Je to trapně jednoduchý, ale dost šikovný. Pro měření rychlosti OpenGL funkcí, sem používal verzi, která volala před měřením a před logResult funkci glFinish - ale výsledky můžou bejt zavádějící. |
Když jsem psal ty výsledky, napadlo mě, že se ozveš (už jsme na toto téma jednou vedli řeč).
Máš pravdu, že by uvádění času v ms bylo lepší, ale já chtěl jen naznačit, že na no-intel kartách není vidět téměř žádný rozdíl a na intel kartách to hodně pomůže... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 9. červenec 2012, 12:28:41 Předmět: |
|
|
Musím uznat, že není špatné zrychlení o 1.28 milisekundy pouhým nahrazením glClear. Ale jestli je o tolik rychlejší udělat změnu depth testu a matic, vyrenderovat jeden polygon a zase to dát do původního stavu oproti vymazání framebufferu na grafickém čipu, tak to o GMA a jeho driverech dost vypovídá
Každopádně je dobře, že je podporuješ, Sollertia je jedna z věcí, které by neměly vyžadovat superpočítač, jak to někdy bývá _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 9. červenec 2012, 12:40:19 Předmět: |
|
|
if.then napsal: |
Musím uznat, že není špatné zrychlení o 1.28 milisekundy pouhým nahrazením glClear. Ale jestli je o tolik rychlejší udělat změnu depth testu a matic, vyrenderovat jeden polygon a zase to dát do původního stavu oproti vymazání framebufferu na grafickém čipu, tak to o GMA a jeho driverech dost vypovídá |
Většina GPU maže framebuffer právě pomocí vykreslení jednoho velkého quadu a nastavení všech možných stavů (shadery, rasterizer, depth, stencil, colormask, atd.), které pak musí vrátit do původního stavu. Pokud to udělá uživatel, tak to může být někdy podobně rychlý. Rozdíl je jen v tom, že driver může zapnout další stavy, které to mazání urychlí a které uživatel nemá v OpenGL k dispozici.
glClear, glBlitFramebuffer, glDrawPixels, glCopyTexImage, občas dokonce i glGetTexImage... vždy se uvnitř kreslí nějaký quad, který tu operaci realizuje. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
|