Delphi - BumpMap effektet előállító eljárás

forráskód letöltése
A Bump Mapping effektust általában 3D-s programokban használják a kisebb felületi egyenetlenségek szimulálására. A Bump Map egy szürke árnyalatos kép, amelyen a világosabb részek a kidomborodást, a sötétebb részek pedig a besüppedt részeket jelzik. Ebben a példában egy olyan eljárást készítünk, amely egy tetszőleges bitképre feszít egy szintén tetszőlegesen megadható Bump Map bitképet.
A feladat megoldásánál figyelembe kell venni, hogy a két bitkép mérete nem biztos, hogy megegyezik. Az a gyakoribb eset, amikor a módosítandó bitkép mérete a nagyobb, ezért az eljárást úgy írjuk meg, hogy a Bump Map képet mozaikszerűen feszítjük rá a bitképre. A Bump Map-nak nem kell feltétlenül szürkeárnyalatosnak lennie, mivel a pixelek színét átlagolni fogjuk.
Az eljárás a következőképpen néz ki:
BumpTexture
Osztály:
procedure BumpTexture(
Pic,
BumpMap: TBitmap
);
Az eljárás a bump.pas unitban található. A paraméterekre nézve semmiféle ellenőrzést nem végez, tehát érvényes TBitmap típusú objektumokat kell megadni. Mindkét objektumban módosítja a pixel formátumot 24 bitesre az egységes feldolgozási módszer miatt. A pixelek eléréséhez a Scanline eljárást használjuk, mivel ez jóval gyorsabb a Canvas objektum Pixels property-jénél. A Scanline eljárás egy pointert ad vissza, az indexként megadott sor pixeleire mutat. A 24 bites formátum miatt egy pixelhez három bájt tartozik, az RGB színösszetevők értékeivel. A Könnyebb felhasználás érdekében deklarálunk egy PRGBArray tömb pointert:
type
  TRGBArray=array[0..4096] of TRGBTriple;
  PRGBArray=^TRGBArray;
A pixelek beolvasása és módosítása két egybeágyazott ciklusban történik. A külső ciklus a sorokon, a belső pedig az oszlopokon megy végig. A Nump Map képet is hasonlóképpen járjuk be, de mivel ezt folyamatosan, a bitkép pixeleinek beolvasása közben kell megtenni, ezért két változót használunk fel az X és Y koordináták tárolására. Ezzel a módszerrel biztosíthatjuk azt, hogy a két képnek nem kell egyforma méretűnek lennie.
Egy változóban eltároljuk a Bump Map kép bx, és by változók által meghatározott pixelének színét, illetve a három színösszetevő értékének átlagát. Ebből az értékből még kivonunk 128-at. Így a változó értéke –128..127 intervallumba esik. Ha az érték 0, akkor a módosítandó bitkép aktuális pixelének színe nem fog megváltozni. Ha az érték negatív, akkor a pixel színe sötétebb lesz, ellenkező esetben pedig világosabb. A sötétítés és világosítás százalékosan, színösszetevőnként történik.
Paraméterek
Pic
A módosítandó bitkép TBitmap típusú objektuma. Az eljárás nem ellenőrzi, tehát csak létező objektumot adjunk meg.
BumpMap: TBitmap
A Bump Map kép objektuma. Ez is TBitmap típusú, és szintén létező, érvénes objektumnak kell lennie.