Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
dzejkob
Založen: 17. 08. 2013 Příspěvky: 130
|
Zaslal: 10. červen 2021, 21:17:15 Předmět: GL a vertex arrays |
|
|
Mám takovej beginner principielní dotaz: mám v GL nějaký pole vertexů a pak k nim pole různejch atributů pro shadery. Většinou nejde o 3d objekty, ale nějaký speciální konstrukce jako sprity s atlas mapama, efekty, atd. No a problém je v tom, že aby to bylo rychlé, tak se to snažím dělat ideálně přes jedno glDrawArrays (speciality pak jsou v atributech a shaderech). Otázka zní: jak se v takovém případě dělá nejefektivněji nějaký zásadnější rebuild toho vertex array? (přidání artefaktu, odebrání atp.) Momentálně to dělám způsobem "něco jako nafukovací pole" - tj. mrtvé / nepoužité vertexy mají 0,0,0 a popř. 0 opacity a případně když zbyde výkon, tak se udělá kompletní rebuild.
Otázka v zásadě zní: nemá GL na řešení tohoto problému nějaké optimálnější metody, struktury? Třeba nějaký linked list nebo tak něco?
(je mi jasné, že je odpověďí ponořit se do GL dokumentace - což ale vlastně ani nebyla moje ambice - ale vyhnout se tomu úplně nedá - stačí mi nějaké nasměrování) |
|
Návrat nahoru |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 10. červen 2021, 21:26:34 Předmět: |
|
|
Zkoušel jsi zakomponovat glDrawElements? _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
dzejkob
Založen: 17. 08. 2013 Příspěvky: 130
|
Zaslal: 10. červen 2021, 23:41:07 Předmět: |
|
|
Jo to je určitě dobrej point. Já to zkoušel nějak přes nějaký metody toho enginu ale bylo to snad i horší. Ale o to vlastně nejde ... mě jde spíš o nějaký principielní věci - což jasný, je určitě lepší posílat sadu indexů než posílat 0,0,0 ... což zas takovej rozdíl neudělá, stejně někdy budu muset natáhnout to pole ... jde mi hlavně o to, zda nedělám nějaký úplný nesmysly ... |
|
Návrat nahoru |
|
|
frca
Založen: 28. 07. 2007 Příspěvky: 1558
|
Zaslal: 14. červen 2021, 10:01:03 Předmět: |
|
|
On by ti asi nejlíp poradil Eosie/Marek, pokud tady ještě je. _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 14. červen 2021, 15:27:17 Předmět: |
|
|
Asi to nepomůže, ale u particle systému jsem použil následující trik:
- particle měl fixní délku života (pokud jsem chtěl, aby vizuálně zmizel dřív, dalo se to udělat přes velikost, nebo alfu).
- buffer měl fixní kapacitu
Díky tomu sem věděl, kde přesně začíná v bufferu volný místo a nebylo nutné hledat místo pro nový particly. Rendrovalo se na 1 až 2 batche z jednoho bufferu. Ta mezera volných particlů se jakoby posouvala pořád dokola. A pole zároveň zůstávalo setříděné podle toho lifetime, což bylo u particle systému žádoucí.
Particle se přidal takto:
Updatoval se particle na pozici m_Next a pak se posunulo:
kód: |
m_Next = (m_Next + 1) % m_Capacity;
m_Count++; |
Odebral takto:
Kreslení, nebo update:
kód: |
u32 C_ParticleSystem::GetStartIndex() const
{
return (m_Next + (m_Capacity - m_Count)) % m_Capacity;
}
...
// first range
unsigned start = GetStartIndex();
unsigned stop = Min(m_Capacity, start + m_Count);
AnimRange(start, stop);
// second range (calculate start and stop again, because AnimRange can remove particles)
start = GetStartIndex();
stop = Min(m_Capacity, start + m_Count);
unsigned stop2 = m_Count - (stop - start);
AnimRange(0, stop2);
|
No a hlavně: při updatu toho vertex buffer byl použit doublebuffering, prostě byly dva, aby se jeden mohl updatovat, zatímco druhý se kreslí. To bys mohl použít. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 14. červen 2021, 15:46:08 Předmět: |
|
|
Jo a jinak bych řek, že nic extra v GL neni. Prostě si napsat nějaký vlastní alokátor, který ti bude ten buffer mapovat (udržovat nějaký volný stránky a tak). V práci to tak máme, teda kolega má ;-).
Ještě bych se asi podíval na sparse buffery, jestli to k něčemu může být.
A poslední co mě napadá, mohl bys použít compute shadery a vytvářet vertex a index buffery tam. A dokonce i draw commandy. Dělal sem to, ale už si nepamatuju detaily. Koukni: https://lingtorp.com/2018/12/05/OpenGL-SSBO-indirect-drawing.html _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
dzejkob
Založen: 17. 08. 2013 Příspěvky: 130
|
Zaslal: 17. červen 2021, 21:26:46 Předmět: |
|
|
Díky za zpětnou vazbu - ono ani nejde úplně o to, že by současný řešení bylo pomalý - spíš o nějaký přehled. To moje řešení nějak funguje a asi i rychle. Ty data pozic držím přímo v tom bufferu, což je asi blbost - správně bych patrně měl do toho bufferu lejt jenom to co je ve viewportu - ale řek bych, že to je v mém případě jedno - když jsou na scéně nějaký partikly, tak na ně dost jistě kouká viewport a pokud ne, tak to je minorita (netýká se to ostatních objektů - to řeší nějak pyglet přes visibility - upřímně nevím jak) |
|
Návrat nahoru |
|
|
|