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

Aktuelle Zeit: Fr Jul 18, 2025 11:49

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jan 26, 2006 01:29 
Offline
DGL Member

Registriert: Di Jan 24, 2006 16:22
Beiträge: 3
Wohnort: Berlin
Hi,

Mein Problem ich habe eine Bilddatei die auf BMP-Basis 8-Bit 210 MB hat (Stadtplan).
Ich habe versucht die mit Paintbox und Blt verfahren zu laden und damit dann zu navigieren. Das bedeutet zu scrollen... funzt wunderbar !!
Aber sobald ich noch die Zoom-Funktion einbauen wollte wird alles zu langsam.

Ich habe viel gelesen aber leider nicht das richtige gefunden um in opengl dieses zu realisieren.
Als Textur kann ich mein Bild nicht Laden, denn auf meiner GraKa sind nur Texturen bis max 4500x4500 erlaubt aber mein Bild hat ca.
16000x13000 px.

Ich möchte mein Stadtplan schnellstmöglich laden und damit arbeiten(scrollen,zoomen) wie ist das mit OpenGL oder egal welcher
Variante auch immer gut zu lösen ?

Ich brauch da eure Hilfe zu...

Dank im Voraus...oz


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 26, 2006 01:50 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
In OpenGL musst du den Stadtplan in kleinere Quadranten zerlegen.
Danach ist Zoom und Bewegung nur noch ein logistisches Problem.
Von der Geschwindigkeit sollte es auch gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 26, 2006 10:07 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Ja, auf jeden Fall muss dein Gebilde in viele kleine Quadrate gesetzt werden. Ist die Frage für welche Zielsysteme das ganze gedacht ist, aber ich würde fast gen 256x256 gehen. Dennoch ist die menge ja nicht ganz ohne, so dass es ggf. Sinn macht ähnliche Verfahren zu nehmen wie z.B. Goole Earth.
1. Seperat Bilder parallel nachladen und ungeladene Bereiche solange mit einer Standard-Textur belegen, solange sie nicht geladen wurden.
2. Unbedingt eine Sichtberechnung durchführen. Was in OpenGL Geschwindigkeit kostet ist das Wechseln von Texturen und das hast Du auch hier definitiv. Also nur soviele Texturen wechseln wie auch wirklich sichtbar gebraucht werden. Zugegeben, neuere Grafikkarten hauen so manches schnell über den Äther, aber ich unterstelle Dir, dass Du auch alte nutzen willst ;)
3. Ggf. bei einem sehr weiten Zoom umspringen auf anderes Bildmaterial. Z.B. wenn die gesamte Stadt angezeigt werden soll, nur noch ein Quad mit einer stark verkleinerten Textur deines Bildes verwenden.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 26, 2006 10:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was mir gerade noch so auffält. Du hast natür das denkbar schlechteste Texturformat. Ein riesen BMP was noch mit einer Palette arbeitet. OpenGL kommt nämlich nicht mit Palettenbildern klar. Du musst das Bild vorher in RGB (24Bit) umwandeln. Das geht mit einem TBitmap recht einfach nur würde dein ganzes Bild dann mal eben über 600 MB Speicher verbraten. Was auch nicht so praktisch ist.

Ich würde da evtl. sogar schon hergehen und deine Bilder bereits bei dir in kleinere Bilder zu zerhacken. Dabei musst du jetzt sehen ob du das lieber mit einem TBitmap machst oder auf Dateiebene. Dateiebene ist zwar komplexer aber dafür sind die Anforderungen an den Rechner nicht so hoch.

Wie auch immer du es machst du solltest dabei darauf achten, dass deine ausgangsbilder Bilder 8Bit bleiben. Dadurch sind sie kleiner. Als Dateinamen würde ich etwas nehmen woraus du auf den Quadranten schließen kannst. Wenn du diese Bilder dann an OpenGL übergeben willst kannst du sie dann mittels TBitmap laden und anschließend setze du das PixelFormat auf 24 Bit. Damit wandelst du sie in RGB Bilder um und kannst sie in OpenGL verwenden.

Alles andere haben meine Vorredner ja schon gesagt.

PS: Mit diese Aufteilung der Dateien könntest du das sogar übers Internet nutzen. Wobei ich dann eher noch sagen würde, dass du beim Internet nicht mit BMPs arbeiten solltest. Dafür wäre wohl PNG am besten geeignet. Also auch wegen der Beschaffenheit eines Stadtplans. Große einfarbige Flächen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: WoW ich bin beeindruckt...
BeitragVerfasst: Do Jan 26, 2006 12:06 
Offline
DGL Member

Registriert: Di Jan 24, 2006 16:22
Beiträge: 3
Wohnort: Berlin
Danke danke danke ...

Leute ihr seit gut schnell. Und so Hilfsbereit..

Also ich fasse zusammen :

1. Werden ich mein Kartenmaterial (128 indizierte Farben 128(so bleibt das ganze klein ist doch anschaulich)), in 256x256 Kleine Teile teilen.

2. Werde ich Sie in die sichtbaren Flächen in meiner Szene in OpenGL laden .

3. Bei veränderungen wie z.B Zoom oder scroll sollte ich Fragmente nachladen oder eventuell ausladen.

Hört sich gut an in sofern das Laden un d entladen nicht laggt!

(ich habe das ganze in TImage schon mal gemacht wobei meine Fragmente größer waren..)

so vorerst mal mein COde in OpenGL:

Code:
  1.  
  2.  
  3.  
  4. const
  5.  // Hier definieren wie die virtuellen Ausmaße unserer 2D-Ansicht
  6.  // Dadurch das diese Werte fest sind, müssen wir nicht bei abweichender
  7.  // Auflösung die Koordinaten umrechnen.
  8.  SizeX   : Integer = 1024;
  9.  SizeY   : Integer = 768;
  10.  
  11.  MaxSize : Integer =   3;
  12.  
  13. var
  14.  GLForm     : TGLForm;
  15.  DC         : HDC;
  16.  RC         : HGLRC;
  17.  
  18.  MapTex     : glUInt;
  19.  MapScale   : Single;
  20.  MapPos     : TVertex;
  21.  
  22.  MousePos   : TPoint;
  23.  
  24.  Frames     : Integer;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. // =============================================================================
  31. //   DrawQuad
  32. // =============================================================================
  33. //   Kleine Routine die ein Quad rendert. Da wir das öfters brauchen ist das
  34. //   sehr praktisch.
  35. // =============================================================================
  36. procedure DrawQuad(pX, pY, pZ, pWidth, pHeight : Single);
  37. begin
  38. glBegin(GL_QUADS);
  39.  glTexCoord2f(0,0); glVertex3f(pX-pWidth/2, pY-pHeight/2, -pZ);
  40.  glTexCoord2f(1,0); glVertex3f(pX+pWidth/2, pY-pHeight/2, -pZ);
  41.  glTexCoord2f(1,1); glVertex3f(pX+pWidth/2, pY+pHeight/2, -pZ);
  42.  glTexCoord2f(0,1); glVertex3f(pX-pWidth/2, pY+pHeight/2, -pZ);
  43. glEnd;
  44. end;
  45.  
  46.  
  47. // =============================================================================
  48. //   Vertex
  49. // =============================================================================
  50. function Vertex(pX,pY,pZ : Single) : TVertex;
  51. begin
  52. Result.x := pX;
  53. Result.y := pY;
  54. Result.z := pZ;
  55. end;
  56.  
  57. // =============================================================================
  58. //   TGLForm
  59. // =============================================================================
  60.  
  61. // =============================================================================
  62. //   TGLForm.FormCreate
  63. // =============================================================================
  64. procedure TGLForm.FormCreate(Sender: TObject);
  65. begin
  66. InitOpenGL;
  67. DC := GetDC(Handle);
  68. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  69. ActivateRenderingContext(DC, RC);
  70. // Auch in 2D werden wir den Z-Puffer (und Tiefentest) nutzen, denn damit sparen
  71. // wir uns das eigenhändige Sortieren von Objekten anhand ihres Layers
  72. glEnable(GL_DEPTH_TEST);
  73. glDepthFunc(GL_LESS);
  74. glEnable(GL_TEXTURE_2D);
  75. Application.OnIdle := Render;
  76.  
  77. LoadTexture('d:\unbenannt.bmp', MapTex, False);
  78.  
  79. MapScale := 0.5;
  80. MapPos   := Vertex(0,0,0);
  81. end;
  82.  
  83. // =============================================================================
  84. //   TGLForm.FormDestroy
  85. // =============================================================================
  86. procedure TGLForm.FormDestroy(Sender: TObject);
  87. begin
  88. DeactivateRenderingContext;
  89. DestroyRenderingContext(RC);
  90. ReleaseDC(Handle, DC);
  91. end;
  92.  
  93. // =============================================================================
  94. //   TGLForm.Render
  95. // =============================================================================
  96. procedure TGLForm.Render(Sender : TObject; var Done : Boolean);
  97. begin
  98. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  99.  
  100. glMatrixMode(GL_PROJECTION);
  101. glLoadIdentity;
  102. glViewport(0,0,ClientWidth,ClientHeight);
  103. glOrtho(0, SizeX, 0, SizeY, 0, 128);
  104.  
  105. glMatrixMode(GL_MODELVIEW);
  106. glLoadIdentity;
  107.  
  108. glBindTexture(GL_TEXTURE_2D, MapTex);
  109. glScalef(MapScale, MapScale, MapScale);
  110. glTranslatef(MapPos.x, MapPos.y, 0);
  111. DrawQuad(0,0,0, 256,256);
  112.  
  113. SwapBuffers(DC);
  114.  
  115. Done := False;
  116.  
  117. inc(Frames);
  118. end;
  119.  
  120. // =============================================================================
  121. //   TGLForm.FormMouseWheel
  122. // =============================================================================
  123. procedure TGLForm.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  124. begin
  125. MapScale := MapScale + 0.005 * WheelDelta;
  126. if MapScale < 0.1 then
  127.  MapScale := 0.1;
  128. end;
  129.  
  130. // =============================================================================
  131. //   TGLForm.FormMouseMove
  132. // =============================================================================
  133. procedure TGLForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  134. var
  135.  MPos : TPoint;
  136. begin
  137. if not (ssLeft in Shift) then
  138.  begin
  139.  MousePos := Mouse.CursorPos;
  140.  exit;
  141.  end;
  142.  
  143. MPos := Mouse.CursorPos;
  144. MapPos.x := MapPos.x+(MPos.x-MousePos.x)*1.5;
  145. MapPos.y := MapPos.y-(MPos.y-MousePos.y)*1.5;
  146.  
  147. MousePos := MPos;
  148. if MPos.X < Left+15 then
  149.  SetCursorPos(Left+ClientWidth-17, MPos.Y);
  150. if MPos.X > Left+ClientWidth-15 then
  151.  SetCursorPos(Left+17, MPos.Y);
  152. if MPos.Y < Top+35 then
  153.  SetCursorPos(MPos.X, Top+ClientHeight-17);
  154. if MPos.Y > Top+ClientHeight-15 then
  155.  SetCursorPos(MPos.X, Top+37);
  156. MousePos := Mouse.CursorPos;
  157. end;
  158.  
  159. // =============================================================================
  160. //   TGLForm.FPSTimerTimer
  161. // =============================================================================
  162. procedure TGLForm.FPSTimerTimer(Sender: TObject);
  163. begin
  164. Caption := IntToStr(Frames)+' FpS';
  165. Frames  := 0;
  166. end;
  167.  
  168. end.
  169.  


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 26, 2006 14:36 
Offline
DGL Member

Registriert: Di Jan 24, 2006 16:22
Beiträge: 3
Wohnort: Berlin
Wie zeichne ich jetzt mehrere Texturen auf ein Quad ??

Oder muss ich etw mehrere Quads aufziehen ???

und alle einzeln Texturieren ??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 26, 2006 14:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Mehrere Texturen kannst du nur insofern auf ein Quadrat packen, dass diese dann übereinandergeblendet werden. Das nennt sich dann Multitexturing. Das ist aber für dich eigentlich nicht relevant. Du musst also für jedes Texturschnipsel ein Quadrat erzeugen.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 26, 2006 15:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was genau ist deine Frage? Irgendwie verstehe ich dich nicht so ganz.

Du musst natürlich irgendwo deine Texturen halten. Bzw auch vermerken welche Teile du bereits geladen hast und was noch geladen werden muss. Da du das Bild in Quadranten zerschneidest und auch eine nicht allzu große Größe hast könntest du ein 2 Dimensionales Array benutzen. In dem Array würde ich Records ablegen. In dem Record wäre ein Boolean (Loaded) und ein Cardinal (TextureID).

Je nachdem welchen Ausschnitt du anzeigst musst du dir ausrechnen welche Quadranten sichtbar sind und diese kannst du zeichnen. Wenn die Texturen nicht geladen sind solltest du sie Laden. Für den Anfang sollte das ausreichen. Wenn es nicht ausreicht solltest du eine besser Lademöglichkeit einbauen. Das wird dann aber Komplizierter. Also erst mal weg lassen.

Das Zeichnen stimmt eigentlich schon so wie es ist. Du Bindest eine Textur und Zeichnest dann ein Quad an die entsprechende Stelle. Vergiss aber nicht die Darstellung von 2D Texturen auch zu aktivieren. Das geht mit glEnable(GL_TEXTURE_2D). Damit hast du einen Quadranten gezeichnet. Das musst du dann noch für alle anderen sichtbaren Quadranten tun. Das Aktivieren der Texturen musst du aber nicht mehrfach tun da genügt es ein mal.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 27, 2006 13:28 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die verwaltung von Texturen, und im speziellen dein Problem, sind ideal für die Verwendung eines Texturmanagers.

In welcher Sprache schreibst du dein Programm? Ich hab hier mal einen texturmanager für C++ gepostet. Der basierte aber auf SDL. Das ist aber kein Problem, weil nur das Prizip wichtig ist:

- Wenn du eine neue Textur brauchst, sagst du dem TexManager er solle die Textur bitte ab jetzt verwenden (TexManager.bind("Textur_Q11.jpg");).
- Der Texturmanager hat eine Liste mit Texturcontainern, welche die texturen darstellen, die momentan geladen (auf der GraKa liegen) sind.
- Jeder Container enthält den Namen der Textur ("Textur_Q11.jpg") und den OpenGL-Namen (Die ID mit der OpenGL die Texturen unterscheiden kann)
- Wenn der Manager in der Liste, die Textur nicht findet, lädt er sie von der Platte, und hängt einen entsprechenden Container in die Liste vorn an. Anschließend bindet er die textur
- Findet er die Textur in der Liste, sortiert er den Container vorn, ein und bindet die Textur.

Der Witz an dieser MEthode ist folgender: Du kannst die Menge der benutzen Texturen reglementieren. Du kannst z.B. sagen: "Behalte maximal 10 Texturen im speicher".
Wenn du eine neue Textur lädst, checkst du nur noch wie lang die momentane liste ist? Ist sie länger als der Grenzwert, löscht du die Textur am Ende. (Du musst sie natürlich ach mit glDeleteTexture(TexID) aus dem GraKa entfernen)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 27, 2006 13:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Flash hat geschrieben:
Der Witz an dieser MEthode ist folgender: Du kannst die Menge der benutzen Texturen reglementieren. Du kannst z.B. sagen: "Behalte maximal 10 Texturen im speicher".
Wenn du eine neue Textur lädst, checkst du nur noch wie lang die momentane liste ist? Ist sie länger als der Grenzwert, löscht du die Textur am Ende. (Du musst sie natürlich ach mit glDeleteTexture(TexID) aus dem GraKa entfernen)

Na ob das immer so gut ist wage ich mal zu bezweifeln. Es kann ja sein, dass er 11 Texturen braucht. Und dann wird immer eine weggeschmissen. Üblicherweise wird für so etwas eine Referenzzählung benutzt.

Im Englisch-Forum habe ich vor einer Weile zu einer zeitgesteuerten Taktik geraten. Das könnte für dich evtl auch interessant sein. Dort wurde gespeichert wann eine Textur das Letzte mal benutzt wurde und jede Sekunde wurde überprüft ob eine Textur mittlerweile schon abgelaufen (1 Minute nicht benutzt) ist. So kannst du dann durchaus auch mal kurz den Bereich verändern ohne dass die Textur gleich gelöscht wird.

Wobei du es aber auch so machen könntest, dass nur die Texturen geladen werden die direkt sichtbar sind und die Texturen erst dann freigebenen werden, wenn du weiter weg bist. Wobei das immer darauf ankommt was du vor hast. Das kann man ja noch mit beliebigen anderen Techniken kombinieren. Der Entwicklerischen Vielfalt sind dabei keine (oder kaum) Grenzen gesetzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 27, 2006 23:04 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Nun die Methode, die Anzahl festzulegen bedarf einer kleinen Statistischen auswertung. Ich hab bei meinem Spiel einfach mal bisl gespielt, und dann mal nachgeguckt, welche Texturen in der Liste waren, und wann ich die zuletzt gesehen habe. Das ergebnis war, dass ich von meinen glaub >30 Texturen immer nur einen Satz von 6-7 gebraucht habe. Mit dem Wissen, kann man dann sein Programm Feintunen. Wobei das in diesem Fall ja nicht so wichtig ist. Die Hauptsache ist, das die Anzahl erlaubter Texturen nicht zu groß für den GraKa-Speicher wird. Wenn der auslagern muss ist Feierabend mit Performance. Deshalb ist die Mengenbeschränkung hier wohl die sicherste Variante eine Auslagerung zu vermeiden.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]