Extra sidebar

Här kommer det kanske finnas grejer senare.

Alpha blending i REBOL

Antag att vi har en klipptextur som vi vill kombinera med en grästextur. Det lättaste sättet att göra det är kanske att använda Photoshop, men det är sannerligen inte det billigaste. Vi kanske dessutom vill kunna automatisera processen och köra den som ett led i bygget av vårt spelprojekt.

 

En lösning är att skriva ett litet script i REBOL som kombinerar bilderna baserat på en "blend mask". En blend mask är en gråskalebild som bestämmer till vilken grad en pixel ska influeras av motsvarande pixel i bilderna som ska kombineras. Svart betyder att enbart pixeln från bild 1 kommer ha någon inverkan på resultatet. Vitt betyder att enbart pixeln från bild 2 kommer ha någon inverkan på resultatet. Alla gråskalor däremellan interpolerar pixlarna från båda bilderna.


REBOL-koden för att utföra blend-operationen ser ut enligt följande:

REBOL [
  Title: "Blend"
]

blend: func [source-1 source-2 mask /local p m] [
  p: source-2
  m: mask
  while [
    all [not tail? p not tail? m]
  ][
    p/1: to-tuple reduce [p/1/1 p/1/2 p/1/3 255 - m/1/1]
    p: next p
    m: next m
  ]
  to-image layout [
    origin 0x0
    at 0x0 image source-1
    at 0x0 image source-2
  ]
]

rock: load-image %rock.png
grass: load-image %grass.png
mask: load-image %mask.png

save/png %grassy-rock.png blend rock grass mask


Nedan syns resultatet. Med den blend mask som användes här är det kanske inte så snyggt, men det är själva principen som jag försöker illustrera.