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: 28. březen 2014, 18:31:23 Předmět: Update textury v OpenGL (ES) |
|
|
Potřebuji updatovat v každém framu texturu s rozlišením stejným jako obrazovka (tzn. není to mocnina dvou).
Problém je, že v té textuře se během jednoho snímku změní oblast cca. 32x32 na několika místech (cca. 5).
Když udělám tohle:
kód: |
bool GLESTexture::Update(uint8 * data, int dataSize, int x, int y, int z, int w, int h, int d)
{
GLenum glFormat = GLESTexture::GetGLFormat(this->info.format);
bool wasBinded = this->IsBinded();
this->Bind();
if (w % 4 != 0)
{
GL_CHECK( glPixelStorei(GL_UNPACK_ALIGNMENT, 1) );
}
if (d == 1)
{
GL_CHECK( glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, glFormat, GL_UNSIGNED_BYTE, data) );
}
else
{
GL_CHECK( glTexSubImage3D(GL_TEXTURE_3D, 0, x, y, z, w, h, d, glFormat, GL_UNSIGNED_BYTE, data) );
}
if (w % 4 != 0)
{
GL_CHECK( glPixelStorei(GL_UNPACK_ALIGNMENT, 4) );
}
if (wasBinded == false)
{
this->UnBind();
}
return true;
}
|
A zavolám to pro ty subregiony 5x, tak je to neskutečně pomalý. Když se na to "vyseru" a hodím update celé textury najednou, tak to má daleko vyšší rychlost (ale pořád to není žádný super zázrak). Nemá někdo nápad co s tím ?
Btw. PBO je mimo hru, protože mobily a ES 2.0 _________________ Perry.cz |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 29. březen 2014, 09:25:21 Předmět: Re: Update textury v OpenGL (ES) |
|
|
Hmm, drivery občas moc nepomáhají.
Jak moc je to pomalé? Myslím, že 5 malých updatů by nemuselo být až tak šílené a nevidím důvod, proč by měl být 1x update všeho výrazně rychlejší.
No sice si to nemyslím, ale nemůžeš mít třeba omylem zapnuté GL_GENERATE_MIPMAP? |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 29. březen 2014, 11:18:17 Předmět: |
|
|
Nn.. mipmapy jsou vypnuté a nastaveno mám toto
kód: |
GL_CHECK( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0) ); |
_________________ Perry.cz |
|
Návrat nahoru |
|
 |
Tom Atom
Založen: 22. 10. 2013 Příspěvky: 19
|
Zaslal: 30. duben 2014, 16:46:14 Předmět: |
|
|
Zkusil bych si vygenerovat 2 Framebuffery, k nim vyrobil textury zarovnané na nejbližší mocninu 2. Nemusíš ji využívat celou... do 1. bych nakreslil všechno, co potřebuješ, přes to změny a v příštím framu ji použil jako zdrojovou texturu pro kresleni do té druhé, přidal zase změny a udělal z ní zdrojovou texturu pro další frame. A takhle bych to střídal furt dokola.
Tohle by mělo být na mobilech docela rychlé. Já kreslím všecko do takové textury a na konci to celé prsknu na obrazovku, protože na tom můžu ještě dělat různé celoobrazovkové efekty.
Co se týká rychlosti na mobilech, tak pozitivní zkušenost mám s tím, když při inicializaci zvolím barevnou hloubku 565 místo 888 a také mám dobrou zkušenost s kompresí textur - ETC1 je na Androidu v Open GL ES 2 (bohužel neumí alfu, takže pak musíš "multitexturovat")
V Shards (https://play.google.com/store/apps/details?id=com.sbcgames.shardsl) jsme se takto dostali i na starsim tabletu a v rozliseni 1280x800 na cca 50 FPS. Kdyz jsem to pak predelal na badu s rozlisenim 800x480, tak to bylo docela pomale, ale podarilo se to zrychlit zmensenim grafiky na 60% puvodni velikosti (+10 FPS). Takze pokud mas nejakou velkou texturu a scalujes pri finalnim vykresleni dolu, tak je to dalsi zrout vykonu... |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 30. duben 2014, 17:38:09 Předmět: |
|
|
TomAtom: To o čem mluvíš ale předpokládá, že kreslení do textury dělá GPU, ne ? Tzn. něco jako deferred rendering... nebo tu texturu plníš z image jako např. z foťáku / kamery ? _________________ Perry.cz |
|
Návrat nahoru |
|
 |
Tom Atom
Založen: 22. 10. 2013 Příspěvky: 19
|
Zaslal: 30. duben 2014, 17:46:57 Předmět: |
|
|
perry: ano GPU. Poprve se obrazek vygeneruje nebo nahraje a pak se po zakresleni zmen z nej vzdy stane textura pro dalsi frame. Ale nebere to zadna data z "externich" zdroju jako by byl fotak nebo kamera. |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 30. duben 2014, 19:33:19 Předmět: |
|
|
Tak to mi nepomůže, já potřebuji update CPU -> GPU / frame _________________ Perry.cz |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 1. květen 2014, 08:43:01 Předmět: |
|
|
Netuším k čemu potřebuješ variantu s 3D texturou, ale s dvojrozměrnou variantou by bylo určitě rychlejší, kdybys do té "screen textury" kreslil quad s texturou, kterou potřebuješ, ne? _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 1. květen 2014, 09:37:39 Předmět: |
|
|
? Jakou 3D texturou...
Obsah té textury se generuje na CPU a bottleneck je upload textury na GPU. V normálním GL3/4 mám PBO a nahrávám to asynchronně (1. PBO se plní, z 2. se čte a naopak). Nicméně PBO v ES není. Apple má nějaké svoje řešení přes CVTextureCache, ale Android imho nemá nic. _________________ Perry.cz |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 1. květen 2014, 12:51:41 Předmět: |
|
|
No, četl jsem si ten Tvůj kód v prvním příspěvku. Komentoval jsem větev glTexSubImage3D...
Jako, data, které tam posíláš (přes glTexSubImage2D), generuješ za běhu? Tohle bude prostě pomalé vždycky...
Na co to konkrétně potřebuješ? Nedalo by se to vymyslet tak, aby to jelo jen na GPU? _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 1. květen 2014, 13:03:04 Předmět: |
|
|
Aha.. No vymyslet by se to jinak dalo, míst bitmapové grafiky bych musel generovat vektorově a posílat na GPU vektorová data. Problém je, že ty bitmapy bych ale musel generovat stejně, protože je používám zároveň na detekce kolizí. _________________ Perry.cz |
|
Návrat nahoru |
|
 |
|