Mischen zweier Texturen mit Alphamaske von ???
Hallo Zusammen,

ich möchte Euch mal ein wichtiges Element meiner XTerrain-Engine preisgeben, nachdem das Thema "Mischen zweier Texturen mit einem Übergang" schon öfters diskutiert wurde.
Ich habe eine Funktion geschrieben mit der zwei Texturen und einer Alpha-Textur (Graustufen) zusammengemischt werden. Demnach entspricht schwarz der ersten Textur und weiß der Zweiten. Die Graustufen dazwischen bestimmen den Anteil der beiden Texturen.

Die Funktion funktioniert wunderbar - allerdings nicht für den Echtzeitbetrieb. Daher wird diese Funktion im Editor verwendet und die Textur mit den Kartendaten gespeichert, damit die Funktion nicht alle Tiles der Karte bei jedem Spielstart durchrechnen muss.

Ich habe die Funktion so geschrieben, dass ein neues Image auf den aktuellen Graphicbuffer gepinselt wird. Somit funktioniert die Funktion wie eine Art Stempel.

[code:1:3b924ff862]Function DrawImageWithAlpha(source%,source_alpha%,x%,y%,maxX%,maxY%)
; *** Funktion zum Zeichnen eines Images mit dazugehörigem Alpha-Image auf den aktiven Buffer
; source% = Quell-Image
; source_alpha% = Quell-Alpha-Image
; x% = Zielposition zum Zeichnen auf aktiven Buffer (X-Position)
; y% = Zielposition zum Zeichnen auf aktiven Buffer (Y-Position)
; !! Benötigt 32-bit Farbtiefe für die Berechnung der Farben !!

Local tx%,ty%
Local rgb1,rgb2,rgb3,alpha
Local a1,r1,g1,b1,a2,r2,g2,b2
Local alpha_col
Local a_dest%,r_dest%,g_dest%,b_dest%

If ImageWidth(source%)=ImageWidth(source_alpha%) And ImageHeight(source%)=ImageHeight(source_alpha%) Then
source_buffer1=ImageBuffer(source%)
source_buffer2=ImageBuffer(source_alpha%)
dest_buffer=GraphicsBuffer()
LockBuffer source_buffer1
LockBuffer source_buffer2
LockBuffer dest_buffer
For ty% = 0 To ImageHeight(source%)-1
For tx% = 0 To ImageWidth(source%)-1
If (tx%+x%) < maxX% And (ty%+y%) < maxY% Then
rgb1 = ReadPixelFast(tx%+x%,ty%+y%,dest_buffer)
rgb2 = ReadPixelFast(tx%,ty%,source_buffer1)
alpha = ReadPixelFast(tx%,ty%,source_buffer2)
a1 = (rgb1 And $FF000000)/$1000000
r1 = (rgb1 And $FF0000)/$10000
g1 = (rgb1 And $FF00)/$100
b1 = (rgb1 And $FF)
a2 = (rgb2 And $FF000000)/$1000000
r2 = (rgb2 And $FF0000)/$10000
g2 = (rgb2 And $FF00)/$100
b2 = (rgb2 And $FF)
alpha_col = (((alpha And $FF0000)/$10000) / 2.55)
a_dest% = Int(a1 * (1.0-(alpha_col/100.0))) + Int(a2 * (alpha_col/100.0))
r_dest% = Int(r1 * (1.0-(alpha_col/100.0))) + Int(r2 * (alpha_col/100.0))
g_dest% = Int(g1 * (1.0-(alpha_col/100.0))) + Int(g2 * (alpha_col/100.0))
b_dest% = Int(b1 * (1.0-(alpha_col/100.0))) + Int(b2 * (alpha_col/100.0))
rgb3 = a_dest * $1000000 + r_dest * $10000 + g_dest * $100 + b_dest
WritePixelFast tx%+x%,ty%+y%,rgb3,dest_buffer
End If
Next
Next
UnlockBuffer source_buffer1
UnlockBuffer source_buffer2
UnlockBuffer dest_buffer
DrawImageWithAlpha = 1
Else
DrawImageWithAlpha = -1
End If
End Function[/code:1:3b924ff862]

Für Fragen und Anregungen stehe ich Euch gerne zur Verfügung.

Viele Grüße
Christian



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: