.[ ČeskéHry.cz ].
OpenGL - 2D
Jdi na stránku 1, 2  Další
 
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
frca



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

PříspěvekZaslal: 15. duben 2009, 07:18:57    Předmět: OpenGL - 2D Odpovědět s citátem

Zdravim,
da se nejak v OpenGL akcelerovat 2D grafika? A ted nemyslim natazeni textury na quad a jeho vykreslovani, ale dynamicke kresleni po pixelech, proste neco takoveho (napriklad): http://en.wikipedia.org/wiki/Plasma_effect
Diky,
frca
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 15. duben 2009, 08:14:02    Předmět: Odpovědět s citátem

Co myslíš tím akcelerováním? Spočítat plazmu na GPU? Asi se podívej na to, co se dá dělat pomocí GLSL a Pixel (Fragment) shaderů.
_________________
http://trionteam.net
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: 1561

PříspěvekZaslal: 15. duben 2009, 10:34:53    Předmět: Odpovědět s citátem

Pocitat primo na GPU ne (i kdyz by to taky slo, ale o to mi ted nejde). Pokud si vezmu srovnani GDI a DDraw, tak je rychlejsi DDraw. Jde mi o nasimulovani DDraw pomoci OpenGL. Asi je to o tom, jak rychle se prenasi data z RAM do frame bufferu. Nevim, jak to presne resi GDI nebo X protokol, ale urcite existuje rychlejsi zpusob. Prave ten me zajima, a vzhledem k tomu, ze OpenGL je graficka knihovna, tak logika veci rika, ze by to pomoci ni mohlo jit.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 15. duben 2009, 13:00:00    Předmět: Odpovědět s citátem

No já nevim... tak vytvořit si texturu, nasypat do ní pixely a poslat ji běžně přes OpenGL na kartu (do videoRAM), pak vytvořit quad a na něj ji natáhnout a zobrazit?
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 15. duben 2009, 13:03:05    Předmět: Odpovědět s citátem

Tak ted fakt nevim, o co presne ti jde. Spocitat neco na CPU a pak to zobrazit? Pak ano - na CPU si to spocitas, nahrajes jako texturu a tu pomoci quadu vyrenderujes. Ale prenos RAM -> VRAM je presne to, co je pomale (a DDraw bylo rychle prave v tom, ze vetsinu veci umoznovalo delat v ramci VRAM, bez primych zasahu CPU).

Jinak i to GDI je celkem rychle (zobrazi plynulou grafiku), pokud nekreslis primo na obrazovku, ale pres off-screen buffer. Princip stejny jako backbuffery u DDraw, efekty hodne podobne.
_________________
http://trionteam.net
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: 1561

PříspěvekZaslal: 15. duben 2009, 14:34:18    Předmět: Odpovědět s citátem

U DDraw je ukazatel na nejaky surface, pomoci nejz se meni barvy pixelu. Pamet, kam ukazuje, je teda v RAM, nebo ve VRAM? A co vubec dela ten lock a unlock?
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 15. duben 2009, 16:11:05    Předmět: Odpovědět s citátem

Surface v DDraw je sice ukazatel, ale je to ukazatel na objekt, ktery reprezentuje blok pameti (typicky ve VRAM, ale mohl byt i v RAM). Pozor na to, ze to je ukazatel na objekt, ne na samotnou pamet s pixelama! Tu menily az samotne metody toho objektu a primy pristup k pameti, kterou Surface reprezentuje, neni mozny. Ten pointer, ktery ma programator v ruce samozrejme jde do RAM, ale v RAM je jenom objekt, ktery uvnitr nekde ma pointer (handle) do VRAM.

Resp. ten pristup mozny je, prave pres Lock & Unlock. Ty zajistily namapovani kusu VRAM do RAM tak, aby k surface bylo mozne pristupovat. Jak presne to probiha nevim (jestli je tam primy pristup pres ty mapovane adresy, nebo se kopiruje pri Locku tam a pri Unlocku zpet; asi to muze zalezet i na ovladacich), nicmene vysledek je ten, ze do pameti s pixelama jde pristupovat jen mezi Lock & Unlock a Lock & Unlock kazdopadne jsou netrivialni operace a (minimalne v DirectX 5) Lock znamenal globalni pouziti globalniho mutexu nekde v kernelu. Jak to bylo v dalsich verzich nevim.

Stale jsi ale nenapsal, ceho chces dosahnout... Zapisovani pixelu do vystupniho bufferu? Zapisovani pixelu do textur? Renderovani do textur?
_________________
http://trionteam.net
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: 1561

PříspěvekZaslal: 15. duben 2009, 18:57:52    Předmět: Odpovědět s citátem

Jo, asi to zapisovani pixelu do vystupniho bufferu.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 15. duben 2009, 19:11:07    Předmět: Odpovědět s citátem

Takze hledas glDrawPixels/glReadPixels? Smile (ktere asi nebudou moc rychle a nedoporucoval bych je pouzivat, ale existuji)
_________________
http://trionteam.net
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: 1561

PříspěvekZaslal: 16. duben 2009, 08:32:28    Předmět: Odpovědět s citátem

Ja to chci ale zrychlit, ne zpomalit Wink
Takze zustat u DDraw? A pod linuxem co?

Jinak co se tyce OpenGL, tak jsem mel tajny tip na pixel buffer object, ale nikdo ho tu nezminil... No a v souvislosti s tim by uz mohla prestat platit ta ohrana pisnicka, jak je glDrawPixels pomale. Ale nevim, jestli to nebude i tak pomale, proto se tady snazim najit nejake zkusenosti.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 16. duben 2009, 08:52:09    Předmět: Odpovědět s citátem

Když to budeš počítat ve fragment shaderu, bude to ďábelsky rychlé Wink
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
MD



Založen: 29. 07. 2007
Příspěvky: 437
Bydliště: Praha

PříspěvekZaslal: 16. duben 2009, 09:04:03    Předmět: Odpovědět s citátem

Ja se obavam ze zadnou zazracne rychlou funkci nenajdes. Je to proto, ze dnesni hardware nic takoveho proste neumi, takze to musis zrychlit sam pomoci nejakeho chytreho figle Wink

1) zakladni moznost. Mit v RAM backbuffer, do ktereho si softwarove zapisujes pixely na libovolna mista. Kdyz je snimek hotovy posles cely buffer na kartu (viz Lock-Unlock operace vyse). Tohle je pomale jednak proto ze pixely pises softwarove po jednom a jednak proto, ze kazdy snimek prenasis velke mnozstvi dat na kartu (a cim vyssi rozliseni tim pomalejsi) Je mozna optimalizace, ze se prenasi jen urcity vyrez, ktery se zmenil. (Myslim, ze surova prace s bufferem by mela byt rychlejsi, nez glDrawPixels, pokud pixelu bude hodne.)

2) Zkusit obrazek sestavit z bitmap. At uz konstantnich obrazku, animaci nebo neceho pocitaneho, co se da ulozit do cache. (Protoze tu samou bitmapu pouzijes jinde nebo jindy znovu.) Pak ses na tom celkem dobre, bitmapy nahravas do vram, mapujes na quady, kreslis. Tohle je rychle.

3) Pokud jde o nejakou plazmu, sum atd., tedy neco, co se da vypocitat nejakym vzorcem v pixel shaderu, tak to udelat. Vykreslit quad a shader nahodi potrebny plazmoidni pixely.
_________________
- play with objects - www.krkal.org -
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: 1561

PříspěvekZaslal: 16. duben 2009, 12:15:09    Předmět: Odpovědět s citátem

Tak jsem zkousel test 2D v SDL na linuxu (tam ani neni potreba lock/unlock, protoze SDL_MUSTLOCK(surface_okna) je 0). Dal pak prenos pomoci pixel buffer objektu (dvojiteho, glMapBufferARB) a glDrawPixels(..., 0). Vyslo mi, ze to druhe je jeste o nejakych 10 % pomalejsi.
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 16. duben 2009, 13:02:12    Předmět: Odpovědět s citátem

frca napsal:
Ja to chci ale zrychlit, ne zpomalit Wink
Takze zustat u DDraw? A pod linuxem co?

Jinak co se tyce OpenGL, tak jsem mel tajny tip na pixel buffer object, ale nikdo ho tu nezminil... No a v souvislosti s tim by uz mohla prestat platit ta ohrana pisnicka, jak je glDrawPixels pomale. Ale nevim, jestli to nebude i tak pomale, proto se tady snazim najit nejake zkusenosti.


Zustat u toho, ze bitmapy mas v texturach a kreslis je pres Quady Wink
Duvod, proc je DrawPixels a spol (ale i ty lock/unlock v DDraw) jsou pomale je v tom, ze je pomaly prenos dat z RAM na kartu. Muze za to HW, ne graficka knihovna, takze jeji vymenou se to nezlepsi.

Problem je, ze se porad snazis pres CPU protlacit data na grafickou kartu - jenze CPU pracuje jenom s daty v RAM, ne na karte. Proto te vsichni tlaci k pouziti shaderu a textur - ty pracuji jen na graficke karte, proto jsou rychle.

Jinak reseni u dynamickych textur jsem typicky videl takove, ze se textura spocitala na CPU, nahrala na kartu (v kazdem snimku) a tam se s ni dal pracvalo. Pokud jde o PBO, tak ty sice jde locknout, ale trpi stejnym problemem RAM - karta, jako ostatni metody, takze bych necekal zasadni zrychleni.
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 16. duben 2009, 15:23:00    Předmět: Odpovědět s citátem

Vykreslíš fullscreen quad/triangle (je to jedno). V pixel shaderu dostaneš vstupní texturu/další data, uděláš operaci nad pixelem. Uložíš do výstupní textury. Tohle by mělo být nejrychlejší, protože to tak dělá každý.

Pokud chceš naprogramovat výpočet nějakého obrázku, můžeš to udělat jenom v pixel shaderu a k tomu potřebuješ zařídit všechny ty věci okolo.

Vertex shader můžeš využít na předpočítání nějakých dat, na výstup můžeš dát minimálně 32 floatů a data budeš mít automaticky lineárně interpolovaná mezi jednotlivými vrcholy pro každý pixel (nelineární interpolace jde taky). Dá se tak urychlit i blbej blur (offsetuješ koordináty už ve vertex shaderu).

Jiná možnost: Použít CUDA nebo OpenCL (až bude rozumně dostupné), ale tam zas není přístup k některým funkcím hardwaru (ROP jednotky, interpolátory, depth a stencil buffer...). Nebudeš muset použít fullscreen quad, ale bude to mnohem víc low-level, než si dokážeš v tuto chvíli představit.

K Lock/Unlock paměti ve VRAM vs RAM:
Teoreticky by neměl být problém locknout paměť ve VRAM (vždyť si přece vezme shora kus adresovatelného paměťového prostoru), driver a systém to ale musí umožnit. Předpokládej, že locknutá paměť není cachovaná = náhodný přístup je zlo, vyplňuj to sekvenčně (to samé platí pro glMapBuffer). Na novém hardware to jde i naopak, GPU umí číst přímo z RAM přes PCIe, ale mohou s tím být komplikace (viz CUDA 2.2).

frca napsal:
Jinak co se tyce OpenGL, tak jsem mel tajny tip na pixel buffer object, ale nikdo ho tu nezminil... No a v souvislosti s tim by uz mohla prestat platit ta ohrana pisnicka, jak je glDrawPixels pomale. Ale nevim, jestli to nebude i tak pomale, proto se tady snazim najit nejake zkusenosti.


Tady si právě myslím, že glDrawPixels za tvými zády udělá texturu na quadu. Není to moc často používaná funkce, takže bych i čekal, že nebude optimalizovaná přesně tak, jak ty chceš... v GL 3.1 ta funkce už není (asi měli dobrý důvod ji dát pryč). Jinak pixel buffer object je určitě správná volba pro jakýkoliv přenos pixelů a texelů...
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
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
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
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