BACKBUFFER ACCESS (MAX2d)

BlitzMax Forums/BlitzMax Programming/BACKBUFFER ACCESS (MAX2d)

Hi,
I'm curious about how to access to the backbuffer in BlitzMax+Max2d before we call the FLIP command.

I'm interested in implementig effect on the backbuffer drawings.

Anyone has tryed yet?

Any sample?

Thx

These functions are already in Bmax but are called something else - LOL and they are not very well documented.

GrabPixmap - Grabs pixels directly from the backbuffer
DrawPixmap - Draws pixeld directly to the backbuffer

You can't draw a portion of an image to the buffer YET, but It would be simple to write a method to do that.

Thx Indie,
that's right what I was looking for.

For filters programming I mostly need per-pixel manipulation.

Thx again.

No problem, now please someone help me with Vertex Buffers.

Is it possible to get a pointer to the back buffer like in purebasic?

Yes it is.

Um. Ok, how?

have a delve into the directx modules. If you have a look at the commands I mentioned earlier they are using a pointer to the back buffer to get and send information.

Does it work with OpenGL?

good question.

I don't think you need it in openGl since you just need to read and write pixels, here's the BlitzMax Code :
Method DrawPixmap( p:TPixmap,x,y )
		Local blend=state_blend
		DisableTex
		SetBlend SOLIDBLEND
		
		Local t:TPixmap=YFlipPixmap(p)
		If t.format<>PF_RGBA8888 t=ConvertPixmap( t,PF_RGBA8888 )
		glRasterPos2i 0,0
		glBitmap 0,0,0,0,x,-y-t.height,Null
		glDrawPixels t.width,t.height,GL_RGBA,GL_UNSIGNED_BYTE,t.pixels
		
		SetBlend blend
	End Method

	Method GrabPixmap:TPixmap( x,y,w,h )
		Local blend=state_blend
		SetBlend SOLIDBLEND
	
		Local p:TPixmap=CreatePixmap( w,h,PF_RGBA8888 )
		glReadPixels x,graphics_height-h-y,w,h,GL_RGBA,GL_UNSIGNED_BYTE,p.pixels
		p=YFlipPixmap(p)

		SetBlend blend
		Return p
	End Method
	


It is possible to add screen effect like blur or glow ? i have try but ...

I suppose you could grab the backbuffer and apply that to a quad using the GRabImage function, then do some nice stuff with that image like creating some mipmapps and displaying those full screen - like a quick and dirty blur.

I wonder if GrabImage keeps the stuff in video memory? that would be nice and quick if it did.

How do you GrabImage/GrabPixMap if the image is drawn off screen? This would be helpful for a realtime grab without the need to Cls.

GrabPixMap grabs from the backbuffer. GrabIMages uses this function also but puts the pixmap that is returned by this function into a texture.

Method GrabPixmap:TPixmap( x,y,width,height )
		If islost Return
		Local pixmap:TPixmap
		pixmap=TPixmap.Create(width,height,PF_BGR888)
		Local sdesc:DDSurfaceDesc2=New DDSurfaceDesc2
		sdesc.dwSize=SizeOf(sdesc)
		Local res=PrimaryDevice.backbuffer.Lock(Null,sdesc,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY,Null)
		If res<>DD_OK Return	
		Select sdesc.ddpf_BitCount
		Case 16
			Local s16:Short Ptr=Short Ptr(sdesc.lpSurface+y*sdesc.lPitch+x*2)
			Local d8:Byte Ptr=pixmap.pixels
			For Local i=0 Until height
				For Local j=0 Until width
					Local p=s16[j]
					d8[0]=p Shl 3
					d8[1]=(p Shr 5) Shl 2
					d8[2]=(p Shr 11) Shl 3
					d8:+3
				Next
				d8:+(pixmap.pitch-pixmap.width*3)
				s16:+sdesc.lPitch/2
			Next		
		Case 24
			Local s8:Byte Ptr=sdesc.lpSurface+y*sdesc.lPitch+x*4
			Local d8:Byte Ptr=pixmap.pixels
			For Local i=0 Until height
				memcpy_ d8,s8,pixmap.width*3
				s8:+pixmap.pitch
				d8:+sdesc.lPitch
			Next		
		Case 32
			Local s8:Byte Ptr=sdesc.lpSurface+y*sdesc.lPitch+x*4
			Local d8:Byte Ptr=pixmap.pixels
			For Local i=0 Until height
				For Local j=0 Until width
					d8[0]=s8[0]
					d8[1]=s8[1]
					d8[2]=s8[2]
					d8:+3
					s8:+4
				Next
				d8:+(pixmap.pitch-width*3)
				s8:+sdesc.lPitch-width*4
			Next		
		End Select
		PrimaryDevice.backbuffer.Unlock Null	
		Return pixmap	
	End Method

End Type