Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 4. leden 2009, 13:19:20 Předmět: optimalizacia poradia |
|
|
pisem render a taktiez ma napadol sposob optimalizacie. chcem vyuzit prioritnu frontu do ktorej nahadzem vsetky objekty ktore mi vylezu z orezovych testov. v nej to necham usporiadat podla urciteho poradia ktore este nemam ujasnene.
kedze programujem v OpenGL tak tym chcem dosiahnut co najnizsi pocet zmenov stavov.
co som vyrozumel tak by sa malo usporiadavat podla
shader
textura
VBO
ine stavy depth test atd.
takze ake je vhodne poradie usporiadavania? ono sa to dalej bije s dalsou doporucovanou optimalizaciou a to kreslit odpredu dozadu ale kedze v mojom pripade to nebude mat velky vplyv kedze sa nebudu modely prilis prekrivat tak to nema moc zmysel.
takze mam sa trapit s prioritnou frontou alebo mat len obycajnu.
taktiez ci si mam sam testovat ci je potrebne dany stav zmenit alebo ak je aktivna urcita textura a ja ju znova bindnem ci to ovladac bindne odznova alebo to preleti akoby nic.
taktiez by ma zaujimalo nakolko narocne je glGetUniformLocation ci to mam nejak cachovat. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
am!go

Založen: 19. 08. 2007 Příspěvky: 61 Bydliště: Praha
|
Zaslal: 4. leden 2009, 13:38:43 Předmět: |
|
|
Vetsinou se to sklada do skupin podle materialu tj. primarne podle shaderu a potom podle textur. Potom taky budes muset brat vpotaz na jake objekty sviti urcite svetlo atd a takhle to nejak seskupovat. To ale plati pro nepruhledny objekty, u pruhlednych ti nezbyde nic nez seradit je od nejvzdalenejsiho po nejblizsi. |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 4. leden 2009, 14:21:40 Předmět: |
|
|
Spíš to vezmu tak nějak obecně a řeknu, čeho se držím a co se dle mého názoru vyplatí řešit právě v OpenGL.
Všechny glGet* volání mohou být pomalejší - driver jede v druhém vlákně a musí zamykat (pokud si neudělal kopii dat do tvého vlákna). Vycházím z toho, že nejdražší je přepínání shaderů. Řadím takto:
- podle efektů (FX) (obsahuje průchody + renderstate + shadery)
- podle instancí (instance stejných objektů chci mít za sebou, abych pak snadno využil instancing a vyrenderoval celou skupinu jedním voláním)
- pro každej efekt seřadím jeho objekty dle vzdálenosti od kamery tak, abych nerozbil skupiny instancí (dle efektu buď odpředu dozadu nebo odzadu dopředu), pokud je jich víc jak nějaké n, tak neřadím.
Nezapomeň, že největší nárůst výkonu jsem zaznamenal, když jsem tam přidal:
- instancing - tohle je nutnost (ARB_draw_instanced, ARB_instanced_arrays nebo shader-based s duplikací meshů)
- optimalizace nastavování proměnných do shaderu - nastavení celé skupiny proměnných jedním voláním (EXT_gpu_program_parameters pro ARB programy, EXT_bindable_uniform pro GLSL shadery nebo trik s definicema pro GLSL, viz níže)
- může se hodit ARB_vertex_array_object pro rychlé přepínání meshů, implementace je triviální
Trik s definicema pro rychlejší nastavování proměnných. V shaderu:
kód: |
uniform vec4 defaultStorage[32];
#define lightColor defaultStorage[0]
#define lightPosition defaultStorage[1]
#define modelViewMatrix mat4(defaultStorage[2], defaultStorage[3], defaultStorage[4], defaultStorage[5])
... // atd.
|
defaultStorage nastavíš jedním voláním glUniform4fv. glGetUniformLocation si musíš udělat vlastní, který navíc ještě zpracuje všechny ty #define řádky. Odvážnější mohou vzít zdroják libovolnýho shaderu a strojově ho přepracovat do této podoby. Takhle to v OpenGL řeší např. ID Software. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
|
|
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