.[ ČeskéHry.cz ].
GL a vertex arrays

 
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
dzejkob



Založen: 17. 08. 2013
Příspěvky: 130

PříspěvekZaslal: 10. červen 2021, 21:17:15    Předmět: GL a vertex arrays Odpovědět s citátem

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



Založen: 28. 07. 2007
Příspěvky: 1558

PříspěvekZaslal: 10. červen 2021, 21:26:34    Předmět: Odpovědět s citátem

Zkoušel jsi zakomponovat glDrawElements?
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
dzejkob



Založen: 17. 08. 2013
Příspěvky: 130

PříspěvekZaslal: 10. červen 2021, 23:41:07    Předmět: Odpovědět s citátem

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



Založen: 28. 07. 2007
Příspěvky: 1558

PříspěvekZaslal: 14. červen 2021, 10:01:03    Předmět: Odpovědět s citátem

On by ti asi nejlíp poradil Eosie/Marek, pokud tady ještě je.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 14. červen 2021, 15:27:17    Předmět: Odpovědět s citátem

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:
kód:
m_Count--;

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



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 14. červen 2021, 15:46:08    Předmět: Odpovědět s citátem

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



Založen: 17. 08. 2013
Příspěvky: 130

PříspěvekZaslal: 17. červen 2021, 21:26:46    Předmět: Odpovědět s citátem

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