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

Aktuelle Zeit: Fr Jul 18, 2025 11:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 25, 2005 17:09 
Offline
DGL Member

Registriert: Mi Apr 13, 2005 16:06
Beiträge: 67
Wohnort: Fulda
Seth hat geschrieben:
kannst doch die bilder per programmstart laden, obwohl, wäre ein problem, weil das mächtig viele sind ...
man könnte auch zwischendurch ein paar bilder mehr laden, aber das wäre wohl auch nicht so schön aber die einzige Lösung die mir für das Problem einfällt, oder du lädts die bilder in ne avi und spielst die dann ab, nach dem abspielen kannst sie dann wieder löschen 8)


Nun, bei 115.000 Bilder á 40 kB sinds gerade mal knapp 4,5 GB. Eine avi-Datei würde dementsprechend auch nicht gerade ganz klein werden. Und wenn ich das richtig verstanden habe, wird ja erst während des Progammablaufs entschieden, in welcher Reihenfolge die Bilder reinkommen.

Wenns so aussieht wie auf dem Screenshot dann ists ja schon ganz schick. Aber trotzdem: Totaler Overkill mit den ganzen Bildern.

@Finalspace:
Was für Streckeninfos sind denn in der Access-DB abgelegt? Wäre es darauf aufbauend möglich, das ganze komplett mit OGL darzustellen?

Robert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 25, 2005 17:59 
Offline
DGL Member

Registriert: Fr Dez 19, 2003 14:27
Beiträge: 107
Wohnort: Indianapolis, USA
Also ich habe mein Idee mit den Thread befuellten Buffer mal ausprobiert, hier zum downloaden und verbesseren:
http://www.luedin.com/JpegPlayer.zip 2.5MB

Auf meinem Arbeits Rechner mit 2GHz und uralt GeForce2 MX, habe ich etwa 65ms pro frame. Was sicher auch helfen wuerde waere die Bilder in ein OpenGL freundlicheres 512*512 format zu skalieren, dabei verliert man ja nicht soo viel vom Bild.
Wenn ich direkt BMP's verwende dauerts nur noch 20ms pro frame.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 25, 2005 19:41 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Nice Tokter, wirkt gut ich hab hier ca. 40ms

Die Buffermethode können wir aber alledings nicht benutzen, da ja abhängig von Geschwindigkeit und Ort die Bilder sehr schnell wechseln oder viele bilder doppelt oder dreifach vorkommen.
Es muss sogar möglich sein direkte sprünge zu machen.

Hab sowas ähnliches auch schon gebaut, allerdings suckt meine methode total da ich ganz primitiv 2 array Buffer festgelegt habe und immer die arrays wechsle.

Deine methode wirkt sehr gut, das mit dem Mutex und so kannte ich gar nicht.

Hab mal meine methode mit samt source attached.

Bilder generiert es auch welche, also testen geht einfach :)


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 25, 2005 20:19 
Offline
DGL Member

Registriert: Fr Dez 19, 2003 14:27
Beiträge: 107
Wohnort: Indianapolis, USA
Habe mir gerade ueberlegt man koennte doch gleich 4 Bilder in eine 1024*1024 Textur packen, dann wuerde sich der lade und dekomprimier Vorgang auf 4 Frames aufteilen. Aber wenn natuerlich jedes Bild gezielt angesprungen werden muss machts das natuerlich schwierig.
Da Festplatten Platz ja nichts kostet :) , waere es doch dann am einfachsten es halt umkomprimiert zu Speichern, das sollte dann ja ziemlich fluessig sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 29, 2005 20:53 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So habs nun geschafft... pro frame brauch ich nur noch ca. 15 ms bei dem DVSD Videoformat.
Als XVid enkodiert brauch ich sogar weniger, 4-6 ms :)

Gelöst hab ichs über (Video For Windows) und OpenGL.
Das Problem mit den "720x576" Textures hab ich hier an meinem Rechner mit GF 6800 nicht mehr da diese ja das nette feature "GL_ARB_texture_non_power_of_two" bietet :)
Werd meinem chef deshalb sagen er soll ne 6800 kaufen :D

Was jetzt noch fehlt ist eine ASM optimierte BGR > RGB konvertierung, weil meine suckt man total:

BGR Format:
Bild

Ins RGB konvertiert:
Bild

Code:
  1.  
  2.   ' BGR nach RGB konvertieren
  3.   Dim i As Long
  4.   Dim R As Byte
  5.   Dim B As Byte
  6.   For i = 0 To (VideoWidth * VideoHeight) - 1
  7.     R = VideoData(i * 3 + 0)
  8.     B = VideoData(i * 3 + 2)
  9.     VideoData(i * 3 + 0) = B
  10.     VideoData(i * 3 + 2) = R
  11.   Next i
  12.  


so siehts aus, ist super langsam :(
In Delphi könnte ich einfach ne schnelle ASM routine basteln die das machen würde, aber in VB :ppp


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 29, 2005 21:09 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Wenn du kein Mipmapping brauchst, kannst du auch GL_TEXTURE_RECTANGLE_* als Texture Target benutzen. Das können fast alle Karten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 30, 2005 13:29 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
k die VFW routine suckt total... :(

Hab mir jetzt nen eigenes einfaches Video Format gemacht, welches ich drin seeke, das jeweilige Bild als JPEG hole und via TJpegImage.LoadFromStream dekodiere und dann an nen TBitmap assigne :p

Frage aber noch, wie funzt das mit dem GL_TEXTURE_RECTANGLE genau ?
ich finde da mal gar nix brauchbares dazu im netz...

im DGL header finde ich nur "GL_TEXTURE_RECTANGLE_NV".

und das einfach als Texture Target funzt nicht :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 30, 2005 13:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Habe ich gerade erst gesehen. Wieso willst du in deinem Programm eigentlich von BGR nach RGB umwandeln? Kannst doch beim hochladen der Daten angeben, dass die BGR als Format haben.

Extension: Und in diesem Dokument findest du alles Wissenwerte was es über die Extension GL_ARB_texture_rectangle zu wissen gibt.

Wenn ich da mal den Overview zitieren dürfte.
Zitat:
NPOTS textures are accessed by dimension-dependent (aka
non-normalized) texture coordinates. So instead of thinking of
the texture image lying in a [0..1]x[0..1] range, the NPOTS texture
image lies in a [0..w]x[0..h] range.

This extension adds a new texture target and related state (proxy,
binding, max texture size).


Sprich. Du hast ein neues Texturtarget und die Texturkoordinaten befinden sich nicht im Bereich von 0..1 sondern 0..h oder 0..w. Ich denke mal das sollte ausreichen.

Die Konstanten (Target) findest du im bereich "New Tokens".


PS: NV und EXT ist 100%tig das Selbe wie die ARB bis auf, dass die Namen anders sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 30, 2005 16:24 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
oder die Daten direkt als rgb abspeichern.

btw. ich bin mir grad nich ganz sicher, aber geht bei VB schleifen nicht ne step-Angabe bei For-Schleifen? dadurch würden in deiner Prozedur immerhin schonmal nen paar arithmetische operationen gespart (kA wie weit VB das optimiert).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 31, 2005 19:33 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So habs nun endgültig fertig:

Hier ist der code für meine DLL welche ich in VB nutze:

Code:
  1.  
  2. library texloader;
  3.  
  4. uses
  5.   Windows,
  6.   SysUtils,
  7.   Classes,
  8.   OpenGL,
  9.   Graphics,
  10.   jpeg,
  11.   glbmp;
  12.  
  13. function DLoadTexture(const Filename : PChar; var TextureID : GLUint) : Boolean; stdcall;
  14. var
  15.   Tex  : TGLBmp;
  16. begin
  17.   Tex := TGLBmp.Create;
  18.   try
  19.     Tex.LoadImage(PChar(Filename));
  20.     Tex.FlipVert;
  21.     Tex.SetFilter(GL_LINEAR_MIPMAP_LINEAR,GL_LINEAR);
  22.     Tex.GenTexture;
  23.     TextureID := Tex.TextureID;
  24.     Result := True;
  25.   except
  26.     TextureID := 0;
  27.     Result := False;
  28.   end;
  29. end;
  30.  
  31. type
  32.   TDeltaVideoHeader = packed record
  33.     NumIndexTableEntrys : Cardinal;
  34.     Width,
  35.     Height              : Cardinal;
  36.     Bits                : Byte;
  37.     Codec               : DWord;
  38.   end;
  39.  
  40.   TDeltaVideoIndexTableEntry = packed record
  41.     Offset     : Cardinal;
  42.     Size       : Cardinal;
  43.   end;
  44.  
  45. var
  46.   FS  : TStream;
  47.   HDR : TDeltaVideoHeader;
  48.   Idx : array of TDeltaVideoIndexTableEntry;
  49.   BildDaten : TBitmap;
  50.  
  51. const
  52.   GL_BGR = $80E0;
  53.  
  54. procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;
  55. procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
  56. procedure glTexSubImage2D(target, level: GLenum; xoffset, yoffset : GLint; width, height : GLsizei; format, _type : glEnum; pixels : Pointer); stdcall; external opengl32 name 'glTexSubImage2D';
  57.  
  58. function CreateTexture(Width, Height : Integer; pData : Pointer) : glUint;
  59. begin
  60.   glGenTextures(1, result);
  61.   glBindTexture(GL_TEXTURE_2D, result);
  62.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); { only first two can be used }
  63.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); { all of the above can be used }
  64.   glTexImage2D(GL_TEXTURE_2D, 0, 3, Width, Height, 0, GL_BGR, GL_UNSIGNED_BYTE, pData);
  65. end;
  66.  
  67. function DLoadVideo(const Filename : PChar; var TexID : gluint) : Boolean; stdcall;
  68. begin
  69.   Result := False;
  70.   FS := TFileStream.Create(Filename, fmOpenRead);
  71.   try
  72.     FS.Seek(0, soFromBeginning);
  73.     FS.Read(HDR, SizeOf(HDR));
  74.  
  75.     SetLength(Idx, HDR.NumIndexTableEntrys);
  76.     FS.Read(Idx[0], SizeOf(TDeltaVideoIndexTableEntry) * HDR.NumIndexTableEntrys);
  77.  
  78.     if (HDR.Width > 0) and (HDR.Height > 0) then
  79.     begin
  80.       BildDaten := TBitmap.Create;
  81.       BildDaten.Width := HDR.Width;
  82.       BildDaten.Height := HDR.Height;
  83.       BildDaten.PixelFormat := pf24bit;
  84.       BildDaten.Canvas.Brush.Color := clBlue;
  85.       BildDaten.Canvas.FillRect(Rect(0,0,HDR.Width,HDR.Height));
  86.     end
  87.     else
  88.     begin
  89.       FS.Free;
  90.       Exit;
  91.     end;
  92.  
  93.     TexID := CreateTexture(HDR.Width, HDR.Height, BildDaten.ScanLine[HDR.Height-1]);
  94.  
  95.     Result := True;
  96.   except
  97.     if Assigned(BildDaten) then BildDaten.Free;
  98.     FS.Free;
  99.   end;
  100. end;
  101.  
  102. procedure DGetVideoInfo(var NumPics, Width, Height : Longint; var Bits : Byte); stdcall;
  103. begin
  104.   NumPics := HDR.NumIndexTableEntrys;
  105.   Width := HDR.Width;
  106.   Height := HDR.Height;
  107.   Bits := HDR.Bits;
  108. end;
  109.  
  110. procedure DGetVideoData(PicNum : Longint); stdcall;
  111. var
  112.   NeuePos  : Longint;
  113.   NeueSize : Longint;
  114.   JpegStr  : TMemoryStream;
  115.   jpg      : TJpegImage;
  116. begin
  117.   if Assigned(BildDaten) and Assigned(FS) then
  118.   begin
  119.     if (PicNum >= Low(Idx)) and (PicNum < High(idx)) then
  120.     begin
  121.       NeuePos := Idx[PicNum-1].Offset;
  122.       NeueSize := Idx[PicNum-1].Size;
  123.       FS.Seek(NeuePos, soFromBeginning);
  124.       JpegStr := TMemoryStream.Create;
  125.       JpegStr.Size := NeueSize;
  126.       FS.Read(JpegStr.Memory^, NeueSize);
  127.       jpg := TJpegImage.Create;
  128.       jpg.LoadFromStream(JpegStr);
  129.       BildDaten.Canvas.Draw(0,0,jpg);
  130.       glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, Hdr.Width, Hdr.Height, GL_BGR, GL_UNSIGNED_BYTE, BildDaten.ScanLine[Hdr.Height-1]);
  131.       jpg.Free;
  132.       JpegStr.Free;
  133.     end;
  134.   end;
  135. end;
  136.  
  137. procedure DCloseVideo; stdcall;
  138. begin
  139.   if Assigned(BildDaten) then BildDaten.Free;
  140.   if Assigned(FS) then FS.Free;
  141. end;
  142.  
  143. exports
  144.   DLoadTexture name 'DLoadTexture',
  145.   DLoadVideo name 'DLoadVideo',
  146.   DGetVideoInfo name 'DGetVideoInfo',
  147.   DGetVideoData name 'DGetVideoData',
  148.   DCloseVideo name 'DCloseVideo';
  149.  
  150. begin
  151. end.
  152.  


Thx an alle die mir bisher geholfen haben !

Denke mal das man da nicht mehr viel optimieren kann, ausser halt alles selbst machen, ohne TJpegImage und dem TStream.
Wenn wer lust hat, da was optimiertes zu schreiben kann das gerne tun, desto schneller desto besser :)

Mit der momentanen lösung schaff ichs unter 30 ms zu bleiben an meiner maschine hier, 3 ghz p4, 1 gb ram, gf 6800.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 31, 2005 20:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Kann es sein, dass dein DLoadTexture ne fettes Speicherloch hinterlässt? Ich könnte dir da meinen Loader empfehlen. Der Lädt die Bilder gleich richtig rum. Also kein FlipVert nötig. Und du kannst die Klasse freigeben, ohne das die Textur gelöscht wird. Wenn man denn nicht gleich mit der Proceduralen Lösung arbeiten will.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 31, 2005 20:09 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Wenn du das von VB aus nutzen willst, macht doch am besten ein COM Objekt draus. Da kannst du dann die DLL als Referenz hinzufügen und hast die Klasse in VB.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 31, 2005 23:49 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Jo hab ich auch festgestellt mit dem Speicherleck...
is gefixed nun.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 01, 2005 16:26 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
So ist nun alles gegegelt :)

Hab die DLL bissel optimiert welches ich unten gepostet habe.
Chef hat GF 6800 GT PCI-E karte gekauft heute, eingebaut... Dauert pro Bild nur noch 25 ms anstatt 45 :p
Bin also ausem schneider ;)

Ein Hoch auf OpenGL :)

Will mal gar nicht wissen was das fürn stress wäre das in D3D nachzubauen :roll:

Danke an alle dir mir tips gegeben haben ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 01, 2005 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Zitat:
Will mal gar nicht wissen was das fürn stress wäre das in D3D nachzubauen


Nichts gegen OpenGL, aber du kannst mit DirectShow ein Video direkt auf ein Direct3D Surface, also eine Texture, rendern.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 15 Queries | GZIP : On ]