.[ ČeskéHry.cz ].
Update textury v OpenGL (ES)

 
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: 28. březen 2014, 18:31:23    Předmět: Update textury v OpenGL (ES) Odpovědět s citátem

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



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 29. březen 2014, 09:25:21    Předmět: Re: Update textury v OpenGL (ES) Odpovědět s citátem

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



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

PříspěvekZaslal: 29. březen 2014, 11:18:17    Předmět: Odpovědět s citátem

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



Založen: 22. 10. 2013
Příspěvky: 19

PříspěvekZaslal: 30. duben 2014, 16:46:14    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 30. duben 2014, 17:38:09    Předmět: Odpovědět s citátem

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



Založen: 22. 10. 2013
Příspěvky: 19

PříspěvekZaslal: 30. duben 2014, 17:46:57    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 30. duben 2014, 19:33:19    Předmět: Odpovědět s citátem

Tak to mi nepomůže, já potřebuji update CPU -> GPU / frame
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 1. květen 2014, 08:43:01    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 1. květen 2014, 09:37:39    Předmět: Odpovědět s citátem

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



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 1. květen 2014, 12:51:41    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 1. květen 2014, 13:03:04    Předmět: Odpovědět s citátem

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