.[ ČeskéHry.cz ].
OpenGL - rendering a otočené pořadí vrcholů

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 30. červen 2013, 18:40:17    Předmět: OpenGL - rendering a otočené pořadí vrcholů Odpovědět s citátem

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 Smile

Někdo nějaký nápad (mimo to, abych použil RH systém)
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Krolli



Založen: 12. 05. 2013
Příspěvky: 13

PříspěvekZaslal: 30. červen 2013, 19:39:54    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 30. červen 2013, 19:54:16    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 30. červen 2013, 19:54:56    Předmět: Odpovědět s citátem

OpenGL a D3D používají trochu rozdílné projekční matice (především, nejsou pouze transponované, ale někde se liší ve znaménkách), to může způsobit přesně tu chybu, kterou ty máš.

OpenGL Projekční matice viz http://www.songho.ca/opengl/gl_projectionmatrix.html
Oproti tomu D3D je zde http://msdn.microsoft.com/en-us/library/windows/desktop/bb147302%28v=vs.85%29.aspx
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Krolli



Založen: 12. 05. 2013
Příspěvky: 13

PříspěvekZaslal: 1. červenec 2013, 08:08:26    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 1. červenec 2013, 08:49:39    Předmět: Odpovědět s citátem

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ě Smile
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 1. červenec 2013, 10:30:27    Předmět: Odpovědět s citátem

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ě Smile


mas blbe napsanej renderer, kterej zbytecne stavi na nejakem standardu Wink - mel jsi mit svuj vlastni "standard" a navenek potom matice preklapet do potrebne normy D3D/OGL
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 1. červenec 2013, 11:29:51    Předmět: Odpovědět s citátem

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 Twisted Evil

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Krolli



Založen: 12. 05. 2013
Příspěvky: 13

PříspěvekZaslal: 1. červenec 2013, 19:24:02    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 1. červenec 2013, 21:46:35    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 1. červenec 2013, 23:22:59    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna