TurboPixels aneb rychlé pixely v DelphiX - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



Delphi

TurboPixels aneb rychlé pixely v DelphiX

delphix_turbopixels

25. září 2001, 00.00 | Chcete ve hrách v DelphiX používat rychlý přístup přes pixely, kreslit pixely s alpha průhledností, vyhlazené čáry nebo třeba text z WinAmpu ? Přečtěte si recenzi unity TurboPixels, která toto vše umí !



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);
  • DXDrawSurface - povrch na který se bude kreslit
  • ImageList - DXImageList, ve kterém je uložen obrázek s písmem
  • Font - jméno písma v DXImageListu
  • Text - text, který chcete napsat
  • X,Y - pozice textu


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.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: