Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 30. červen 2013, 18:40:17 Předmět: OpenGL - rendering a otočené pořadí vrcholů |
|
|
Začal jsem něco bastlit v OpenGL... nikdy dřív jsem v tom nic, nepsal, takže dotaz možná bude mimo...
Každopádně. Mám jednoduchý renderer. Vykreslím krychli, všechno se zdá OK. Pak tam vykreslím terén, ale vidím terén, co je za kopcem nakreslený před tím kopcem :-/
Nepoužívám žádnou fixní pipeline, takže mám projekci a view matici v LH systému (je to z důvodu, že mám renderer posazený souběžně s DX, kde je default LH plus se mi s ním lépe dělá), ale to by neměl být problém (otočil jsem culling na CW). Navíc ta krychle se vykreslí správně.
Zkoušel jsem otočit depth text z GL_LESS na GL_GREATER.. nicméně, pak nevidím vůbec nic
Někdo nějaký nápad (mimo to, abych použil RH systém) _________________ Perry.cz |
|
Návrat nahoru |
|
|
Krolli
Založen: 12. 05. 2013 Příspěvky: 13
|
Zaslal: 30. červen 2013, 19:39:54 Předmět: |
|
|
Nemas nahodou nejaku chybu pri tvorbe projekcnej matice? Nieco podobne sa mi stavalo s GLM v matici vytvorenej pomocou perspectiveFov(). Myslim ze tam mali nespravne znamienko alebo nieco take. V novych verziach to uz snad je opravene ale niesom si isty.
Urcite by som skusil pouzit gDebugger a skontrolovat depth buffer. |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 30. červen 2013, 19:54:16 Předmět: |
|
|
Dík.. je to tou projekční maticí (zajímavý tedy, ale že pro neco to funguje a pro něco ne)... když použiju projekci z DX, tak to funguje
kód: |
//DX - LH projekce (fovY, AspectRation, zNear, zFar)
Matrix4x4 m = Matrix4x4();
float yScale = 1.0f / tan(fovY / 2.0f);
float xScale = yScale / aspecRatio;
float tmp = zFar / (zFar - zNear);
m.M[0][0] = xScale;
m.M[1][1] = yScale;
m.M[2][2] = tmp;
m.M[2][3] = 1;
m.M[3][2] = -zNear * tmp;
|
Pro úpravu do openGL jsem použil tohle:
kód: |
Matrix4x4 m = Matrix4x4();
float yScale = 1.0f / tan(fovY / 2.0f);
float xScale = yScale / aspecRatio;
float depth = zFar - zNear;
float tmp = zFar / (zFar - zNear);
m.M[0][0] = xScale;
m.M[1][1] = yScale;
m.M[2][2] = -(zFar + zNear) / depth;
m.M[2][3] = 1;
m.M[3][2] = (2 * zFar * zNear) / depth;
|
Ale tam je něco blbě.. a nevidím teď co (mela by to být LH projekce) _________________ Perry.cz |
|
Návrat nahoru |
|
|
Vilem Otte
Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
|
Návrat nahoru |
|
|
Krolli
Založen: 12. 05. 2013 Příspěvky: 13
|
Zaslal: 1. červenec 2013, 08:08:26 Předmět: |
|
|
Tiez by si mohol skusit zmenit depth funkciu na GL_GREATER a mazat depth buffer na 0 namiesto 1. Ak tomu spravne rozumiem, tvoj problem je, ze Z hodnota klesa so vzdialenostou od 1 do 0, namiesto standardneho narastania od 0 do 1. Ked si si nastavil len GL_GREATER tak nic neprepisalo clear hodnotu depth bufferu, takze si nic nevidel.
Kazdopadne to je dost mizerne riesenie a pouzit spravne matice podla specifikacie je urcite lepsie. |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 1. červenec 2013, 08:49:39 Předmět: |
|
|
No když použiji matice podle specifikace, tak nemůžu měnit renderer. Teď to mám napsané, že jenom přepnu a kreslím v DX / OpenGL. Kdybych to změnil na RH, tak bych zase šel mimo DX standard... takže situace je to řešitelná blbě _________________ Perry.cz |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 1. červenec 2013, 10:30:27 Předmět: |
|
|
perry napsal: |
No když použiji matice podle specifikace, tak nemůžu měnit renderer. Teď to mám napsané, že jenom přepnu a kreslím v DX / OpenGL. Kdybych to změnil na RH, tak bych zase šel mimo DX standard... takže situace je to řešitelná blbě |
mas blbe napsanej renderer, kterej zbytecne stavi na nejakem standardu - mel jsi mit svuj vlastni "standard" a navenek potom matice preklapet do potrebne normy D3D/OGL |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 1. červenec 2013, 11:29:51 Předmět: |
|
|
No za standard jsem si zvolil LH systém a řádkové matice, protože se mi s tím dělá více intuitivně. Plus jsem nikdy nepředpokládal, že budu něco "smažit" v OpenGL
Tak jako můžu použít OpenGL standard a matice přetáčet, ale pak budu mít zase bordel v shaderech, kde jedna sada funkcí bude LH, druhá RH a všechno budu přepisovat. _________________ Perry.cz |
|
Návrat nahoru |
|
|
Krolli
Založen: 12. 05. 2013 Příspěvky: 13
|
Zaslal: 1. červenec 2013, 19:24:02 Předmět: |
|
|
Predpokladam ze na tvorbu matic mas nejaku sadu funkcii ktore ich vytvaraju. Co tak pridat jeden argument, ktory bude rozhodovat medzi DX/OpenGL formatom matice? Potom ti staci jedna konstanta ktora prepne z jedneho formatu na druhy. Mozno by robilo problem ci je matica ulozena po riadkoch alebo po stlpcoch, ale to mozes vyriesit pri nastavovani premennych v shaderoch (napr. DX bez zmeny, GL to opravi). |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 1. červenec 2013, 21:46:35 Předmět: |
|
|
Kroll: To by sice vyřešilo, ale neřeší to pak nutnost přepsat všechny shadery a všechny další operace které s tou maticí dělám v kódu. _________________ Perry.cz |
|
Návrat nahoru |
|
|
Vilem Otte
Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 1. červenec 2013, 23:22:59 Předmět: |
|
|
Vtip je v tom, že s D3D maticí dostaneš negativní hodnoty do depth bufferu, které ti tam budou fungovat divně (nevím jestli se dokonce nejedná o undefined behaviour).
Pokud pouze upravíš kód generující matici, shadery by ti stále měly fungovat stejně (jelikož obvykle nečteš z matice jednotlivé prvky, ale násobíš celou maticí a ve výsledku ti je to jedno).
Týkat by se to mělo navíc především hlavně projekční matice. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
|
|