ПрограммированиеФорумГрафика

Скриншот на OpenGL (2 стр)

Страницы: 1 2 3 Следующая »
#15
22:27, 29 окт 2009

Так-с тоже реши приделать скриншоты следующим образом:

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 предварительно созданная текстура

На выходе получаю мусор:
Изображение
Изображение
Изображение

Спрашивается из-за чего так получается и как сделать правильно?

#16
22:27, 29 окт 2009

Через FBO делать не могу, так как видюха Intel.

#17
8:42, 30 окт 2009

Ну, так кто-нибудь знает, почему такое может происходить?

#18
8:46, 30 окт 2009

MarkoPolo
> glCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGB,x,y+h,w,h,0);
Чот мне кажется, что ты рисуешь верх ногами (y+h). Начало текстуры считается координатами 0;0, этож тебе не окно.
Или хотяб напиши ... x,y+h,w,0,0);

#19
9:31, 30 окт 2009

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 пикселя. Вот они и идут в виде мусора.

Прошло более 10 месяцев
#20
23:57, 8 сен 2010

доброго времени суток,прошу помочь по возможности.Пишу модуль на скрин приложения в режиме опенгл(кс 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;

прошу ,кто знает как - поправте меня и если можно объсните в чем именно ошибка

#21
0:05, 9 сен 2010

desLamer
Попробуй сохранить отдельно твой bitmap и посмотри такой же результат там как в jpeg. В коде ошибок не нашел. У меня такой же отлично работает. Единственное что я еще вначале устанавливаю glViewPort(0, 0, AWidth, AHeight); и произвожу рендер.

И еще зачем тебе glReadBuffer(GL_front); ?

#22
1:34, 9 сен 2010

внимание копипаст =)
сам не пробовал но такой вот исходник есть

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;
}

когда надо сделать скрин выхови эту функцию

#23
9:36, 9 сен 2010

http://www.openscenegraph.org/projects/osg/browser/OpenSceneGraph… encapture.cpp

#24
15:44, 9 сен 2010

попробовал паралельно сохранить и бмп вариант - то же самое,glViewport так же не помог,менятерзает смутное сомненье ,что проблема в ф-ции glReadPixels,а точнее в параметрах gl_rgb и gl_unsigned_byte, другие варианты немогу поставить - не воспринимает компилятор

#25
15:45, 9 сен 2010

isaer
> glReadPixels(0,0, SCREEN_WIDTH, SCREEN_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE,
> output);
скорее всего должно быть RGBA8

и лучше сделать glFlush перед glReadPixels

#26
15:46, 9 сен 2010

у меня такие параметры

glReadPixels(0,0,AWidth,AHeight,GL_RGBA,GL_UNSIGNED_INT_8_8_8_8_REV,screenshot);

попробуй их

#27
15:50, 9 сен 2010

пробовал,но компилятор ругается,мол не знает таких

для них же не нужно отдельный модуль подключать?

#28
15:53, 9 сен 2010

он не находит сами константы? или ругается на что то еще? если не находит то попробуй прописать вручную:
GL_RGBA = $1908;
GL_UNSIGNED_INT_8_8_8_8_REV = $8367;

а ты используешь заголовочник от самой Delphi или какой то другой?

#29
15:54, 9 сен 2010

не находит,а заголовочник делфовский

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.