Делаю
| Код | {$APPTYPE CONSOLE} program screenshot;
type GLint = Integer; GLenum = Cardinal; GLubyte = Byte; GLsizei = Integer;
PGLint = ^GLint;
const GL_FRONT = $0404; GL_PACK_ALIGNMENT = $0D05; GL_READ_BUFFER = $0C02; GLUT_WINDOW_WIDTH = 102; GLUT_WINDOW_HEIGHT = 103; GL_RGB = $1907; GL_UNSIGNED_BYTE = $1401;
Procedure glGetIntegerv(pname: GLenum; params: PGLint); stdcall; external 'OPENGL32.DLL'; Procedure glReadBuffer(mode: GLenum); stdcall; external 'OPENGL32.DLL'; Procedure glPixelStorei(pname: GLenum; param: GLint); stdcall; external 'OPENGL32.DLL'; Procedure glReadPixels(x: GLint; y: GLint; width: GLsizei; height: GLsizei; format: GLenum; atype: GLenum; ppixels: Pointer); stdcall; external 'OPENGL32.DLL'; function glutGet(gltype: GLenum):integer; stdcall; external 'GLUT32.DLL';
var oldbuffer:PGLint; oldalignment:PGLint;
procedure ScreenShotToFile(fname:string); var fp:file; ww:integer; wh:integer; npixels:integer; pixels:array of GLubyte; p:pointer; begin
// Save the read buffer state. glGetIntegerv( GL_READ_BUFFER, oldbuffer ); glReadBuffer( GL_FRONT );
// Save the alignment state. glGetIntegerv( GL_PACK_ALIGNMENT, oldalignment ); glPixelStorei( GL_PACK_ALIGNMENT, 1); |
ww := glutGet( GLenum ( GLUT_WINDOW_WIDTH ) ); wh := glutGet( GLenum ( GLUT_WINDOW_HEIGHT ) ); | Код | npixels:=ww*wh; setlength(pixels,length(pixels)+npixels*3);
// Restore the GL state. glPixelStorei( GL_PACK_ALIGNMENT, oldalignment^ ); glReadBuffer( oldbuffer^ ); end;
begin ScreenShotToFile('scr.bin'); end. |
В красном месте ошибка о чтении памяти. В чем дело? Как пофиксить? |