Transparency in 2D

Blitz3D Forums/Blitz3D Programming/Transparency in 2D

Almo(Posted 2004) [#1]
Hey!

I'm doing another game in 2d, and this time we want a circle where everything is full-bright, and everything outside it is half-bright. Is there a simple way to overlay a sprite with transparency, or do I gotta copy black 128-alpha pixels all over the outside part?


jfk EO-11110(Posted 2004) [#2]
Yes, of course, you can use a Sprite IF you are in 3D Graphic Mode. use a TGA and define the circles transparency in the alpha channel, then use the alpha mode for the sprite.

Set the cameraclsmode to Not delete the background
position the sprite in front of the camera and paretn it to the camera.

In the loop:

Draw all 2D stuff
renderworld
flip

and since you are working with it, you can also add some nice explosions using sprites :) - if you want.


Almo(Posted 2004) [#3]
I may do that. In the mean time, I have a question about writepixel and alpha:

SetBuffer(FrontBuffer())
Color 255, 255, 255
Rect 0, 0, 639, 479

imbuf = ImageBuffer(image)

For x = 0 To 639
	For y = 0 To 479
		pix = ReadPixel(x, y, imbuf)
		If ((pix And $00ffffff)) = 0 Then
			WritePixel(x, y, $80000000)
		EndIf
	Next
Next


image has black and white pixels in it. This code draws black to the front buffer wherever there are pixels that are black in the image.

But I thought the "80" part of the writepixel command meant alpha of 50%, and should yield a grey pixel.

What's going on?


jfk EO-11110(Posted 2004) [#4]
the alpha-byte works only with textures. and even there only when you have the alpha-flag set (2).

If you really want to darken a pixel to half its brightness, you could:

ibuffer=imagebuffer(image)
fbuffer=frontbuffer()
lockbuffer ibuffer
lockbuffer fbuffer
for y=0 to 479
  for x=0 to 639
    mask=readpixelfast(x,y,ibuffer) and $FFFFFF
    if mask=0
      rgb=readpixelfast(x,y,fbuffer) and $FEFEFE
      writepixelfast x,y rgb shr 1,fbuffer
    endif
  next
next
unlockbuffer ibuffer
unlockbuffer fbuffer



Almo(Posted 2004) [#5]
Got it. Thanks a bunch for the help.


Almo(Posted 2004) [#6]
Got another question:

Graphics3D 640, 480, 16, 1

thesprite = LoadSprite("Gfx/Torch1.tga", 3)
thecamera = CreateCamera()
thetimer = CreateTimer(60)

CameraClsMode(thecamera, False, False)

MoveEntity(thecamera, 0, 0, 0)
AlignToVector(thecamera, 0, 1, 0, 2)
AlignToVector(thecamera, 0, 0, 1, 3)

MoveEntity(thesprite, 0, 0, 1)
SpriteViewMode(thesprite, 3)

Color 255, 255, 255

While Not KeyHit(1)
	SetBuffer(BackBuffer())
	Rect 0, 0, 640, 480
	
	RenderWorld
	Flip
	WaitTimer(thetimer)
Wend

Stop


This is working, almost. The sprite is rendering with odd bitmap garbage on it. It's a 640x480 texture... is that too big?


jfk EO-11110(Posted 2004) [#7]
640*480 is a bad texture size, use power-of-2 sizes: 32,64,128,512,1024 etc.

So you could externally resize your Sprite Texture to 512*512 and then scale the sprite in Blitz to fit the screen. I don't know, maybe that's the reason why you've got that garbage onscreen.


Almo(Posted 2004) [#8]
Okay, tried a 64x64 texture, still getting the garbage... Like 75% of the image is correct, but there are lines and stripes in it...


Almo(Posted 2004) [#9]
Hey jfk... could I mail you my example? It's pretty small...


Almo(Posted 2004) [#10]
Got it sorted. From above:

CameraClsMode(thecamera, False, False)


Note the second False... was setting it not to clear the z-buffer. D'oh.


Odds On(Posted 2004) [#11]
Out of interest... is using WritePixel/ReadPixel to write to the frontbuffer fast enough for you?


Almo(Posted 2004) [#12]
It took a long time to loop through all the pixels doing that. Certainly couldn't be done on a frame by frame basis.