Sprite mit Tex-Flag 2 wird nicht transparent

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

FireballFlame

Betreff: Sprite mit Tex-Flag 2 wird nicht transparent

BeitragDi, Mai 29, 2007 15:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo! Eigentlich 3D, hab ich mein Problem mal in die Beginners-Corner gepostet, da es eigentlich ziemlich simpel ist ...
Ich möchte für ein Spiel einen Taschenlampen-Effekt programmieren, indem vor die Kamera ein Sprite gesetzt wird, das in der Mitte schwarz und außen weiß ist. Die im Code erstelle Textur hat den Flag 2, damit das dunkle/schwarze transparent ist - aber das funktioniert nicht o.O
Irgendwo muss da ein dummer Fehler sein, aber ich finde ihn nicht -.-

Hier der Code: [AUSKLAPPEN]
res_x=800
res_y=600

Graphics3D res_x,res_y,0,2
SetBuffer BackBuffer()

spielercam=CreateCamera()
CameraClsColor spielercam,0,0,255



taschenlampe=CreateSprite()
For zpothz=1 To 12
   If 2^zpothz>=res_x/2
      tltexgroesse=2^zpothz
      Exit
   End If
Next
tltex=CreateTexture(tltexgroesse,tltexgroesse,2)
SetBuffer TextureBuffer(tltex)
Color 255,255,255
Rect 0,0,tltexgroesse,tltexgroesse,1
For bf=tltexgroesse To 1 Step -1
   ffb=255-(Float((tltexgroesse-bf))/tltexgroesse*200)
   Color ffb,ffb,ffb
   Oval tltexgroesse/2-bf/2,tltexgroesse/2-bf/2,bf,bf,1
Next
SetBuffer BackBuffer()


EntityTexture taschenlampe,tltex

s2d_sprite=taschenlampe
s2d_breite=tltexgroesse*2
s2d_hoehe=tltexgroesse*2
s2d_X_Koord=res_x/2-tltexgroesse*2/2
s2d_Y_Koord=res_y/2-tltexgroesse*2/2

EntityParent s2d_sprite,spielercam
ScaleSprite s2d_sprite,s2d_breite,s2d_hoehe
PositionEntity s2d_sprite,((s2d_X_Koord)*2)-RES_x+s2d_breite,-((s2d_Y_Koord)*2)+RES_y-s2d_hoehe,RES_x,0
EntityOrder s2d_sprite,-9989





While Not KeyHit(1)

RenderWorld
Flip
Wend
End


Wenn es richtig funktionieren würde, müsste die Mitte des Fensters blau sein (wie wenn ihr vor die While-Schleife ein "HideEntity taschenlampe" setzt).
Könnt ihr mir sagen, warum sie das nicht ist?
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Mai 29, 2007 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Du zeichnest mit Color und Oval auf die Textur, wo du doch zur Mitte hin mehr Transparenz haben möchtest. Color hat aber keine Alphaangabe, wo du also lieber auf WritePixel oder WritePixelFast zurück greifen solltest.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

FireballFlame

BeitragDi, Mai 29, 2007 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das stimmt, aber der Tex-Flag 2 macht doch eigentlich, wenn keine Alphainformationen vorhanden sind, die Textur nach Helligkeit transparent? (je dunkler desto transparenter)
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Mai 29, 2007 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin mir nicht sicher, aber ich glaub, das ist nur beim laden so. Dann wird beim laden der Helligkeitswert ermitelt und entsprechend ein Alphawert für jeden Pixel errechnet.^^
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

FireballFlame

BeitragDi, Mai 29, 2007 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich lasse jetzt auf ein Image zeichnen und benutze dann SaveBuffer und LoadSprite.
Ist zwar vllt. nicht die schönste Lösung, aber jedenfalls funktioniert es so - danke!
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Mai 29, 2007 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit SaveBuffer und LoadSprite ist eine 'dreckige' art zu programmieren. Mach das mal lieber gleich richtig mit WritePixel.

Hier der Test- und BeweisCode: [AUSKLAPPEN]
Graphics3D 800,800,0,2

camera=CreateCamera()

RotateEntity CreateLight(),40,40,0

cube=CreateCube()
PositionEntity cube,0,0,3

sprite=CreateSprite()
texture=CreateTexture(256,256,2)

SetBuffer TextureBuffer(texture)
For y=0 To 127
 For x=0 To 127
  a=x*2
  r=y*2
  g=255-x*2
  b=255-y*2
  WritePixel x,y,a*$1000000+r*$10000+g*$100+b
  Color r,g,b
  Rect 128+x,y,1,1,1
  Oval x,128+y,1,1,1
  Plot 128+x,128+y
 Next
Next

EntityTexture sprite,texture
PositionEntity sprite,0,0,1
SetBuffer BackBuffer()




While Not KeyHit(1)
 If KeyDown(57) EntityAlpha sprite,.5 Else EntityAlpha sprite,1
 TurnEntity cube,1,0,0
 RenderWorld
 Flip
Wend
End

- oben/links WritePixel und wie zu erwarten, schön mit Alphawerten.
- oben/rechts Rect ohne Alphaabnahme bei dunklen Stellen.
- unten/links Oval ohne Alphaabnahme bei dunklen Stellen.
- unten/rechts Plot ohne Alphaabnahme bei dunklen Stellen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group