Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Apr 25, 2024 08:44

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 11, 2006 17:12 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Ok, ich habs langsam auch hinbekommen:

Beim Nachprogrammieren bitte darauf achten, dass ShowText etc. auch Prozeduren aufruft, die GL-Befehle enthalten. Wenn das Video also nicht so aussieht wie hier in dem Demo-Programm, einfach mal die ShowText Befehle mitnehmen ;)

Nächstes Ziel: Videotextur mit mehr als 256x256 Pixel. Man lernt immer dazu!

Vielen Dank an Lossy eX und tak2004 für die besondere Geduld. Thx!

Code:
  1.  
  2. // =============================================================================
  3. //   OpenGL1.5 - VCL Template (opengl15_vcl_template.zip)
  4. // =============================================================================
  5. //   Copyright © 2003 by DGL - http://www.delphigl.com
  6. // =============================================================================
  7. //   Contents of this file are subject to the GNU Public License (GPL) which can
  8. // =============================================================================
  9. //   History :
  10. //    Version 1.0 - Initial Release                            (Sascha Willems)
  11. // =============================================================================
  12.  
  13. unit OpenGL15_MainForm;
  14.  
  15. interface
  16.  
  17. uses
  18.   Windows,
  19.   Messages,
  20.   SysUtils,
  21.   Classes,
  22.   Graphics,
  23.   Controls,
  24.   Forms,
  25.   Dialogs,
  26.  
  27.   vfw,
  28.   dglOpenGL;
  29.  
  30. type
  31.   TGLForm = class(TForm)
  32.     procedure FormCreate(Sender: TObject);
  33.     procedure FormDestroy(Sender: TObject);
  34.     procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  35.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  36.     procedure GrabAVIFrame(frame: integer);
  37.     procedure xUpdate(milliseconds: DWORD);
  38.   private
  39.     { Private-Deklarationen }
  40.     Texture: TGLuint;
  41.     Data: Pointer;
  42.     LastFrame, Next: Integer;
  43.     mpf: integer;
  44.     bmih: BITMAPINFOHEADER;
  45.     h_bitmap: HBITMAP;
  46.     pdata: PGLubyte;
  47.     fhdd: HDRAWDIB;
  48.     frame: integer;
  49.     lastTickCount: Cardinal;
  50.     VideoWidth, VideoHeight: Integer;
  51.     StartTick : Cardinal;
  52.     Frames    : Integer;
  53.     psi: TAVIStreamInfo;
  54.     pavi: IAVIStream;
  55.     pgf: IGetFrame;
  56.   public
  57.     RC        : HGLRC;
  58.     DC        : HDC;
  59.     VDC       : HDC; // VideoDeviceContext
  60.     ShowFPS   : Boolean;
  61.     FontBase  : GLUInt;
  62.     FPS       : Single;
  63.  
  64.     procedure BuildFont(pFontName : String);
  65.     procedure OpenAVI(szFile: LPCSTR);
  66.     procedure PrintText(pX,pY : Integer; const pText : String);
  67.     procedure ShowText;
  68.   end;
  69.  
  70. var
  71.   GLForm: TGLForm;
  72.  
  73. implementation
  74.  
  75. {$R *.dfm}
  76.  
  77. {$Region 'BuildFont'}
  78. // =============================================================================
  79. //  TForm1.BuildFont
  80. // =============================================================================
  81. //  Displaylisten für Bitmapfont erstellen
  82. // =============================================================================
  83. procedure TGLForm.BuildFont(pFontName : String);
  84. var
  85.  Font : HFONT;
  86. begin
  87. // Displaylisten für 256 Zeichen erstellen
  88. FontBase := glGenLists(96);
  89. // Fontobjekt erstellen
  90. Font     := CreateFont(16, 0, 0, 0, FW_MEDIUM, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
  91.                        ANTIALIASED_QUALITY, FF_DONTCARE or DEFAULT_PITCH, PChar(pFontName));
  92. // Fontobjekt als aktuell setzen
  93. SelectObject(DC, Font);
  94. // Displaylisten erstellen
  95. wglUseFontBitmaps(DC, 0, 256, FontBase);
  96. // Fontobjekt wieder freigeben
  97. DeleteObject(Font)
  98. end;
  99. {$EndRegion}
  100.  
  101. {$Region 'PrintText'}
  102. // =============================================================================
  103. //  TForm1.PrintText
  104. // =============================================================================
  105. //  Gibt einen Text an Position x/y aus
  106. // =============================================================================
  107. procedure TGLForm.PrintText(pX,pY : Integer; const pText : String);
  108. begin
  109. if (pText = '') then
  110.  exit;
  111. glPushAttrib(GL_LIST_BIT);
  112.  glRasterPos2i(pX, pY);
  113.  glListBase(FontBase);
  114.  glCallLists(Length(pText), GL_UNSIGNED_BYTE, PChar(pText));
  115. glPopAttrib;
  116. end;
  117. {$EndRegion}
  118.  
  119. {$Region 'ShowText'}
  120. // =============================================================================
  121. //  TForm1.ShowText
  122. // =============================================================================
  123. //  FPS, Hilfstext usw. ausgeben
  124. // =============================================================================
  125. procedure TGLForm.ShowText;
  126. begin
  127. // Tiefentest und Texturierung für Textanzeige deaktivieren
  128. glDisable(GL_DEPTH_TEST);
  129. glDisable(GL_TEXTURE_2D);
  130. // In orthagonale (2D) Ansicht wechseln
  131. glMatrixMode(GL_PROJECTION);
  132. glLoadIdentity;
  133. glOrtho(0,640,480,0, -1,1);
  134. glMatrixMode(GL_MODELVIEW);
  135. glLoadIdentity;
  136. PrintText(5,15, FloatToStr(FPS)+' fps');
  137. glEnable(GL_DEPTH_TEST);
  138. glEnable(GL_TEXTURE_2D);
  139. end;
  140. {$EndRegion}
  141.  
  142. {$Region 'FormCreate'}
  143. // =============================================================================
  144. //  TForm1.FormCreate
  145. // =============================================================================
  146. //  OpenGL-Initialisierungen kommen hier rein
  147. // =============================================================================
  148. procedure TGLForm.FormCreate(Sender: TObject);
  149. begin
  150. // Variablen initialisieren;
  151. Data := NIL;
  152. Texture := 0;
  153. LastFrame := 0;
  154. mpf := 0;
  155. Frame := 0;
  156. Next := 0;
  157. VideoWidth := 0;
  158. VideoHeight := 0;
  159.  
  160. // OpenGL-Funtionen initialisieren
  161. InitOpenGL;
  162. // Gerätekontext holen
  163. DC := GetDC(Handle);
  164. // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  165. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  166. // Erstellten Renderkontext aktivieren
  167. ActivateRenderingContext(DC, RC);
  168. // Tiefenpuffer aktivieren
  169. glEnable(GL_DEPTH_TEST);
  170. // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
  171. glDepthFunc(GL_LESS);
  172. // Löschfarbe für Farbpuffer setzen
  173. glClearColor(0,0,0,0);
  174.  
  175. glGenTextures(1, @Texture);
  176. glBindTexture(GL_TEXTURE_2D, Texture); // << Binden
  177. glEnable(GL_TEXTURE_2D);
  178. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  179. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  180. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_BGR, GL_UNSIGNED_BYTE, @data);
  181.  
  182. VDC := CreateCompatibleDC(0);
  183. fhdd := DrawDibOpen;
  184.  
  185. OpenAVI('c:\1.avi');
  186. // Displayfont erstellen
  187. BuildFont('MS Sans Serif');
  188. // Idleevent für Rendervorgang zuweisen
  189. Application.OnIdle := ApplicationEventsIdle;
  190. // Zeitpunkt des Programmstarts für FPS-Messung speichern
  191. StartTick := GetTickCount;
  192.  
  193. end;
  194. {$EndRegion}
  195.  
  196. {$Region 'FormDestroy'}
  197. // =============================================================================
  198. //  TForm1.FormDestroy
  199. // =============================================================================
  200. //  Hier sollte man wieder alles freigeben was man so im Speicher belegt hat
  201. // =============================================================================
  202. procedure TGLForm.FormDestroy(Sender: TObject);
  203. begin
  204. // Renderkontext deaktiveren
  205. DeactivateRenderingContext;
  206. // Renderkontext "befreien"
  207. wglDeleteContext(RC);
  208. // Erhaltenen Gerätekontext auch wieder freigeben
  209. ReleaseDC(Handle, DC);
  210. // Falls wir im Vollbild sind, Bildschirmmodus wieder zurücksetzen
  211. ChangeDisplaySettings(devmode(nil^), 0);
  212. end;
  213. {$EndRegion}
  214.  
  215. procedure TGLForm.GrabAVIFrame(frame: integer);                                               // Grabuje požadovaný snímek z proudu
  216. var
  217.   lpbi: PBitmapInfoHeader;                                                            // Hlavièka bitmapy
  218. begin
  219.   lpbi := AVIStreamGetFrame(pgf,frame);                                               // Grabuje data z AVI proudu
  220.   pdata := Pointer(Integer(lpbi) + abs(lpbi.biSize) + lpbi.biClrUsed * sizeof(RGBQUAD));   // Ukazatel na data
  221.   DrawDibDraw(fhdd,VDC,0,0,256,256,lpbi,pdata,0,0,VideoWidth,VideoHeight,0);                    // Konvertování obrázku na požadovaný formát
  222.   glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 256, GL_BGR, GL_UNSIGNED_BYTE, data);  // Aktualizace textury
  223. end;
  224.  
  225. {$Region 'ApplicationEventsIdle'}
  226. // =============================================================================
  227. //  TForm1.ApplicationEventsIdle
  228. // =============================================================================
  229. //  Hier wird gerendert. Der Idle-Event wird bei Done=False permanent aufgerufen
  230. // =============================================================================
  231. procedure TGLForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  232. var
  233.   tickCount: cardinal;
  234.   Left_Min, Top_Min, Right_Max, Bottom_Max: Integer;
  235. begin
  236.   glMatrixMode(GL_PROJECTION_MATRIX);
  237.   glLoadIdentity;
  238.   glViewPort(0, 0, ClientWidth, ClientHeight);
  239.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  240.  
  241.   Left_Min := 0;
  242.   Top_Min := 0;
  243.   Right_Max := ClientWidth;
  244.   Bottom_Max := ClientHeight;
  245.  
  246.   glOrtho(0,ClientWidth,ClientHeight,0, 0,128);
  247.  
  248.   GrabAVIFrame(frame);                                                // Nagrabuje požadovaný snímek videa
  249.   glLoadIdentity;                                                     // Reset matice
  250.   glBindTexture(GL_TEXTURE_2D, Texture);
  251.  
  252.   glBegin(GL_QUADS);
  253.     glTexCoord2f(0,0); glVertex3f(0,Top_Min,0);
  254.     glTexCoord2f(0,1); glVertex3f(0,Bottom_Max,0);
  255.     glTexCoord2f(1,1); glVertex3f(Right_Max,Bottom_Max,0);
  256.     glTexCoord2f(1,0); glVertex3f(Right_Max,0,0);
  257.   glEnd;
  258.  
  259.   tickCount := GetTickCount;
  260.   xUpdate(tickCount - lastTickCount);
  261.   lasttickcount := tickCount;
  262.  
  263. ShowText;
  264.  
  265. // Hinteren Puffer nach vorne bringen
  266. SwapBuffers(DC);
  267.  
  268. // Windows denken lassen, das wir noch nicht fertig wären
  269. Done := False;
  270. sleep(10);
  271.  
  272. // Nummer des gezeichneten Frames erhöhen
  273. inc(Frames);
  274. // FPS aktualisieren
  275. if GetTickCount - StartTick >= 500 then
  276.  begin
  277.  FPS       := Frames/(GetTickCount-StartTick)*1000;
  278.  Frames    := 0;
  279.  StartTick := GetTickCount
  280.  end;
  281. end;
  282. {$EndRegion}
  283.  
  284. {$Region 'ShowText'}
  285. // =============================================================================
  286. //  TForm1.FormKeyPress
  287. // =============================================================================
  288. procedure TGLForm.FormKeyPress(Sender: TObject; var Key: Char);
  289. begin
  290. case Key of
  291.  #27 : Close;
  292. end;
  293. end;
  294. {$EndRegion}
  295.  
  296. {$Region 'OpenAVI'}
  297. procedure TGLForm.OpenAVI(szFile: LPCSTR);                                              // Otevøe AVI soubor
  298. var
  299.   bmi: BITMAPINFO;
  300. begin
  301.   AVIFileInit;                                                                  // Pøipraví knihovnu AVIFile na použití
  302.   if AVIStreamOpenFromFile(pavi,szFile,streamtypeVIDEO,0,OF_READ,nil) <> 0 then // Otevøe AVI proud
  303.     MessageBox(HWND_DESKTOP,'Failed To Open The AVI Stream','Error',MB_OK or MB_ICONEXCLAMATION); // Chybová zpráva
  304.   AVIStreamInfo(pavi,psi,sizeof(psi));                                          // Naète informace o proudu
  305.   VideoWidth := psi.rcFrame.Right - psi.rcFrame.Left;                                // Výpoèet šíøky
  306.   VideoHeight := psi.rcFrame.Bottom - psi.rcFrame.Top;                               // Výpoèet výšky
  307.   lastframe := AVIStreamLength(pavi);                                           // Poslední snímek proudu
  308.   mpf := AVIStreamSampleToTime(pavi,lastframe) div lastframe;                   // Poèet milisekund na jeden snímek
  309.   with bmih do
  310.     begin
  311.     biSize := sizeof(BITMAPINFOHEADER);                                         // Velikost struktury
  312.     biPlanes := 1;                                                              // BiPlanes
  313.     biBitCount := 24;                                                           // Poèet bitù na pixel
  314.     biWidth := 256;                                                             // Šíøka bitmapy
  315.     biHeight := 256;                                                            // Výška bitmapy
  316.     biCompression := BI_RGB;                                                    // RGB mód
  317.     end;
  318.   bmi.bmiHeader := bmih;
  319.   h_bitmap := CreateDIBSection(VDC,bmi,DIB_RGB_COLORS,data,0,0);
  320.   SelectObject(VDC,h_bitmap);                                                  // Zvolí bitmapu do kontextu zaøízení
  321.   pgf := AVIStreamGetFrameOpen(pavi,nil);                                       // Vytvoøí PGETFRAME použitím požadovaného módu
  322.   if pgf = nil then                                                             // Neúspìch?
  323.     MessageBox(HWND_DESKTOP,'Failed To Open The AVI Frame','Error',MB_OK or MB_ICONEXCLAMATION);
  324. end;
  325. {$EndRegion}
  326.  
  327. procedure TGLForm.xUpdate(milliseconds: DWORD);                                // Aktualizace pohybù ve scénì a stisk kláves
  328. begin
  329.   Inc(next,milliseconds);                                             // Zvìtšení next o uplynulý èas
  330.   frame := next div mpf;                                              // Výpoèet aktuálního snímku
  331.   if frame >= lastframe then                                          // Pøeteèení snímkù?
  332.     begin
  333.     frame := 0;                                                       // Pøetoèí video na zaèátek
  334.     next := 0;                                                        // Nulování èasu
  335.     end;
  336. end;
  337.  
  338. end.
  339.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 11, 2006 17:47 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Das Abspielen von größeren Videos an sich ist eigentlich kein Problem (Texturgrößen entsprechend auf 512 oder 1024 ändern)..

nur habe ich ein Performanceproblem. Ich spiele ein 1024x1024 Video ab, mit dem Microsoft MPEG4 Codec komprimiert. Läuft auf meinem PC mit 110FPS (3800+, 7800GT). Auf meinem alten PC (1Ghz, GeForce2GTS) läuft das ganze nur noch mir gerade mal 6FPS. Obowhl das Video an sich ohne Probleme im Windows Media Player abgespielt wird.. kann ich da etwas dran ändern? Wenn ich die Auflösung auf 512x512 halbiere, läuft es mit ca. 18FPS..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 11, 2006 18:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Eines darfst du nicht vergessen. Diese Methode zum Videosrendern ist alt. Das Bild wird erst noch mal irgend wohin gezeichnet und dort bereits schon in der Größe angepasst. Anschließend wird es dort wieder rauskopiert etc etc etc. Das ist verdammt viel zu tun und ältere Systeme haben irgendwo auch einfach ihre Grenze.

Eine Optimierung.
Die DIBSection des DCs auf 32 Bitfarbtiefe stellen und das Texturformat entsprechend auf BGRA ändern. Natürlich beim Erstellen der Textur als ersten Wert nicht mehr GL_RGB dann GL_RGBA und alle GL_BGR durch GL_BGRA ändern. Bzw die 24 bei der Struktur für CreateDIBSection auf 32 Stellen. Einige Grafikkarten haben "Probleme" mit 24 Bit Texturen. Da dauert das Uploaden länger als bei 32 Bit.


Ein ganz andere Weg ist zum Beispiel über den DirectShow Renderer. Dort bekommt man per Callback dann die Daten reingereicht und kann sie direkt hochladen.

Projekt: OpenGL VideoRender Filter
bzw. Schaut euch auch mal diese Thema an


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 11, 2006 21:01 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

ok vielen Dank für Deine Infos :)

Habe mir nun mal den DirectShowRenderer von Hackbart angeschaut. Er läuft zwar, aber im Moment wird nur das weiße Quad ohne Textur gezeichnet. Was daran liegt, dass ich keine Videodatei geladen habe.. finde keine passende Funktion. Muss ich das noch selber implementieren?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.120s | 18 Queries | GZIP : On ]