I did a seach in my code folder and found some code from Jon he wrote a long time ago. It uses glDrawPixels and an array buffer to store the pixels of the screen. Its fairly quick for pixelwise manipulation, so it might be a technique you can use. I am fairly certain that he posted this back on the old forum, so I am thinking that he don't mind me posting it here again. I made a small example of how its used.
Global screen:Int[640*480]
Global timer:Int = MilliSecs()
Global FPS_Real:Int = 0
Global FPS_Cnt:Int = 0
Global FPS_Check:Int = MilliSecs()+1000
ptc_open("Test",640,480,0,60)
While Not KeyHit(KEY_ESCAPE)
ptc_update(screen)
FPS_Cnt :+ 1
If MilliSecs() > FPS_Check Then
FPS_Check = MilliSecs()+1000
FPS_Real = FPS_Cnt
FPS_Cnt = 0
End If
If MilliSecs() > timer+50 Then
timer = MilliSecs()
randomStuff(screen)
End If
If KeyHit(KEY_SPACE) Then Print FPS_Real
Wend
ptc_close()
Function randomStuff(screenBuffer:Int[] Var)
For Local y:Int = 0 To 479
Local yoff:Int = y * 640
For Local x:Int = 0 To 639
screenBuffer[yoff+x] = (255 Shr 24)+((x/3) Shl 8)+(y/2)
Next
Next
End Function
'-----------------------------------------------------------------------------------------------------
'
' OpenGL Frame Buffer Lib By Joncom2000 of The Tin Dragons
'
' Based on code by Jim Shaw & Rbaz, Inspired by TinyPTC by Gaffer.
'
'-----------------------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------------
' Globals used by the lib to store screen size
'----------------------------------------------------------------------------------------------
Global g_w:Int
Global g_h:Int
'-----------------------------------------------------------------------------------------------------
' Place Functions after this
'-----------------------------------------------------------------------------------------------------
'------------------------------------------------------------------------
' NAME : ptc_open()
' PURPOSE : This function opens the display
' INPUTS : Title, width and height for screen Also hertz
' RETURNS : nothing
' NOTES : N/A
'------------------------------------------------------------------------
Function ptc_open(Title$,width=640,height=480,Depth=32,Hertz=60)
'Set globals
g_w=width
g_h=height
'open screen
GLGraphics(g_w,g_h,Depth,Hertz,GRAPHICS_BACKBUFFER)
AppTitle$=Title$
glViewport(0, 0, g_w,g_h)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0,g_w,g_h,0,0,1)
glPixelZoom(1,-1)
glRasterPos2i(0,0)
End Function
'------------------------------------------------------------------------
' NAME : ptc_update()
' PURPOSE : This function updates the display
' INPUTS : pixel buffer pointer
' RETURNS : nothing
' NOTES : N/A
'------------------------------------------------------------------------
Function ptc_update(pBuffer:Byte Ptr)
glDrawPixels(g_w,g_h,GL_BGRA_EXT,GL_UNSIGNED_BYTE,pBuffer)
Flip False
End Function
'------------------------------------------------------------------------
' NAME : ptc_close()
' PURPOSE : This function closes the display
' INPUTS : none
' RETURNS : update
' NOTES : N/A
'------------------------------------------------------------------------
Function ptc_close()
' Doesnt seem needed but I might add cleanup code at some point if needed
End Function