WritePixel argb format
Blitz3D Forums/Blitz3D Programming/WritePixel argb format
| ||
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). |
| ||
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: [ 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) - |
| ||
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... 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. :) |
| ||
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... 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 |
| ||
[Feeble Excuse No 25678] You're off by about 40,000 ;) |
| ||
-14322 ?? ;o) YAN |
| ||
Yep, you're overdue ^_^ |
| ||
How to detect the max available argb on the used system ? |
| ||
This thread is - err, WAS - over SEVEN YEARS OLD. Please make a new topic >.> |
| ||
^ that, and GraphicsDepth() |