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

Aktuelle Zeit: Fr Jul 18, 2025 04:34

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Transformieren ohne Szene neu laden?
BeitragVerfasst: Mi Nov 30, 2011 09:02 
Offline
DGL Member

Registriert: Di Nov 29, 2011 09:07
Beiträge: 4
Hallo
ich möchte die Landschaft nur verschieben oder noch gewisse Änderungen vornemen. Aber ohne, dass ich das ganze (aus performancegründen) neu Zeichnen/Laden muss.
Ich stell mir mal vor, dass das auch in komplexeren Spielen nicht die ganze 3d Szene nach jedem Frame neu geladen werden muss. Die GraKa hat doch die Szene schon drin. Ich möchte also nur die Bewegung und die Änderungen der Szene übergeben müssen.
In allen Beispielen, die ich gefunden habe sieht die Paint Routine etwa wie bei mir aus(sorry ist builder):
Code:
  1.    
  2. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  3. glPushMatrix();
  4.  glTranslatef(PosX, PosY, -PosZ);
  5.  glRotatef(RotX, 0.0, 1.0, 0.0);
  6.  glRotatef(RotY, 1.0, 0.0, 0.0);
  7.  glRotatef(RotZ, 0.0, 0.0, -1.0);
  8.  
  9. //laden
  10.  glBegin(GL_TRIANGLE_STRIP);
  11.    glColor3bv(..);
  12.    glVertex3s(..);
  13.    ...
  14.   glEnd();
  15.   glEndList();
  16.  glPopMatrix();
  17.  


Danke für Eure Hilfe
Srugy


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 30, 2011 09:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 03, 2008 12:01
Beiträge: 167
Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
Falls du mit "laden" meinst, die Daten an die GPU zu schicken, dann hast du Recht, das geht auch anders. Heutzutage benutzt man VBOs um die Daten auf der Grafikkarte abzulegen und mit geringem Aufwand zu zeichnen. VBOs erlauben es dir auch, die Daten nachträglich noch zu ändern. Sieh dir einfach mal Tutorial Vertexbufferobject im Wiki an.
Wenn du etwas nachträglich transformieren willst, würde ich das mit einem GLSL-Shader machen, der eine entsprechende Transformations-Matrix entgegennimmt. Auch für Shader gibt es ein nettes Tutorial: Tutorial glsl.

_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 30, 2011 11:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

dafür sind Shader nicht unbedingt notwendig. Die Transformationsmatrix kannst du auch ganz einfach per glLoadMatrix oder glMultMatrix an OpenGL übergeben, dann wird das über die feste Funktionspipeline gemacht. Mit Shadern macht man normalerweiße speziellere Sachen, die die normale Funktionspipeline so nicht anbietet...

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 30, 2011 16:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Dez 03, 2008 12:01
Beiträge: 167
Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
Klar, so geht es auch. Ich dachte irgendwie, dass er die Transformationsmatrix für die Landschaft seperat haben möchte. Die Matrix mit z.B. der Modelview-Matrix zu multiplizieren ginge natürlich auch.

_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 10:52 
Offline
DGL Member

Registriert: Di Nov 29, 2011 09:07
Beiträge: 4
Danke, ich werde mich da mal durchackern. Jetzt hab ich die nötigen Begriffe.
Konkret geht es darum, eine Landschaft zu zeichnen, bei der ständig neue Zeilen(Streifen) vorne reinkommen und dann nach hinten weglaufen und wieder verschwinden (verständlich?).
Das sind dann total etwa eine Million Punkte (grob 1500 * 700 Punkte). Das wär schon nett, wenn das die GPU machen könnte.
Bin natürlich dankbar für Ideen oder Beispiele...
Gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 14:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Du willst also quasi jeden neuen Streifen nur einmal zeichnen und der nutzer soll das Teil trotzdem
von allen Positionen aus einsehen können? Wie genau ist denn deine Landschaft aufgebaut? ist es z.B. nur eine Heightmap
oder doch ein sehr komplexes gebilde?

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 14:53 
Offline
DGL Member

Registriert: Di Nov 29, 2011 09:07
Beiträge: 4
Ja genau, eine Heightmap (aber nicht ein fixes Raster. Weiss nicht ob man dann immer noch von Heightmap spricht). Aber eher simpel. Und die Farbe entsprechend der Höhe.
Mit der Maus kann man dann das Ding drehen und zoomen.
Hab mal ein Screenshot angehängt wie es bis jetzt ist. Das Ganze bewegt sich ständig nach hinten.


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 22:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Wenn dir eine Grafikkarte mit Texturzugriff im Vertexshader zur Verfügung steht lässt sich das sehr schön elegant realisieren.

1. Du brauchst einen Vertexbuffer der deine grob 1500 * 700 Punkte enthält. Jeder Vertex enthält nur eine 2D-Position. Dieser Buffer nur einmal initialisiert und dann nicht mehr geändert.
2. Du brauchst einen Indexbuffer (Elementbuffer) der aus den Vertices ein Feld von Dreiecken definiert. Auch dieser Buffer wird nicht mehr geändert.
3. Die Höhenwerte werden als Textur gespeichert. Sollten 8bit, also 256 Höhenstufen nicht ausreichen kannst du eine 16bit Graustufentextur oder auch eine Float-Textur benutzen.

Die Textur mit den Höhenwerten wird als Ringbuffer verwendet. Du hast also einen Index der z.B. auf eine Zeile der Textur zeigt. In jedem Frame wird diese (und nur diese) Texturzeile mit neuen Daten beschrieben (geht mit glTexSubImage2D). Dann wird der Index um eins weiter geschoben. Wenn du am Ende ankommst fängst du vorne wieder an.

Der Vertexshader bekommt diesen Index als Uniform. Aus Vertexposition und dem Index kannst du berechnen an welcher Stelle in der Textur sich die benötigten Höhenwerte befinden und diese auslesen. Solltest du Normalen benötigen liest du auch die Höhenwerte der Nachbarvertices aus und berechnest die Normale on-the-fly.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Dez 07, 2011 17:13 
Offline
DGL Member

Registriert: Di Nov 29, 2011 09:07
Beiträge: 4
Irgendwie so hab ich mir das vorgestellt.
Das ist ja ganz einfach... :x :D
Werd mich da mal in einer freien Minute hinsetzen...
Besten Dank


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