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 |