Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 22. červenec 2012, 17:09:21 Předmět: ATI/AMD shader problémy. |
|
|
Nazdar,
dostal jsem se do fáze testování na různejch sestavách a jako naprosto neočekávané překvapení bylo, že některý fíčurky blbnou nebo případně naprosto nefungují nebo způsobují segfault pod grafikama ATI/AMD.
Předem upozorňuji, aplikace je odladěná v gDebuggeru aby nevykazovala žádný opengl a jiný chyby.
Shadery jsou pro jistotu zkompilovaný pod GPU ShaderAnalyzer od AMD.
Drivery poslední na každé sestavě.
Všechny tyto problémy se nevyskytují na novějším HW nebo na Nvidiích.
1) Problém stínů s PCF, tento problém se vyskytuje jenom na 4kkové řadě HD radeonů.
Moje konfigurace je následující, shadowmapa je vytvořená s GL_LINEAR filtrem - vím, pod catalystem nefunguje bilineární filtrování, ale GL_NEAREST na to nemá vliv. Extenze jsou podporovány pro shadow2Dproj.
Problémový kód PCF filtru:
kód: |
float lookup(vec2 offset, vec4 coord)
{
vec2 pixoffset = vec2(1.0/4096.0); // mění se podle velikosti shadowmapy.
return shadow2DProj(ShadowMap, coord + vec4(offset.x * pixoffset.x * coord.w, offset.y * pixoffset.y * coord.w, 0.05, 0.0)).w;
}
float shadow = 1.0;
if(gl_TexCoord[1].w > 1.0)
{
float x,y;
for (y = -1.5 ; y <=1.5 ; y+=1.0)
for (x = -1.5 ; x <=1.5 ; x+=1.0)
shadow += lookup(vec2(x,y), gl_TexCoord[1]);
shadow /= 16.0;
}
shadow = clamp(shadow+0.6, 0.0, 1.0); |
Upřímně, nevím proč to pod ATI nefunguje.
Když udělám obyčejnej fetch z textury bez filtrování, stíny fungují.
2) Chybějící modely při instancingu
Překročenej počet instancí v uniform poli, vyřešilo ARB_instanced_arrays a při nepodpoře klasickej render přes cykl.
3) Random segfault, pravděpodobně glActiveTextureARB
Tady bude nejspíš chyba na mojí straně, jenže je tu zase ale :). Předpokládal jsem, že pokud by byla někde chyba v kódu globálně, měl bych dostat v debuggeru INVALID_ENUM bez nějakejch keců. Tato chyba nevyběhne ani na jedné z testované sestavě kromě jedné ATI 4850, na které to způsobí spadnutí driverů do a OS je musí restartovat. Při delším debugu jsem zjistil, že to nejspíš spadne na funkci glActiveTextureARB(unknown) tak teď si nejsem jistý, jestli mám zase rozhrabat 3/4 kódu kde se vyskytuje tato funkce, nebo je to rádoby problém těch ovladačů.
Jo, tato chyba nastane okolo 3s od spuštění základní herní smyčky, takže až v několikátým průchodu toho kódu.
S prvním a druhým problémem se pravděpodobně vyrovnám bez problémů, ale ten poslední, nějaké nápady?
Dík. _________________ Jeden z vývojářů hry Grenade Madness.
Naposledy upravil Játro.m dne 22. červenec 2012, 20:39:05, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 23. červenec 2012, 11:22:04 Předmět: |
|
|
OT: Rada HD 4xxx a starsi uz nemaji primou podporu v nejnovejsich ovladacich (treba standartni Catalyst 12.6 necha puvodni ovladac a updatne jen SW okolo). Je potreba Catalyst 12.6 legacy.
Krom toho mam HD 4870 a pokud necham v Catalystech povoleny Catalyst AI, tak mi pada napriklad Cinema 4D (OpenGL) -> ty ovladace vazne budou mit nejaky problem. |
|
Návrat nahoru |
|
|
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 23. červenec 2012, 19:21:20 Předmět: |
|
|
Dík za odpovědi, už jsem z toho zoufalej. Vezmu to tentokrát pozpátku.
3) Padání a problémy pod ATI
Drivery poslední - 12.6 legacy;
Catalyst AI - vypnutí způsobilo, že se začaly objevovat chyby jako:
citace: |
Objevuje se jenom s puštěným multisamplingem na jeden FBO, tu neřeším
Reason OpenGL Error
glBlitFramebufferEXT(0 , 800 , 0 , 600 , 0 , 0 , 600 , 600 ,GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT , GL_NEAREST) - GL_INVALID_OPERATION
Vybíhá permanentně, horší je, že na ani jedné sestavě krom té ATI4850 se nevyskytuje.
Reason OpenGL Error
glInterleavedArrays(GL_T2F_V3F , 0 , 0x0022FD50) - GL_INVALID_FRAMEBUFFER_OPERATION |
Po tomhle mám sto chutí tu sestavu vzít a zapálit.
Nápady? :D
1) Nefungující PCF filtr
Filtr 4x4 nepřicházel pod ATI v úvahu, když jsem udělal následující test, jestli to vůbec funguje, tak jsem zjistil, že nefunguje.
Vzal jsem funkci lookup kterou jsem posílal hned na začátku.
citace: |
float lookup(vec2 offset, vec4 coord)
{
vec2 pixoffset = vec2(1.0/4096.0); // mění se podle velikosti shadowmapy.
return shadow2DProj(ShadowMap, coord + vec4(offset.x * pixoffset.x * coord.w, offset.y * pixoffset.y * coord.w, 0.05, 0.0)).w;
}
|
Udělal jsem:
citace: |
float shadow = lookup(vec2(0.0), gl_TexCoord[1]);
|
Jak jsem očekával, stíny nikde, kdežto, samozdřejmě na dvou ostatních NV to fungovalo.
Tak jsem chvíli laboroval, dosadil si do funkce, vyšlo mi, že jediný co se děje, tak že se přičítá 0.05 na z.
citace: |
shadow2DProj(ShadowMap, coord + vec4(0.0 * pixoffset.x * coord.w, 0.0 * pixoffset.y * coord.w, 0.05, 0.0)).x;
|
Tak jsem jako poslední zoufalej krok vzal čistě funkci:
citace: |
float shadow = shadow2DProj(ShadowMap, gl_TexCoord[1]).x; |
A stíny byly na světě, teď k tomu podstatnýmu, funkce je obšlehnutá z nějakýho dema na fabiensanglard.net, jejich demo jsem vzal a testoval, fungovalo všude, zase kromě naší milované 4850ky.
Tak do dop*dele co už dělám špatně, že mi ta jeb*a nerenderuje ty stíny vyhlazený?
Jestě jsem chtěl říct, že texturovací koordinát je uloženej v gl_TexCoord[1], tak jestli to ta ATI bere jako READ only proměnnou, že se mi to při modifikaci podělá.
Jiná maska .x,.y,.z,.w u shadow2Dproj neudělá žádnou změnu.
Nějaké nápady ? _________________ Jeden z vývojářů hry Grenade Madness. |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 23. červenec 2012, 21:31:08 Předmět: |
|
|
Ani u free hry tě nemusí trápit, že nejede na <1 % HW, ani u komerční (vrátíš těm pár lidem peníze). Nikdy ti to nepojede na 100 % počítačích splňujících parametry. Beztak řešíš tehdejší high-end grafiku do desktopu, tj. její první majitelé už ji dávno prodali a koupili si novější (a druzí majitelé už moc her nekupujou, když batslej počítač z použitejch starejch součástek). _________________ Award-winning game developer |
|
Návrat nahoru |
|
|
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 23. červenec 2012, 21:57:11 Předmět: |
|
|
Ladis napsal: |
Ani u free hry tě nemusí trápit, že nejede na <1 % HW, ani u komerční (vrátíš těm pár lidem peníze). Nikdy ti to nepojede na 100 % počítačích splňujících parametry. Beztak řešíš tehdejší high-end grafiku do desktopu, tj. její první majitelé už ji dávno prodali a koupili si novější (a druzí majitelé už moc her nekupujou, když batslej počítač z použitejch starejch součástek). |
Bohužel máš pravdu, ale přece jenom, než budu mít v plánu to vypustit do světa, tak bych se rád vyvaroval všech vedlejších problémů který můžu vyřešit teď, dokud je to jenom betaverze kterou mají 4 lidi.
Z5 k problému, GL_INVALID_FRAMEBUFFER_OPERATION vypadá na bug v driveru, fbo se při vytvoření hlásí jako vpořádku vytvořený, není inkompletní. Uvidíme.
Zase jsem ale při tomhle ladění zjistí, jak moc udělal chyb u sebe a co všechno vykrejou zlatý ovladače Nvidií.
A stíny vyřeší bohužel makro v shaderu. _________________ Jeden z vývojářů hry Grenade Madness. |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 23. červenec 2012, 22:41:48 Předmět: |
|
|
Játro.m napsal: |
Zase jsem ale při tomhle ladění zjistí, jak moc udělal chyb u sebe a co všechno vykrejou zlatý ovladače Nvidií. |
jeden vyvojar sa na fore opengl.org vyjadril ze ak to ma behat na obydvoch GPU tak radsej vyvija na ATI. pretoze maju dost striktne ovladace a ked to teda beha na ATI tak to bude takmer na 100% behat aj na nVidii. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 24. červenec 2012, 01:55:38 Předmět: |
|
|
Játro.m napsal: |
Reason OpenGL Error
glBlitFramebufferEXT(0 , 800 , 0 , 600 , 0 , 0 , 600 , 600 ,GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT , GL_NEAREST) - GL_INVALID_OPERATION |
Tento error je korektní - vypadá to, že jsi prohodil 2. a 3. parameter, což by v tomto případě nemělo projít.
Játro.m napsal: |
Vybíhá permanentně, horší je, že na ani jedné sestavě krom té ATI4850 se nevyskytuje.
Reason OpenGL Error
glInterleavedArrays(GL_T2F_V3F , 0 , 0x0022FD50) - GL_INVALID_FRAMEBUFFER_OPERATION |
Určitě zkontroluj, jestli máš správně nastavený DRAW_BUFFER pomocí glDrawBuffer[s]. Také si projdi specifikaci OpenGL - měla by přesně popisovat, za jakých okolností k tomu erroru může dojít.
Dále bych doporučil používat GL_ARB_debug_output, které by ti mělo dát podrobnější hlášení o chybě.
Na další problémy řešení nemám. Pokud jsi ten kód někde obšlehl, tak se nedivím, že ti najednou přestal fungovat. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 24. červenec 2012, 02:03:27 Předmět: |
|
|
Podíval jsem se k nám do kódu v driveru a vyhazujeme tam GL_INVALID_FRAMEBUFFER_OPERATION pouze když READ_FRAMEBUFFER nebo DRAW_FRAMEBUFFER je incomplete (v závislosti na tom, jaká operace se provádí). Samozřejmě je lepší u CheckFramebufferStatus zadat explicitně, jestli se ptáte na READ nebo DRAW. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 24. červenec 2012, 13:10:12 Předmět: |
|
|
Tý jo, až teprve teď jsem si všiml, že ta funkce se volá blbě, ale:
kód: |
Takhle se volá v enginu.
window.w = 800
window.h = 600
glBlitFramebufferEXT(0, 0, window.w, window.h, 0, 0, window.w, window.h,
GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
GL_NEAREST);
A toto vyleze z gDebuggeru.
Reason OpenGL Error
Breaked-on
glBlitFramebufferEXT(0 , 800 , 0 , 600 , 0 , 0 , 600 , 600 , 0x4100 , GL_NEAREST)
GL_INVALID_OPERATION |
Zajímavý chování - chová se to tak aji na NV. glBlitFramebuffer() to nedělá a funguje všude ok.
Další věc, problém padání a segfaultování byla nejspíš vratká implementace glInterleavedArrays která je deprecated, po odstranění jejích volání zmizely chyby jako GL_INVALID_FRAMEBUFFER_OPERATION a přestalo to padat.
Ještě pro kontrolu, takhle blituju při multisamplingu, vypadá to že není problém.
kód: |
glBindFramebuffer(GL_READ_FRAMEBUFFER, postFBOID);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, finalFBOID);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBlitFramebuffer(0, 0, window.w, window.h, 0, 0, window.w, window.h, GL_COLOR_BUFFER_BIT, GL_NEAREST);
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); |
Až budu dělat příští engine a na něm postavenou hru, tak AMD je jasná volba, díky pánové ;) _________________ Jeden z vývojářů hry Grenade Madness. |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 29. červenec 2012, 19:41:17 Předmět: |
|
|
nou napsal: |
Játro.m napsal: |
Zase jsem ale při tomhle ladění zjistí, jak moc udělal chyb u sebe a co všechno vykrejou zlatý ovladače Nvidií. |
jeden vyvojar sa na fore opengl.org vyjadril ze ak to ma behat na obydvoch GPU tak radsej vyvija na ATI. pretoze maju dost striktne ovladace a ked to teda beha na ATI tak to bude takmer na 100% behat aj na nVidii. |
http://phoronix.com/forums/showthread.php?72506-People-incorrectly-assume-that-AMD-drivers-suck-They-don-t _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
|