こんにちわ。ビデオメモリからメインメモリに転送する必要があるので結構難しそうな気がします。
一例ですが、pgetの代わりとして裏技的に直接OpenGlの関数を呼び出すサンプルです。
(GL版のみ)
#include "hgimg4.as"
#uselib "opengl32.dll"
#define GL_RGBA 0x1908
#define GL_UNSIGNED_BYTE 0x1401
#func global glReadPixels "glReadPixels" int, int, int, int, int, int, var
gpreset
wx = 512 : wy = 512
screen 0, wx,wy
buffer 1, wx, wy, screen_offscreen
sdim col, wx*wy*4
repeat
; オフスクリーン
gsel 1
redraw 0
gradf 0,0,wx,wy, 1, $ff0000, $00ff00
color : line wx/2,0,wx/2,wy : line 0,wy/2,wx,wy/2
redraw 1
; openGL限定、現在バインドされているテクスチャから読みだすので
; 直後に読みだす事(gselでバインドされているっぽい)
glReadPixels 0,0,wx,wy, GL_RGBA, GL_UNSIGNED_BYTE, col
; pget的な部分(αも取れる)
if mx >= 0 & mx < wx & my >= 0 & my < wy {
idx = (mx+(wy-1-my)*wx)*4
r = peek(col, idx+0)
g = peek(col, idx+1)
b = peek(col, idx+2)
a = peek(col, idx+3)
}
; メイン
gsel 0
mx = mousex : my = mousey
redraw 0
pos 0,0 : celput 1
rgbcolor $FFFFFF : pos 0,0
mes strf("Mouse: %d,%d",mx, my), 4
mes strf("Color: %d,%d,%d,%d",r,g,b,a), 4
redraw 1
await 1000/60
loop
ビデオ側にあるテクスチャをメインメモリへコピーする処理は比較的重たいと思われますので、
ループの中で複数回呼び出すなど、速度を維持したままリアルタイムで行おうとしたら、
海の場所が決まってれば高さは先に計算したテーブル用意してしまうとか、
頂点が少なければCUP側で計算してしまった方が良いかもしれませんね。
(この例程度ならそこまで問題ないとは思いますが)