|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
|
|||||||||
|
|
||||||||||
|
|
|||||||||
|
Vadí vám, že standartní funkce windows "pixels" je pomalá, a tudíž celkem nepoužitelná ve hrách či v programech v DelphiX ? Nebo prostě jenom potřebujete kreslit pixely s alpha průhledností a čáry s vyhlazením ? Tak právě pro vás je tu unita TurboPixels pro DelphiX ! Tato unita vznikla právě pro potřebu rychlého přístupu k pixelům a její použití je více než jednoduché. Nejprve musíte samozřejmě přidat do uses TurboPixels. Dále v proceduře kreslení, nejspíš DXTimer.OnTimer musíte zamknout povrch pro kreslení. To uděláte přes proceduru LockSurface(surface); První a zároveň jediný parametr musí být povrch, na který chcete kreslit (např. DXDraw1.Surface). A můžete se dát do kreslení. Zde je výpis všech nejpoužívanějších funkcí: Nastavení pixelu - SetPixel Začněme tedy pouhým nastavením pixelu na určitou barvu. Velkou roli při kreslení hraje aktuální barevná hloubka, kterou musíme nejprve otestovat, a podle ní kreslit (je uložena v dxdraw.Surface.BitCount). Navíc je v unitě pro každou hloubku ještě víc procedur, pár jich využívá assembler, pár ne. Pro kterou se rozhodnete je už jen a jen na vás: Barevná hloubka 8bitů (256 barev): procedure turboSetPixel8(const X, Y: Integer; color: byte); procedure turboSetPixel8A(const X, Y: Integer; color: Integer); procedure turboSetPixel8PC(x, y, color: integer); Barevná hloubka 16 bitů procedure turboSetPixel16RGB(const X, Y: Integer; R, G, B: byte); procedure turboSetPixel16(const X, Y: integer; color: cardinal); procedure turboSetPixel16A(X, Y: Integer; color: cardinal); procedure turboSetPixel16PC(x, y, color: integer); Barevná hloubka 24 bitů procedure turboSetPixel24RGB(const X, Y: Integer; R, G, B: byte); procedure turboSetPixel24(const X, Y: integer; color: cardinal); procedure turboSetPixel24A(X, Y: Integer; Color: cardinal); procedure turboSetPixel24PC(x, y, color: integer); Všechny procedury jsou opravdu rychlé, což si můžete vyzkoušet hned na přiloženém demu, které je součástí archivu. První demonstrační příklad ukazuje pouze nastavování náhodných pixelů, čímž vzniká efekt zrnění:
Na mém PC se při rozlišení 1024*768 kreslil pruh pixelů vysoký 100pixelů. To znamená při každém vykonání procedury Timeru se kreslilo 102400 pixelů. Při tomto rozlišení dosahoval program 20FPS, z čehož lehce vypočteme, že TurboPixels zvládnou nakreslit něce málo přes dva miliony ! pixelů za sekundu. A to je už opravdu fofr (možná to bude taky trochu tím, že mám PC Athlon 1GHz, 384MB RAM a GeForce2 :)). Zjištění pixelu - GetPixel Další často používanou věcí je zjištění barvy pixelu na určitě pozici. Stejně jako u předchozího, i zde je pro každou barevnou hloubku jiná funkce: Barevná hloubka 8 bitů function turboGetPixel8(const X, Y: Integer): byte; function turboGetPixel8PC(x, y: integer): integer; Barevná hloubka 16 bitů function turboGetPixel16(const x, y: Integer): cardinal; function turboGetPixel16PC(x, y: integer): integer; - zjištění jednotlivých složek barvy: function r16(color: cardinal): byte; function g16(color: cardinal): byte; function b16(color: cardinal): byte; Barevná hloubka 24 bitů function turboGetPixel24(const x, y: Integer): dword; function turboGetPixel24PC(x, y: integer): integer; - zjištění jednotlivých složek barvy: function r24(color: cardinal): byte; function g24(color: cardinal): byte; function b24(color: cardinal): byte; Opět můžete spustit demontrační příklad a vybrat z menu druhou položku (a samozřejmě nastavit rozlišení):
V tomto případě je nastaven pixel obrázku podle některého okolního pixelu, čímž vzniká zajímavý efekt. Jako minule i v tomto případě je program velmi rychlý. Kreslení pixelu s alpha průhledností I rychlé kreslení s alpha průhledností není díky TurboPixels problém. Je to sice již trochu pomalejší, ale stále několikrát rychlejší než windowsovské "pixels". Zde jsou procedury které můžete použít: procedure turboSetPixelAlpha16(const X, Y: Integer; color: cardinal; A: byte); procedure turboSetPixelAlpha24(const X, Y: Integer; color: cardinal; A: byte); procedure turboSetPixelAlpha16RGB(const X, Y: Integer; R, G, B, A: byte); procedure turboSetPixelAlpha24RGB(const X, Y: Integer; R, G, B, A: byte); A rovnou se vrhneme na demo. Ve třetím případě je zobrazován obrázek turbo, a nad ním s měnící se alpha průhedností šum:
Kreslení vyhlazených čar Dalším neskutečně velkým problémem je to, že delphiX ani windows nepodporují vyhlazené (antialiasingované) čáry. Ani toto však není pro TurboPixels problém. Použít můžete tyto procedury: procedure turboWuLine16(x1, y1, x2, y2: Integer; R, G, B: byte); procedure turboWuLine24(x1, y1, x2, y2: Integer; R, G, B: byte); Pokud chcete přeci jenom nevyhlazené čáry, vynechte kouzelné slovo Wu: procedure turboLine16(x1, y1, x2, y2: Integer; R, G, B: byte); procedure turboLine24(x1, y1, x2, y2: Integer; R, G, B: byte); K předvedení možností vám poslouží poslední příklad v demonstračním programu:
Kreslení WinAmp textu Další specialitkou, kterou v unitě naleznete je kreslení WinAmp textu. Stačí si tento text z nějakého skinu nahrát do DXImageListu, nastavit PatternHeight na 6 a PatternWidth na 5 a zavolat proceduru TurboWrite. Zde jsou její parametry: procedure turboWrite(DxDrawSurface: TDirectDrawSurface; Imagelist: TDXImageList; font, text: string; x, y: integer);
Takže rychle prohlédněte všechny skiny WinAmpu, a hned můžete nějaké to písmo použít. Pokud se vám zdá, že máte obrázků málo, zde jich pár je:
Pár slov nakonec... !!! Pozor !!!, po ukončení kreslení musíte povrch zase odemknout přes proceduru TurboUnlock, která je již bez parametrů. Nakonec vám ještě řeknu, že tímto článkem s TurboPixels nekončíme, ale právě naopak. Chystám pro vás totiž například článek o Particle Systems (částicové systémy):
Nebo o zobrazení a rotaci jednoduché 3d kostky:
A právě u těchto příkladů hezky využijeme možnosti, které nám TurboPixels nabízí. Download Zde si můžete unitu stáhnout i s demo příkladem. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||