[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (68471)
ASP (1591)
ActiveX (168)
Allegro (136)
Assembler (3926)
C++ Builder (23160)
C/C++ (44499)
Databáze (30680)
Delphi (78807)
DelphiX (1655)
DirectX (1464)
Java (39508)
JavaScript (12598)
Matematické programy (2178)
OOP a UML (732)
OpenGL (6920)
Php (65224)
PowerBuilder (464)
Problémy a algoritmy (10473)
Programování v Linuxu (2000)
Právo a programování (3384)
Python (1353)
Ruby (136)
Visual Basic (12078)
Visual C++ (12956)
Wap (56)
Web (10895)
Web servery (5549)
Win32 (13553)
Windows CE (865)
XML/XSL (1860)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • TurboPixels aneb rychlé pixely v DelphiX
    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í !
    Tvorba her v DelphiX
    Předchozí díl: Speciální grafické efekty v DelphiX

    Následující díl: Let s vrtulníkem v DelphiX
    Autor: Václav Krejčí
    Rubrika: Delphi
    Publikováno: 25.09. 2001
     Tisk článku
    Poslat odkaz emailem
     



    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.



    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.57
    (Počet známek: 3917)

    Komentáře k článku
    Shimi11.02.21:07Nějak mi to nefachá
    Shimi12.02.10:01RE: Nějak mi to nefachá
    hmm02.09.19:43asmconversion.pas
    Check-Check12.01.20:13RE: asmconversion.pas
    delphix02.09.19:25da sa
    jozo15.10.8:08RE: da sa
    Bobík23.08.10:27problem
    Shimi10.02.18:37RE: problem
    martin06.08.11:35no neviem
    PiN19.02.16:05Celoobrazovkový motion blur!
    matosimi01.08.8:51delphi 6
    Martin07.06.12:40???
    Martin07.06.12:44A zase ja
    Martin06.06.16:59Je to bezvy, ale chtel bych si rejpnout
         





    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena