I wonder if someone could just take a moment to explain the argb format used by the WritePixel command to me. I've looked at other people's code and it appears that (for example) the value -16777216 corresponds to black and the value -65536 is red, but I'm a little baffled about how one arrives at these values from the more familiar r(0-255),g(0-255),b(0-255).
WritePixel argb format
Blitz3D Forums/Blitz3D Programming/WritePixel argb format The 32 bit integer used by write/read pixel uses:
The first 8bits to represent the RED component of a colour, the next 8bits to represent the GREEN component of a colour, the next 8 bits to represent the Blue componet and the top 8 bits to represent the alpha component (this is ignored in normal 2D operations and is always set to 255)
To make it clearer:
%11111111100000001000000010000000 - Binary
$FF808080 - Hex
4286611584 - Decimal (-8355712 in Blitz cos it uses signed integers)
In your example above, you can now see that -65536 is $FFFF000 (use Print Hex$(-65536)).
This is indeed pure red with full alpha (Blitz will return always full alpha from a readpixel command [edit]for 2D stuff[/edit]).
Probably as clear as mud...But I tried ;o)
[edit]
The above assumes a 32bit screen mode. Things get really 'interesting' for 16bit modes...
http://www.blitzbasic.com/Community/posts.php?topic=31316
[/edit]
YAN
The first 8bits to represent the RED component of a colour, the next 8bits to represent the GREEN component of a colour, the next 8 bits to represent the Blue componet and the top 8 bits to represent the alpha component (this is ignored in normal 2D operations and is always set to 255)
To make it clearer:
[ A ] [ R ] [ G ] [ B ] %00000000 00000000 00000000 00000000 - Binary A R G B $00 00 00 00 - HexTherefore, if I had a pixel who's RED, BLUE and GREEN components were each set to 128 (mid grey) the integer would look like this:
%11111111100000001000000010000000 - Binary
$FF808080 - Hex
4286611584 - Decimal (-8355712 in Blitz cos it uses signed integers)
In your example above, you can now see that -65536 is $FFFF000 (use Print Hex$(-65536)).
This is indeed pure red with full alpha (Blitz will return always full alpha from a readpixel command [edit]for 2D stuff[/edit]).
Probably as clear as mud...But I tried ;o)
[edit]
The above assumes a 32bit screen mode. Things get really 'interesting' for 16bit modes...
http://www.blitzbasic.com/Community/posts.php?topic=31316
[/edit]
YAN
I'm pretty sure it has to do with the "Shr" command. I'll go look that up...
IT's basically,
rgb = blue or (green shl 8) or (red shl 16)
and to reverse the process(I.e decode the rgb)
red = (rgb shr 16) and 255
green = (rgb shr 8) and 255
blue = (rgb and 255)
-
rgb = blue or (green shl 8) or (red shl 16)
and to reverse the process(I.e decode the rgb)
red = (rgb shr 16) and 255
green = (rgb shr 8) and 255
blue = (rgb and 255)
-
LOL...I got so carried away with explaining the format, I forgot about showing you how to extract the RGB components. :o)
Just for the sake of completeness.
You can get the RGB value from the ReadPixel command with...
YAN
Just for the sake of completeness.
You can get the RGB value from the ReadPixel command with...
RGB = ReadPixel(x, y, buffer) And $FFFFFF(then red would just be red = RGB Shr 16)
YAN
Thankyou all. I understand *most* of that. Just a couple of questions:
-Forgive my ignorance Yan, but what are signed integers? I was with you right up until that point :)
-I can work with the hexadecimal colour format, no problem. But how do I convert from Hex to 32-bit integer using Blitz? In other words I kind of need the opposite of 'Hex$(integer)'.
Thanks for your patience. I struggle a bit with this low-level stuff.
EDIT: Okay, got it - thankyou again. :)
-Forgive my ignorance Yan, but what are signed integers? I was with you right up until that point :)
-I can work with the hexadecimal colour format, no problem. But how do I convert from Hex to 32-bit integer using Blitz? In other words I kind of need the opposite of 'Hex$(integer)'.
Thanks for your patience. I struggle a bit with this low-level stuff.
EDIT: Okay, got it - thankyou again. :)
So If you read a pixel from the buffer of a texture that has alpha in it (.TGA), Blitz will not return the alpha portion?
GW: As far as the tests I've done go, that's incorrect. It will return the alpha of the texture. Try this, it modifies the alpha of a texture.
graphics3d 800,600,32,2 ;include "h_vein.bb" C = CreateCamera() T = CreateTexture(64,64,1+2+16+32+256) T2 = CreateTexture(128,128,1+2+16+32+256) T3 = CreateTexture(256,256,1+2+16+32+256) For X = 0 To 63 For Y = 0 To 63 WritePixel x,y,intcolor(rand(255),rand(255),rand(255),255),TextureBuffer(T) next next CameraClsColor C,64,64,64 PositionEntity C,0,0,-8 S = CreateSprite() s1 = createsprite() moveentity s1,-2,0,0 s2=createsprite() moveentity s2,2,0,0 EntityTexture S,T,0,0 EntityTexture S1,T2,0,0 EntityTexture S2,T3,0,0 global fps,timenext,frames time = millisecs() entityblend s,1 Repeat a# = a# + .25 if a > 360 then a = a - 360 if frames mod 2 = 0 then lockbuffer texturebuffer(t) For Y = 0 To 63 colorb = readpixelfast(X,Y,TextureBuffer(T)) Colora = IntColor(Rand(255),Rand(255),Rand(255),Min(Max(Abs Cos(A)*255,Max(Y*4,255)),0)) For X = 0 To 63 WritePixelFast X,Y,Colora,TextureBuffer(T) Next Next unlockbuffer texturebuffer(t) lockbuffer texturebuffer(t2) For Y = 0 To 127 Colora = IntColor(Rand(255),Rand(255),Rand(255),Min(Max(Abs Cos(A)*255,Max(Y*4,255)),0)) For X = 0 To 127 WritePixelfast X,Y,Colora,TextureBuffer(T2) Next Next unlockbuffer texturebuffer(t2) endif ;positiontexture t,-.5,.5 ;rotatetexture t,a UpdateWorld RenderWorld Text 2,2,GetFPS(False) Flip False Until Keyhit(1) clearworld Function GetFPS(JustChecking = False) If Not JustChecking Then frames = frames+1 If MilliSecs() > timenext Then timenext = MilliSecs()+1000 fps = frames frames = 0 EndIf Return fps End Function ; IntColor returns an integer color useable by WritePixel() and WritePixelFast() ; R = Red ; G = Green ; B = Blue ; A = Alpha. ; return = An integer color useable by functions such as WritePixel() and WritePixelFast() Function IntColor(R,G,B,A=255) Return A Shl 24 Or R Shl 16 Or G Shl 8 Or B Shl 0 End Function ; RColor returns the value of Red, Green, Blue, or Alpha in C. ; c = An integer color returned by, for example, ReadPixelFast() ; c = The amount of bits C should be shifted right to. Valid constants are: RRED, RGREEN, RBLUE, RALPHA ; return = An integer ranging from 0 to 255. Function RColor%(c%,d%) Return c Shr d And 255 Shl 0 End Function Const RALPHA = 24 ;Return Alpha when using RColor Const RRED = 16 ;Return Red when using RColor Const RGREEN = 8 ;Return Green when using RColor Const RBLUE = 0 ;Return Blue when using RColor ; Calculates the minimum of two variables. ; V = The variable that you are modifying. ; M = The lowest the variable you are modifying can go. ; return = V if it is larger than M, otherwise M. Function Min#(V#,M#) If V# < M# Then Return M# Else Return V# EndIf End Function ; Calculates the maximum of two variables. ; V = The variable that you are modifying. ; M = The greatest the variable you are modifying can go. ; return = V if it is smaller than M, otherwise M. Function Max#(V#,M#) If V# > M# Then Return M# Else Return V# EndIf End Function
I did say...
Admittedly the last bit was misleading and I've now edited to make it read as intended.
[Feeble Excuse No 25678]
I came in via Active Topics and didn't realise this was the 3D forum. As the write/readpixel commands are generally 2D questions, it didn't occur to me to make the 2D / 3D distinction clear.
[/Feeble Excuse No 25678]
YAN
this is ignored in normal 2D operations and is always set to 255
I meant things like this...Graphics3D 800, 600, 0, 2 Text 0, 0, Hex$(ReadPixel(400,300)) WritePixel(400, 300, $00FFFFFF) Text 0, 12, Hex$(ReadPixel(400, 300)) Flip WaitKey() EndAccessing the texture buffer is obviously 3D and will return a valid alpha value.
Admittedly the last bit was misleading and I've now edited to make it read as intended.
[Feeble Excuse No 25678]
I came in via Active Topics and didn't realise this was the 3D forum. As the write/readpixel commands are generally 2D questions, it didn't occur to me to make the 2D / 3D distinction clear.
[/Feeble Excuse No 25678]
YAN
thanks Noel. ;-)
Hmm...I knew there was a reason I don't post much!
YAN
YAN
[Feeble Excuse No 25678]
You're off by about 40,000 ;)
-14322 ??
;o)
YAN
;o)
YAN
Yep, you're overdue ^_^