DGL
https://delphigl.com/forum/

Picture from the scene
https://delphigl.com/forum/viewtopic.php?f=19&t=6611
Seite 1 von 1

Autor:  graverko [ Di Mai 22, 2007 13:18 ]
Betreff des Beitrags:  Picture from the scene

Do anybody know how to make a picture from the scene I have created in OprnGL?
(Something like screnshot)
I am drawing the scene in to the Panel.

Autor:  MatReno [ Di Mai 22, 2007 15:09 ]
Betreff des Beitrags: 

Hi,
works for me with something like this:
Code:
  1. unit PrtScr;
  2.  
  3. INTERFACE
  4.  
  5. Uses SysUtils, windows, dglOpenGL;
  6.  
  7. Type
  8.   BITMAPFILEHEADER = packed record
  9.     bfType: Word;
  10.     bfSize: DWORD;
  11.     bfReserved1: Word;
  12.     bfReserved2: Word;
  13.     bfOffBits: DWORD;
  14.   end;
  15.  
  16.   BITMAPINFOHEADER = packed record
  17.     biSize: DWORD;
  18.     biWidth: Longint;
  19.     biHeight: Longint;
  20.     biPlanes: Word;
  21.     biBitCount: Word;
  22.     biCompression: DWORD;
  23.     biSizeImage: DWORD;
  24.     biXPelsPerMeter: Longint;
  25.     biYPelsPerMeter: Longint;
  26.     biClrUsed: DWORD;
  27.     biClrImportant: DWORD;
  28.   end;
  29.  
  30.   Procedure ScreenShot(const FileName: string; NumChar: Char);
  31.  
  32.  
  33. IMPLEMENTATION
  34.  
  35.  
  36. Procedure ScreenShot(const FileName: string; NumChar: Char);
  37. var F          : file;
  38.     FileInfo   : BITMAPINFOHEADER;
  39.     FileHeader : BITMAPFILEHEADER;
  40.     pPicData   : Pointer;
  41.     Viewport   : array[0..3] of integer;
  42.     FileNameNr : string;
  43.     i          : word;
  44. Begin
  45.   // Nummerierung (Falls es DateiNamen schon gibt)
  46.   i := 0;
  47.   Repeat
  48.     inc(i);
  49.     FileNameNr := FileName;
  50.     Insert(NumChar + inttostr(i), FileNameNr, Length(FileNameNr)-3);
  51.   Until (not FileExists(FileNameNr));
  52.  
  53.   // Speicher für die Speicherung der Header-Informationen vorbereiten
  54.   ZeroMemory(@FileHeader, SizeOf(BITMAPFILEHEADER));
  55.   ZeroMemory(@FileInfo, SizeOf(BITMAPINFOHEADER));
  56.  
  57.   // Größe des Viewports abfragen
  58.   glGetIntegerv(GL_VIEWPORT, @Viewport);
  59.  
  60.   // Initialisieren der Daten des Headers
  61.   FileHeader.bfType := 19778; //$4D42 = 'BM'
  62.   FileHeader.bfOffBits := SizeOf(BITMAPINFOHEADER)+SizeOf(BITMAPFILEHEADER);
  63.  
  64.   // Schreiben der Bitmap-Informationen
  65.   FileInfo.biSize      := SizeOf(BITMAPINFOHEADER);
  66.   FileInfo.biWidth     := Viewport[2];
  67.   FileInfo.biHeight    := Viewport[3];
  68.   FileInfo.biPlanes    := 1;
  69.   FileInfo.biBitCount  := 32;
  70.   FileInfo.biSizeImage := FileInfo.biWidth*FileInfo.biHeight*(FileInfo.biBitCount div <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->;
  71.  
  72.   // Größenangabe auch in den Header übernehmen
  73.   FileHeader.bfSize := FileHeader.bfOffBits + FileInfo.biSizeImage;
  74.  
  75.   // Speicher für die Bilddaten reservieren
  76.   GetMem(pPicData, FileInfo.biSizeImage);
  77.   try
  78.     // Bilddaten von OpenGL anfordern
  79.     glReadPixels(0, 0, Viewport[2], Viewport[3], GL_BGRA, GL_UNSIGNED_BYTE, pPicData);
  80.  
  81.     // Bilddaten in die Datei schreiben
  82.     AssignFile(f, FileNameNr);
  83.     Rewrite(f, 1);
  84.     try
  85.       BlockWrite(F, FileHeader, SizeOf(BITMAPFILEHEADER));
  86.       BlockWrite(F, FileInfo, SizeOf(BITMAPINFOHEADER));
  87.       BlockWrite(F, pPicData^, FileInfo.biSizeImage );
  88.     finally
  89.       CloseFile(f);
  90.     end;
  91.  
  92.   finally
  93.     // Angeforderten Speicher wieder freigeben ...
  94.     FreeMem(pPicData, FileInfo.biSizeImage);
  95.   end;
  96. End;
  97.  
  98. end.


Sorry for German Comments :wink:

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/