In Textur schreiben, aber mit transparentem Hintergrund

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Omenaton_2

Betreff: In Textur schreiben, aber mit transparentem Hintergrund

BeitragSo, Mai 20, 2007 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo !

Eine Sache will einfach nicht funktionieren wie ich zu erst gedacht habe, daß es sollte.

Ich arbeite an einem 3D Weltraum Rollenspiel Prototypen ähnlich wie World of Warcraft, aber als single player Spiel.

Ich bin gerade dabei, über dem "Kopf" eines beschossenen Gegners (in diesem Fall bloß ein lebloser Asteroid) den verursachten Schaden als große Zahl anzeigen und kurz nach oben scrollen lassen.

Das möchte ich so machen, daß ich einen Sprite direkt über dem Zielobjekt erschaffe (das funktioniert schon) und die Zahl wird mit Hilfe des TextureBuffers in die Textur, die der Sprite beim Erschaffen zugewiesen worden ist hineinkopiert.
Ich male nicht direkt in die TextureBuffer, sondern in die linke obere Ecke des Bildschirmes in BackBuffer male ich einen schwarzen Hintergrund und gebe dort die Zahl mit Rot aus. Dann kopiere ich diesen Block mit CopyRect in die TextureBuffer.

Das alles funktioniert auch.
Das Problem kommt erst, wenn ich versuche zu erreichen, daß der schwarze Hintergund des quadartischen Sprites transparent wird, so daß nur die rote Zahl zu sehen ist, ohne den schwarzen Rechteck.

Ich wollte das mit Transparency Flag setzen bei Erschaffen der Textur für den Sprite machen so:
gfxLeererQuad128 = CreateTexture(128,128,4)

Wenn ich die Flag 4 einsetze, dann wird der Sprite komplett durchsichtig und damit die rote Zahl auch. Nichts ist zu sehen. Ich vermute, es liegt daran, daß Flag 4 natürlich eine Alpha Maske haben will und die Textur an sich hat keine extra Alpha Channel, wie ein 32 Bit TGA Bild das hätte. Aber in der offiziellen Beschreibung des Befehls CreateTexture steht, daß bei Modus 4 die Bereiche der Textur, die Schwarz (0,0,0) sind, nicht gezeichnet werden. Und der Sprite wird tatsächlich nicht gezeichnet, ist transparent. Aber warum wird meine rote Zahl auch transparent gemacht, obwohl wo die Zahl ist, sollte die Textur nicht Schwarz sein ?

Ich habe es auch mit Alpfha Flag (Modus 2) probiert, das wäre natürlihc nicht sehr gut, weil ich Maskierung und keine Alpha brauche (weil ich auch noch einen dunklen Rahmen um die Zahl haben möchte, damit es auch vor hellen Hintergründen gut zu erkennen ist), aber auch mit Modus 2 geht es nicht.

Als Beispiel könnt ihr euch den kurzen Beispiel Code aus dem Online Hilfe von BB bei der Beschreibung des Befehls "TextureBuffer" anschauen.
Das geht. Aber wenn ich will, daß der Würfel (bei mir Sprite) komplett transparent wird, nur die Zahl zu sehen ist, das bekomme ich nicht hin.
Weiß jemand Rat ?

Gibt es eine Möglichkeit, einer Textur nachträglich eine echte Alpha Maske wie das bei einem 32 Bit TGA Bild ist (extra Kanal) zuzuweisen ?
(Es muß eine sein, die keine vorgeladene Grafik ist, sondern "live" erstellte wird.)



P.S.: In 2D (Image stat Textur) ist das alles einfach, habe es schon früher gemacht. Da kann ich einfach eine beliebige Farbe mit "MaskImage" angeben dann so die Transparenz bestimmen.
Was ich eigentlich bräuchte wäre ein "MaskTexture" Befehl.
 

Matthias

BeitragSo, Mai 20, 2007 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay. Ich kenne dieses Problem. Ich würde dir raten die Einzelnen Ziffern sowieso als TextureAnimation zu laden denn das geht nicht so auf die CPU leistung. Aber drozdem hier der Code.

Code: [AUSKLAPPEN]

Graphics3D 800,600,32,2



DumiImg=CreateImage(64,64)
Cam=CreateCamera():Lis=CreateLight():TurnEntity Lis,45,45,0
CameraClsColor Cam,0,0,255
MoveEntity Cam,0,0,-5
Cube=CreateCube()
CubeTex=CreateTexture(64,64,4)

EntityTexture Cube,CubeTex,0,0



SetBuffer ImageBuffer(DumiImg)
Color 255,0,0
Text 10,10,"532"



CopyTransRect(DumiImg,CubeTex)

 

SetBuffer BackBuffer()
Repeat:

RenderWorld

Flip:Until KeyDown(1)=1:End



Function CopyTransRect(A,B)
ImgBuffID=ImageBuffer(A):TexBuffID=TextureBuffer(B)
TexW=TextureWidth(B)-1:LockBuffer ImgBuffID
LockBuffer TexBuffID:For X=0 To TexW:For Y=0 To TexW

rgb=ReadPixelFast(X,Y,ImgBuffID)

Select rgb:Case -16777216:a=0:Default:a=255:End Select
r=(rgb And $FF0000)/$10000
g=(rgb And $FF00)/$100:b=rgb And $FF

WritePixelFast x,y,a*$1000000+r*$10000+g*$100+b,TexBuffID

Next:Next
UnlockBuffer TexBuffID:UnlockBuffer ImgBuffID
End Function


Du kannst auch diese Zeile
CubeTex=CreateTexture(64,64,4)
ändern in CubeTex=CreateTexture(64,64,260)CubeTex=CreateTexture(64,64,4)

dann gehts etwas schneller. Aber es vebraucht dann GFX Speicher anstatt Ram Speicher.
Mfg Matthias
 

Omenaton_2

BeitragDi, Mai 22, 2007 9:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe den Schusszahl-Effekt mit einer anderen Methode fertig gemacht.
Ich habe extra Zeichensatz(nur die Ziffern) erstellt und die bestehen aus 32 Bit TGA Bildern mit Alfa Kanal.
Das funktioniert perfekt und sieht vermutlich besser aus, als wenn ich einfach nur in die Textur hineingeschrieben hätte. Es dürfte so auch schneller sein.

Danke für den Tipp für einen Lösungsweg !

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group