.[ ČeskéHry.cz ].
Video Ram-obsluha paměti,kreslení polygonů,otáčení obrázku

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
milikiller



Založen: 12. 02. 2009
Příspěvky: 6

PříspěvekZaslal: 12. únor 2009, 16:30:15    Předmět: Video Ram-obsluha paměti,kreslení polygonů,otáčení obrázku Odpovědět s citátem

Dobrý den. Již delší dobu vyvíjím vlastní vývojovou desku pro průmyslovou atomatizaci je to vlastně spíš dotekový ovládací panel. Již mám k dispozici funkční hardware a píši software. Jde o ARM7 mcu s 64Kb Ram a 512Kb flash tak že žádná výkonová bomba ale na vizualizace grafů a průběhů to dostačuje.

Mám na vás 3 dotazy.

Jak nejlépe obsluhovat video paměť? používám pro adresaci celého LCD dvourozměrné 16ti bitové datové pole o rozměrech rovnajících se rozlišení LCD , ale nejsem si uplně jistý jestli to je nejlepší metoda. Pokud chci kreslit bod o určité barvě tak jen nastavím
kód:
ram[x][y] = barva
to funguje bezvadně ale nyní jsem se dostal ke kreslení obrázků s průhledností 16bit barva a 8 bit Alpha a ono čtení pixelu z ram,převod z 16ti bit barvy na 3 8bit hodnoty a následné počítání a převod zpět asi není nejrychlejší řešení

Jak nakreslit vyplněný poligon? resp libovolný 4úhelník. Nevyplněný je jednoduchý jen 4 čáry, ale jak dopočítat výplň...?

a poslední dotaz je jak otočit obraz a vykreslit ho do video ram?
obrázek na vstupu je dvourozměrné pole obr[x][y] a na výstupu potřebuju zapsat hodnoty do dvourozměrného pole videoram, zadáním jsou X,Y,ÚHEL

zkoušel jsem
kód:
x' = cos(theta)*x - sin(theta)*y
y' = sin(theta)*x + cos(theta)*y

ale protože počítám čistě body bez antialisingu tak mám na některých bodech prázdná místa. znáte nějaké vylepšení?

obrázky vývojové desky jsou zde
http://milikiller.ic.cz/external/img1.JPG
http://milikiller.ic.cz/external/display2.jpg
http://milikiller.ic.cz/external/display1.jpg
http://milikiller.ic.cz/external/M65/image5.JPG
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 12. únor 2009, 16:50:34    Předmět: Odpovědět s citátem

milikiller: 2D grafikou jsem se už dlouho nezabýval, ale mrkni na algoritmy kreslení čar DDA (tak předpokládám kreslíš i teď?), Bresenhamův atd. Pro konvexní polygony se myslím používá právě ten bresenhamův, pro nekonvexní to musíš větvit. Další varianta je použít nějaký vyplňovací algoritmus (flood fill, seed fill), samozřejmě si na tom ARMu asi nemůžeš dovolit rekurzivní verze, ale přepsat je na iterativní.

S tou konverzí bitové hloubky za chodu by to neměl být takový problém, ve svém starém adventure enginu, který podporoval 15/16/24bit barvy jsem přepočítával framebuffer při loadingu obrázků a s bitovým posunem to bylo rychlé:
kód:
if(Bitscount==16)
   {
      for (int i=0; i<z_outlen; i+=3)
         *((WORD*)&z_output[i])=(z_output[i]>>3)|((z_output[i+1]>>2)<<5)|((z_output[i+2]>>3)<<11);

   }
   else if (Bitscount==15)
   {
      for (int i=0; i<z_outlen; i+=3)
         *((WORD*)&z_output[i])=(z_output[i]>>3)|((z_output[i+1]>>3)<<5)|((z_output[i+2]>>3)<<10);
   }
}

_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
milikiller



Založen: 12. 02. 2009
Příspěvky: 6

PříspěvekZaslal: 12. únor 2009, 17:14:40    Předmět: tak jsem koukal na ty alogoritmy Odpovědět s citátem

tak jsem koukal na ty algoritmy a našel jsem docela pěkné pdf
http://www.cse.unsw.edu.au/~cs3421/slides/COMP3421-pixels.pdf

A s tím přepočítávání barev to řeším uplně stejně. bitovým posunem. ale spíš jsem myslel jestli není nějaký algoritmus který umí počítat alpha kanál přímo z těch 16bpp ale to je asi uplný sci-fi. ono totiž na 60Mhz MCU si té matematiky moc dovolit nemůžeš... Ono bohatě stačí mazat-vykreslit a přeposlat do LCD 132x176 pixelů *16bit sice to stihnu zhruba při 30 fps ale stačí když dam pozadí přez celej LCD a rychlost letí někam k 10 fps. hold je to pakárna. Dneska zkusim nějak sesmolit ten Fill na ty polygony ,ale bojim se že se to všechno totálně zasekne. Uvidíme. Díky za odpověď. O tom otáčení obrázků náhodou někdo něco nevíte?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tringi



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

PříspěvekZaslal: 12. únor 2009, 17:44:08    Předmět: Odpovědět s citátem

Zdar, s podobnou ARM deskou zrovna taky pracuju, i když bez displeje.

Jak máš řešenu paměť toho displeje? Je zrcadlena v RAM nebo její čtení způsobí přístup k displeji? Pokud bys měl paměti víc, mohl bys mít jeden back-buffer s 24b barvami, a při blendingu (zápisu s průhledností) by ti tak odpadlo čtení a konverze. Jak široká je sběrnice k tomu displeji? Pokud je třeba 32 bitová, pak by se vše mohlo urychlit zápisem vždy dvou pixelů současně.

Nějaký chytrý a rychlý algoritmus na 16 bitovou průhlednost určitě existovat bude, zkusil bych googlit. Z hlavy ho takhle nevymyslím, ale pokud si danou grafiku přednásobíš alfa kanálem (viz google: premultiplied alpha) odpadne ti dalších pár instrukcí. Pak uděláš opačnou operaci nad pixelem v bufferu displeje, a tyto jednoduše sečteš. Tento součet pak klidně provedeš v 16 bitech, a pokud vymyslíš způsob přednásobení v 16 bitových barvách (což definitivně půjde), pak ti konverze úplně odpadně. Znáš-li OpenGL, pak se inspiruj: glBlend (GL_ONE, GL_ONE_MINUS_SRC_ALPHA).

Výplň se počítá tak, že objekt rozdělíš na trojúhelníky. Pro každý řádek si pak spočítáš, kde se s ním protínají jeho jednotlivé strany, a nastavuješ pixely od prvního průniku do druhého.

Finta v plynulém otáčení je, pro každý pixel výsledné bitmapy hledat vhodný pixel ze zdrojové bitmapy, pro vyhlazení pak váhově zprůměrovat čtyři nejbližší.

EDIT: Koukám na fotky a vidím že ten zápis na displej asi nijak nezrychlíš. Každopádně doporučuji nastudovat si instrukční sadu ARM a zkusit kritické části nabouchat v assembleru, protože ARM má mnoho instrukcí, které typický port GCC nedokáže ani použít.
S tím že to bude pomalé se budeš muset smířit a spíš vymýšlet optimalizace změn zobrazení. Tedy překreslovat jen ty části, které se opravdu změnily. Taky lze zneužít pomalou reakci displeje na zmenšení počtu kroků v plynulých přechodech a podobně.
_________________
WWW | GitHub | TW
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Hardwire



Založen: 04. 09. 2007
Příspěvky: 117

PříspěvekZaslal: 12. únor 2009, 18:56:52    Předmět: Odpovědět s citátem

Plnění polygonu:
http://cgg.ms.mff.cuni.cz/~pepca/lectures/pdf/fillpolygon.pdf

K otáčení obrázku bych přistupoval jako k renderování rotovaného quadu s texturou. Nejdřív bych otočil vrcholy obdélníka, ve kterém je obrázek, a postupně bych prošel oblast mezi nima, kterou mám vyplnit - např. algoritmem pro plnění polygonu viz. výše, můžeš ho optimalizovat jen na tuhle konkrétní situaci. Pro každý vyplňovaný pixel bych pak spočítal barvu z jeho pozice. Pro jednoduchost bych ze začátku jen spočítal souřadnice v textuře, zaokrouhlil je na nejbližší pixel a ten přímo vykreslil. Pak to můžeš zlepšit nějakým filtrováním (např. http://en.wikipedia.org/wiki/Bilinear_filtering).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
milikiller



Založen: 12. 02. 2009
Příspěvky: 6

PříspěvekZaslal: 12. únor 2009, 23:09:07    Předmět: Odpovědět s citátem

Tak zkusím nějak zodpovědět dotazy. Tak k HW který používám, jedná se o procesor LPC2106 čili arm7 s 64Kb ram a 128Kb flash. Display je moje specialitka jedná se o display z mobilního telefonu Siemens M65. Cena cca 250,- což je na tom to nejkrásnější. Ovládání LCD probíhá přez SPI cca 15MHz, ale přez SPI se dají data jen psát,tzn že celou RAM musím ukládat přímo na chipu, zabere to cca 47Kb. Potom se to celé přenáší do LCD.
Jako vstup mám k dispozici 2x Uart,1x I2C, Joystick,touchscreen, a ještě pár gpio navíc.

Co se softwaru týče tak mám zdrojáky portované pro devcpp a Keil for arm.
Nejsou žádné tajemství tak že už se tu asi 4 hodiny válí
kód:
Keil Source
http://milikiller.ic.cz/external/Box2D_keil.zip

DevCpp Source
http://milikiller.ic.cz/external/box2D_devcpp.zip


Tak já se teda dneska juknu na to otáčení a vyplněný poligony..ale z toho otáčení nejsem vůbec moudrej... vůbec netušim jak dostanu všechny body toho otočeného čtverce.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Hardwire



Založen: 04. 09. 2007
Příspěvky: 117

PříspěvekZaslal: 12. únor 2009, 23:29:18    Předmět: Odpovědět s citátem

milikiller napsal:
..ale z toho otáčení nejsem vůbec moudrej... vůbec netušim jak dostanu všechny body toho otočeného čtverce.

Zkus tohle: http://www.inf.ed.ac.uk/teaching/courses/cg/lectures/lect9-2.ppt
Slidy 22 a 27. Za Z0, Z1, Z2 dosaď texturový souřadnice příslušnejch vrcholů quadu. Budeš ho muset asi rozdělit na dva trojúhelníky, abys to moh udělat tímhle způsobem. To, jestli je kreslenej pixel v prvním nebo ve druhým trojúhelníku můžeš zjistit buď tak, že se podíváš, na který straně dělící úsečky (tý, kterou si quad rozdělil na dva trojúhelníky) je. Nebo bys to moh zjistit tak, že alfa, beta i gamma musej bejt v [0,1].

Vlastně když se na ty slidy teď koukám, tak to můžeš rovnou udělat tak, že projdeš celej bounding box toho kreslenýho quadu, pixel po pixelu, pro každej z nich spočítáš alfa, beta, gamma pro oba trojúhelníky, a pokud alespoň jedny z těch alfa, beta, gamma padnou všechny do [0,1], tak v tomto trojúhelníku pixel leží a máš přímo jeho barycentrický koordináty, který můžeš použít pro zjištění texturovejch koordinátů.

Doufám, že sem z toho neudělal guláš Smile
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 -> C / C++ Č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