Textur mit alpha kanal zeichnen.

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

AnniXa

Betreff: Textur mit alpha kanal zeichnen.

BeitragMo, Feb 02, 2009 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
gibt es eine möglichkeit eine textur mit beachtung des alpha kanals zu zeichnen?
ich möchte eine textur im buffer aus mehreren zusammensetzen bzw übereinander blenden.
dazu nützt mir draw3d leider nichts Sad
viele codeschnipsel hier im forum können nur 50% transparentz etc,
ich möchte aber den alpha kanal komplett berücksichtigt haben,
also 0-255.

es muss NICHT in echtzeit passieren, das ist mir egal.

gibt es diese möglichkeit?

wenn es keine gibt werde ich mir selber eine basteln müssen, eine idee hätte ich ja evtl schon, aber das würde sicher ewig dauern das zu schreiben, bzw bis ich das aus meinem hirn herausbekomme :O

Xaymar

ehemals "Cgamer"

BeitragMo, Feb 02, 2009 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du möchstest schreib ich dir einen Texturebuffer merger Smile, btw solche funktionen stehen auch öfters im codearchiv.
Warbseite

AnniXa

BeitragMo, Feb 02, 2009 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
danke!
Shocked
ich such mal nach textur buffer merger :O
vllt gibts das ja schon.

edit:
okay ich habe nochmal etwas genauer gesucht, und für alle die vieleicht später einmal danach suchen:

https://www.blitzforum.de/foru...hp?t=30082

Xaymar

ehemals "Cgamer"

BeitragMo, Feb 02, 2009 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
mal zwei funktionen zum "blenden" der Texturen:
Code: [AUSKLAPPEN]
;Texture Merger

Function MergeTextureAdd(Tex1, Tex2, AChan=0)
   OutT = CreateTexture(TextureWidth(Tex1), TextureHeight(Tex2))
   W1 = TextureWidth(Tex1):W2 = TextureWidth(Tex2)
   H1 = TextureWidth(Tex1):H2 = TextureWidth(Tex2)
   TB1 = TextureBuffer(Tex1):TB2 = TextureBuffer(Tex2):TB3 = TextureBuffer(OutT)
   
   LockBuffer TB1:LockBuffer TB2:LockBuffer TB3
   
   For X1 = 0 To W1
      For Y1 = 0 To H1
         ARGB1 = ReadPixelFast(X1, Y1, TB1)
         ARGB2 = ReadPixelFast(X2, Y2, TB2)
         
         A1 = (ARGB1 And $FF000000) Shr 24
         R1 = (ARGB1 And $FF0000) Shr 16
         G1 = (ARGB1 And $FF00) Shr 8
         B1 = (ARGB1 And $FF)
         A2 = (ARGB2 And $FF000000) Shr 24
         R2 = (ARGB2 And $FF0000) Shr 16
         G2 = (ARGB2 And $FF00) Shr 8
         B2 = (ARGB2 And $FF)
         
         P# = A2 / 255.0
         
         A3 = 255
         If AChan = 1 A3 = Max(A1 + A2 * P#, 255)
         R3 = Max(R1 + R2 * P#, 255)
         G3 = Max(G1 + G2 * P#, 255)
         B3 = Max(B1 + B2 * P#, 255)
         
         ARGB3 = (A3 Shl 24) Or (R3 Shl 16) Or (G3 Shl 8) Or B3
         
         WritePixelFast X1, Y1, ARGB, TB3
         
         Y2 = (Y2 + 1) Mod H2+1
      Next
      X2 = (X2 + 1) Mod W2+1
   Next
   
   UnlockBuffer TB1:UnlockBuffer TB2:UnlockBuffer TB3
   
   Return OutT
End Function

Function MergeTextureMin(Tex1, Tex2, AChan=0)
   OutT = CreateTexture(TextureWidth(Tex1), TextureHeight(Tex2))
   W1 = TextureWidth(Tex1):W2 = TextureWidth(Tex2)
   H1 = TextureWidth(Tex1):H2 = TextureWidth(Tex2)
   TB1 = TextureBuffer(Tex1):TB2 = TextureBuffer(Tex2):TB3 = TextureBuffer(OutT)
   
   LockBuffer TB1:LockBuffer TB2:LockBuffer TB3
   
   For X1 = 0 To W1
      For Y1 = 0 To H1
         ARGB1 = ReadPixelFast(X1, Y1, TB1)
         ARGB2 = ReadPixelFast(X2, Y2, TB2)
         
         A1 = (ARGB1 And $FF000000) Shr 24
         R1 = (ARGB1 And $FF0000) Shr 16
         G1 = (ARGB1 And $FF00) Shr 8
         B1 = (ARGB1 And $FF)
         A2 = (ARGB2 And $FF000000) Shr 24
         R2 = (ARGB2 And $FF0000) Shr 16
         G2 = (ARGB2 And $FF00) Shr 8
         B2 = (ARGB2 And $FF)
         
         P# = A2 / 255.0
         
         A3 = 255
         If AChan = 1 A3 = Min(A1 + A2 * P#, 0)
         R3 = Min(R1 - R2 * P#, 0)
         G3 = Min(G1 - G2 * P#, 0)
         B3 = Min(B1 - B2 * P#, 0)
         
         ARGB3 = (A3 Shl 24) Or (R3 Shl 16) Or (G3 Shl 8) Or B3
         
         WritePixelFast X1, Y1, ARGB, TB3
         
         Y2 = (Y2 + 1) Mod H2+1
      Next
      X2 = (X2 + 1) Mod W2+1
   Next
   
   UnlockBuffer TB1:UnlockBuffer TB2:UnlockBuffer TB3
   
   Return OutT
End Function

Function Max(A,B)
   If A>B Return B
   Return A
End Function

Function Min(A,B)
   If A<B Return B
   Return A
End Function


ungetestet, sollten der logik nach funktionieren
Warbseite

Eingeproggt

BeitragMo, Feb 02, 2009 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, hab ich das richtig verstanden?
Würde dir EntityTexture helfen? Also dass du mehrere Texturen übereinander legst?
Eventuell auch in Verbinung mit TextureBlend und dem Modus bei LoadTexture.

Ich sags gleich: Hab ich noch nie gemacht, aber mein Gefühl sagt mir dass es so einfacher geht als es sich selbst zu schreiben.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

AnniXa

BeitragMo, Feb 02, 2009 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
danke ihr beiden
ja eigentlich wäre es mit EntityTexture wohl leichter, aber die textur ist nicht für ein 3d objekt bestimmt, eher möchte ich darin informationen speichern.

danke cgamer
ich schaue mir deine auch mal an =)

Tankbuster

BeitragMo, Feb 02, 2009 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du Informationen speichern willst, warum nimmst du dann dafür Texturen? o.0

Es ist doch total umständlich erstmal eine Information auf eine Textur zu bekommen, und die dann später wieder richtig auszulesen.

Also ich finde, da könnte man gleich Array (Dimfeld) benutzen. Wäre viel praktischer. Wink
Twitter
Download Jewel Snake!
Windows|Android

AnniXa

BeitragDi, Feb 03, 2009 0:16
Antworten mit Zitat
Benutzer-Profile anzeigen
eigentlich wäre es wohl wirklich klüger,
aber als grafik kann ich es speichern und besser auswerten Smile
bzw anzeigen lassen.

es handelt sich um höhen informationen für ein b3d terrain.
also unterm strich möchte ich mehrere bilder mit hügeln und so weiter zufällig auf eine schwarze fläche pappen.
 

da_poller

BeitragDi, Feb 03, 2009 17:01
Antworten mit Zitat
Benutzer-Profile anzeigen
gibt es dazu nicht die möglcihkeit heigthmaps zu verwenden? Laughing

Tankbuster

BeitragDi, Feb 03, 2009 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
@da_poller:

Sie will während des Programmablaufes eine Hightmap aus vorher bereitgestellten teilen zufällig erzeugen. So habe ich das jetzt auf jedenfall verstanden.

@Anni:
Wenn du es mit Arrays machst, geht das auch Wink




_______[ERSTELLEN EINER ZUFÄLLIGEN MAP MIT ARRAYS]___________
Nehmen wir an, deine Hightmap besteht aus 128x128 "Feldern"
in jedem von diesen Feldern ist eine Höhe gespeichert.

Du kannst die Terrainhöhe mit ModifyTerrain jederzeit bearbeiten. Also kannst du für alle 128x128 Punkte der Map die Höhe bestimmen.

Wenn du jetzt eine zufällige Map erzeugen willst, reicht es, einfach die Höhe jedes Feldes neu zu errechnen. Dazu ein kleiner Tipp:
-Du lässt zufällig einigen Feldern eine zufällige Höhe zuweisen. Die Felder, die in der Nähe liegen, passen sich der Höhe sanft an, sodass schöne Berge entstehen. Natürlich musst du drauf achten, dass die Felder, denen eine Höhe zugewiesen wird, nicht zunah aneinander liegen, denn sonst könnte es sehr steile Wände geben, wenn sich eine maximale Höhe direkt neben einer minimalen Höhe befindet.

Ich persönlich würde eine zufällig generierte Map besser finden, als eine, die immer aus den selben Teilen besteht. Denn sonst sehen die Hügel vielleicht immer gleich aus, wenn du verstehst Wink

_______[SPEICHERN]___________
Wenn du die Map speichern willst, speicherst du sie nicht als Bild ab, sondern erstellst dein eigenes Dateiformat, das nur die Höhenwerte der einzelnen Felder enthält. Das hat nicht nur den Vorteil, dass jeder Leihe die Map nicht einfach mit Paint verändern kann, sondern man lernt dadurch sicher auch ein bisschen, was man später in Blitz immerwieder benötigt Wink

Dafür gibt es die Befehle wie WriteFile,OpenFile,ReadFile,ect (zum Speichern der Höhenwertewürde ich nicht "WriteInt" sondern "WriteShort" verwenden Wink )

Das könnte zum Beispiel für eine Kleine Map so aussehen:
Zitat:

0000000000000
0000100111000
1001211121100
2100101232100
3210000121100
4321000111000


Das laden so einer Map funktioniert dann eigentlich genau umgekehrt. Du ließt aus der gespeicherten Datei die Werte wieder aus, und modifizierst dementsprechend das Terrain Wink


Du kannst das zufällig erzeugte Terrain direkt nach oder während des Erstellens betrachten, und kannst nach belieben die Werte in einen ImageBuffer schreiben, und per Savebuffer auchnoch die Hightmap als .bmp speichern, wenn du das willst Wink



PS: Bei Fragen, bitte offen sein und fragen ^-^
Twitter
Download Jewel Snake!
Windows|Android

Jan_

Ehemaliger Admin

BeitragDi, Feb 03, 2009 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Falls deine Frage noch nicht komplett beantwortet ist, sage doch einmal, was du erreichen willst.
Habe es noch nicht richtig verstanden
between angels and insects

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group