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

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

Страницы: 1 2 3
#30
15:56, 9 сен 2010

Вот код из одной книги. Работает, проверял.

#pragma pack (push, 1)
struct  TgaHeader
{
  byte  idLength;
  byte  colormapType;
  byte  imageType;
  uint16  colormapIndex;
  uint16  colormapLength;
  byte  colormapEntrySize;
  uint16  xOrigin;
  uint16  yOrigin;
  uint16  width;
  uint16  height;
  byte  pixelSize;
  byte  imageDesc;
};
#pragma  pack (pop)

bool  saveScreenShot ( const char * fileName )
{
  int     width  = glutGet ( GLUT_WINDOW_WIDTH  );
  int     height = glutGet ( GLUT_WINDOW_HEIGHT );
  byte * ptr    = (byte *) malloc ( 3 * width * height );

  if ( ptr == NULL )
    return false;

                      // get image from window
  glReadBuffer ( GL_FRONT );
  glReadPixels ( 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, ptr );

                      // now save it as 24-bit uncompressed tga
  TgaHeader  hdr;

  memset ( &hdr, '\0', sizeof ( hdr ) );

  hdr.imageType         = 2;         // unencoded image
  hdr.width             = width;
  hdr.height            = height;
  hdr.pixelSize         = 24;

  int  file = open ( fileName, O_WRONLY | O_BINARY | O_CREAT, S_IWRITE );

  if ( file == -1 )
  {
    free ( ptr );

    return false;
  }
                      // write header
  write ( file, &hdr, sizeof ( hdr ) );


                      // swap R and B channels
  int    numPixels = width * height;
  byte  * pixel     = ptr;
  byte  temp;

  for ( int i = 0; i < numPixels; i++, pixel += 3 )
  {
    temp      = pixel [0];
    pixel [0] = pixel [2];
    pixel [2] = temp;
  }
                      // and write it down
  write ( file, ptr, width * height * 3 );
  close ( file );
                      // cleanup
  free ( ptr );

  return true;
}
#31
15:56, 9 сен 2010

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

#32
15:57, 9 сен 2010

лучше про него забудь. там очень мало функций и он морально и физически устарел. я использую вот этот http://wiki.delphigl.com/index.php/dglOpenGL.pas/en

там для версии OpenGL 3.2 и все необходимые расширения

#33
15:59, 9 сен 2010

а попробуй сделать glFlush как советовал innuendo

#34
16:02, 9 сен 2010

спс,сейчас попробую

#35
16:30, 9 сен 2010

так,поменял параметры,при удалении старого опенгл из списка модулей-выкидуется ошибка на строку glPixelStorei(GL_PACK_ALIGNMENT,4);, ошибка пишет,мол параметр обращается к нил

#36
16:52, 9 сен 2010

pascal.ilya можешь указать компилятор и модули?

#37
17:15, 9 сен 2010

чем я компилирую?

Delphi2010 + dglOpengl.pas. Больше никаких модулей не надо. Может у тебя драйвера старые? Другие функции OpenGL нормально работают?

#38
17:20, 9 сен 2010

это первое что я делаю с опенгл,насчет других функций поэтому незнаю,прописываю дглопенгл+опенгл,программа возвращает черный экран,оставляю один дглопенгл ошибки на строке glPixelStorei(GL_PACK_ALIGNMENT,4); дальше программа не идет

пишу так же в раде 2010

#39
17:26, 9 сен 2010

я понял почему. смотри оставляешь только dglOpengl в модулях. инициализацию делаешь следующим образом:

InitOpenGL;
MyDC := GetDC(Form1.Handle);
MyRC := CreateRenderingContext(MyDC, [opDoubleBuffered], 32, 24, 8, 0, 0, 0);
ActivateRenderingContext(MyDC, MyRC);

и в том месте где у тебя происходит рендер после всех отрисовок добавляешь функцию

SwapBuffers(MyDC);

и все должно заработать.

Правка: Если что типы необходимых переменных
MyDC: HDC;
MyRC: HGLRC;

#40
17:29, 9 сен 2010

Спасибо большое,сейчас затесчу

Страницы: 1 2 3
ПрограммированиеФорумГрафика

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