OpenGL - třídění průhledných ploch

Jarda9

OpenGL - třídění průhledných ploch
« kdy: 15. 12. 2013, 13:34:37 »
Ahoj,
je potřeba třídit před vykreslením průhledné plochy?

Možná mám jen něco špatně nastavené, ale v tuto chvíli se mi scéna správně vykreslí jen pokud kreslím průhledné plochy od nejvzdálenější k nejbližší. Pokud scénu otočím, tak se scéna nevykreslí dobře


lamka

Re:OpenGL - třídění průhledných ploch
« Odpověď #1 kdy: 15. 12. 2013, 13:57:00 »
imho je to OK... ak rendrujes najprv plochu vpredu a potom rendrujes plochu za nou, tak ta druha neprejde depth testom, takze sa nevyrendruje... cize bud vypnut depth test (ak to nevadi scene) alebo vzdy zoradit...

Jarda9

Re:OpenGL - třídění průhledných ploch
« Odpověď #2 kdy: 15. 12. 2013, 14:01:15 »
A jak rozhodnout, která plocha je blíž a která dál. Plochy můžou být libovolně natočené. Navzájem se ale nekříží.

lamka

Re:OpenGL - třídění průhledných ploch
« Odpověď #3 kdy: 15. 12. 2013, 14:36:24 »
postni obrazok ako to vyzera - pre predstavu...

Co sa tyka zoradenia - no mozes vytvorit nejaky zasobnik, do ktoreho v kazdom cykle nahadzes plochy - tie tam nahadzes podla vzdialenosti kamery od plochy - dajme tomu stredu plochy od pozicie kamery a to od najvacsej po najmensiu... a nasledne nechas rendrovat podla poradia v zasobniku...

Ale pokial plochy nemenia navzajom svoju polohu (voci inym plocham), tak imho je zbytocne riesit nieco take... ja by som to riesil pevnym poradim a rendrovanim celej skupiny ploch 2x... najprv v poradi od najvzdialenejsej ku najblizsej s orezenou zadnou castou polygonu(cez culling), a potom druhykrat v poradi od najblizsej po najvzdialenejsiu s orezanou prednou castou... a v beziacej apikacii potom mozes otacat podla lubovole a vidis iba jednu z tych dvoch skupin, pretoze sa ta odvratena oreze... :D

Ivorne

Re:OpenGL - třídění průhledných ploch
« Odpověď #4 kdy: 15. 12. 2013, 15:05:57 »
Vykreslovat dvakrát je nesmysl. Když vykresluješ (polo)průhledné objekty, tak správně to bude jen když to vykreslíš od nejvzdálenějšího po nejbližší. Dělá se to třeba tak, že vykreslíš nejdříve neprůhledné objekty (ideálně od nejbližšího po nejvzdálenější) se zápisem do depth bufferu a pak vykreslíš průhlední objekty od nejvzdálenějšího po nejbližší (není třeba zapisovat do depth bufferu).

Pokud máš v nějakém trojúhelníku jen zcela viditelné a zcela průhledné fragmenty (žádné poloprůhledné), tak se trojúhelník považuje za neprůhledný a průhledné fragmenty jsou vyřazeny alpha testem, takže nedojde k zápisu do depth bufferu.

Problém je v tom, když některé trojúhelníky nejde jednoznačně seřadit podle hloubky. To už je výpočetně náročnější a tam nemám zkušenost s tím, jak to řešit. Nejjednodužším řešením je v takovém případě rozdělit trojúhelníky na menší tak, aby se tam tento problém nevyskytoval. Ale to taky často nejde moc dobře.


Jarda9

Re:OpenGL - třídění průhledných ploch
« Odpověď #5 kdy: 15. 12. 2013, 15:23:40 »
Porovnávat středy jsem zkoušel, ale jsou případy, kdy to vypadalo taky špatně

Objekty mám rozdělené na průhledné a neprůhledné. Kreslím je samostatně, nejdříve neprůhledné a až potom průhledné. Vše vypadá bezvadně, pokud ty průhledné kreslím od nejvzdálenějšího k nejbližšímu. To je ale ten kámen úrazu. Setřídit ty průhledné.

Neexistuje nějaká fce, která by mě dokázala určit, která ze dvou ploch je v popředí a která na pozadí? Mohu čtyřúhelníky rozdělit jednoduše na trojúhelníky, pokud by byla nějaká fce jen pro trojúhelníky



anonym

Re:OpenGL - třídění průhledných ploch
« Odpověď #6 kdy: 15. 12. 2013, 17:30:12 »
pokud neresis polopruhledne ale jen plne pruhledne (tedy napriklad sprity s pruhlednou texturou) tak ti tam dela problemy depth buffer

potrebujes bud vypnout depth test, nebo pouzivat GL_ALPHA_TEST pro orezavani (nebo mozna neco modernejsiho, uz je to nejaka doba co sem to pouzil)

pokud resis polopruhledne tak je potreba spravne seradit, ale to je obecne neresitelna uloha (pokud se ti dva trojuhelniky protinaji tak neexistuje jejich korektni poradi)

Ivorne

Re:OpenGL - třídění průhledných ploch
« Odpověď #7 kdy: 15. 12. 2013, 18:09:12 »
No každopádně bych takovýhle algoritmus programoval jen pro trojúhelníky a celkově pracoval jenom s trojúhelníky. Nemá cenu si komplikovat už tak složitou analytickou geometrii polygony. Jak to fakt udělat nevím. Zeptej se na http://ceske-hry.cz. Tady jsou dole nějaké zajímavé odkazy na alternativní řešení (order-independent): http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-10-transparency/

Jarda9

Re:OpenGL - třídění průhledných ploch
« Odpověď #8 kdy: 15. 12. 2013, 20:11:41 »
diky, kouknu na ty odkazy. Ja mam ale docela omezene zadani. Neni potreba to resit absolutne obecne. Plochy se treba vubec neprotinaji a pujde jen o ctyruhelniky