Так-с тоже реши приделать скриншоты следующим образом:
void MakeShot(int dest,int x,int y,int w,int h ){ glBindTexture( GL_TEXTURE_2D, dest); glCopyTexImage2D( GL_TEXTURE_2D,0,GL_RGB,x,y+h,w,h,0); }
Затем следует сливание текстуры в память и сохранение.
ILint w=0,h=0,n=0; glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_WIDTH,&w); glGetTexLevelParameteriv( GL_TEXTURE_2D,0,GL_TEXTURE_HEIGHT,&h); glGetTexLevelParameteriv( GL_TEXTURE_2D,0,GL_TEXTURE_COMPONENTS,&n); ILint bpp=0; if ( n==IL_RGBA||n==IL_BGRA) bpp=4; else if ( n==IL_RGB||n==IL_BGR) bpp=3; else bpp=1; unsigned char* temp=new unsigned char[w*h*bpp]; glGetTexImage( GL_TEXTURE_2D,0,n,GL_UNSIGNED_BYTE,temp);
Вызываю:
MakeShot(dest_tex,0,0,512,512); //где dest_tex предварительно созданная текстура
На выходе получаю мусор:
Спрашивается из-за чего так получается и как сделать правильно?
Через FBO делать не могу, так как видюха Intel.
Ну, так кто-нибудь знает, почему такое может происходить?
MarkoPolo
> glCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGB,x,y+h,w,h,0);
Чот мне кажется, что ты рисуешь верх ногами (y+h). Начало текстуры считается координатами 0;0, этож тебе не окно.
Или хотяб напиши ... x,y+h,w,0,0);
ExeLord
> Чот мне кажется, что ты рисуешь верх ногами (y+h). Начало текстуры считается
> координатами 0;0, этож тебе не окно.
> Или хотяб напиши ... x,y+h,w,0,0);
x, y
The window coordinates of the lower-left corner of the rectangular region of pixels to be copied.
Я понял откуда мусор. Если к от низа отсупить на 512 пикселей, то так как экран в высоту 600 пикселей, получается 424 off-screen пикселя. Вот они и идут в виде мусора.
доброго времени суток,прошу помочь по возможности.Пишу модуль на скрин приложения в режиме опенгл(кс 1.6) , взял за основу написанную выше процедуру,но возникает проблема,что приложение возвращает картинку,на половину черную,на половину белую,вот код процедуры:
procedure screenOpGl(TData:string); var Bmp: Graphics.TBitmap; jpeg: TJpegImage; i, j: integer; screenshot:array of byte; x,z: integer; begin JPEG:=TJPEGImage.Create; Bmp:=TBitmap.Create; bmp.Height:=screen.Height; bmp.Width:=screen.Width; x:=bmp.Width; z:=bmp.Height; {================================================================} glPixelStorei( GL_PACK_ALIGNMENT,4); glPixelStorei( GL_PACK_ROW_LENGTH,0); glPixelStorei( GL_PACK_SKIP_ROWS,0); glPixelStorei( GL_PACK_SKIP_PIXELS,0); {================================================================} setlength( screenshot, x*z*4); glReadBuffer( GL_front); glReadPixels( 0,0,x,z, GL_rgb, GL_UNSIGNED_byte, screenshot); Bmp.PixelFormat:=pf32bit; Bmp.SetSize( x,z); {================================================================} for i:=0 to z-1 do for j:=0 to x-1 do Bmp.Canvas.Pixels[i, j]:=rgb( screenshot[( i*x + j)*4 + 0], screenshot[( i*x + j)*4 + 1], screenshot[( i*x + j)*4 + 2]); {================================================================} JPEG.Assign( bmp); JPEG.CompressionQuality := 20; JPEG.Compress; JPEG.SaveToFile( 'c:\tmp\'+tdata+'.jpg'); JPEG.Free; Bmp.Free; end;
прошу ,кто знает как - поправте меня и если можно объсните в чем именно ошибка
desLamer
Попробуй сохранить отдельно твой bitmap и посмотри такой же результат там как в jpeg. В коде ошибок не нашел. У меня такой же отлично работает. Единственное что я еще вначале устанавливаю glViewPort(0, 0, AWidth, AHeight); и произвожу рендер.
И еще зачем тебе glReadBuffer(GL_front); ?
внимание копипаст =)
сам не пробовал но такой вот исходник есть
void MakeScreenShot() { unsigned char *output = 0; output = new unsigned char[SCREEN_WIDTH * SCREEN_HEIGHT * 3]; glReadPixels( 0,0, SCREEN_WIDTH, SCREEN_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, output); FILE *sFile = 0; unsigned char tgaHeader[12] = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}; unsigned char header[6]; unsigned char bits = 0; int colorMode = 0; unsigned char tempColors = 0; sFile = fopen( "Screen.tga", "wb"); if( !sFile){ MessageBox( NULL, "Can't open ScreenShot File!","Error",MB_OK); return; } colorMode = 3; bits = 24; header[0] = SCREEN_WIDTH % 256; header[1] = SCREEN_WIDTH / 256; header[2] = SCREEN_HEIGHT % 256; header[3] = SCREEN_HEIGHT / 256; header[4] = bits; header[5] = 0; fwrite( tgaHeader, sizeof( tgaHeader), 1, sFile); fwrite( header, sizeof( header), 1, sFile); for( int i=0; i < SCREEN_WIDTH * SCREEN_HEIGHT * colorMode; i+=colorMode) { tempColors = output[i]; output[i] = output[i+2]; output[i+2] = tempColors; } fwrite( output, SCREEN_WIDTH * SCREEN_HEIGHT * colorMode, 1, sFile); fclose( sFile); delete[] output; }
когда надо сделать скрин выхови эту функцию
попробовал паралельно сохранить и бмп вариант - то же самое,glViewport так же не помог,менятерзает смутное сомненье ,что проблема в ф-ции glReadPixels,а точнее в параметрах gl_rgb и gl_unsigned_byte, другие варианты немогу поставить - не воспринимает компилятор
isaer
> glReadPixels(0,0, SCREEN_WIDTH, SCREEN_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE,
> output);
скорее всего должно быть RGBA8
и лучше сделать glFlush перед glReadPixels
у меня такие параметры
glReadPixels(0,0,AWidth,AHeight,GL_RGBA,GL_UNSIGNED_INT_8_8_8_8_REV,screenshot);
попробуй их
пробовал,но компилятор ругается,мол не знает таких
для них же не нужно отдельный модуль подключать?
он не находит сами константы? или ругается на что то еще? если не находит то попробуй прописать вручную:
GL_RGBA = $1908;
GL_UNSIGNED_INT_8_8_8_8_REV = $8367;
а ты используешь заголовочник от самой Delphi или какой то другой?
не находит,а заголовочник делфовский
Тема в архиве.