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

Aktuelle Zeit: Do Jul 10, 2025 10:04

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: HighMap berechnen
BeitragVerfasst: Di Jan 13, 2009 17:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Hi alle,
wie ihr unschwer erraten könnt weis ich mal wieder nicht weiter. Ich habe nämlich ein 50x50 Array mit Höhendaten daraus werden dann die Quads zum rendern in ein VBO geladen. Für den Anfang reicht das auch erstmal, jetzt kann der Spieler aber die Landschaft verändern da aber jeder Punkt 100 auseinander ist kann der Spieler z.B. an Punkt 10,2 ein Loch machen. Die Nachkommastellen kann ich aber ja nicht speichern, deshalb kommt jetzt meine Highmap dazu, sie ist größer und kann auch das speichern. Mein Problem ist jetzt wie ich das 50x50 Array auf die 500x500 Map umwandeln kann. Natürlich könnte ich alle 250.000 Punkte der Highmap berechnen, jetzt kommt aber mein Problem, das ganze muss in Realtime erstellt werden, der Spieler darf kein rukeln etc. merken. Ich hatte mal daran gedacht den Nebel auf 0 Anfangen zu lassen und dann die AnfangsQuads (50x50) zu rendern und das Ergebniss das durch den Nebel ja nun farblich nach tiefe unterschiedlich abgestuft ist zu speichern. Ich weis nur nicht wie das gehen soll.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 13, 2009 17:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Ohne Ruckeln fällt mir nur per Threading etwas ein. Siehe dazu auch im Wiki das Multithreading tutorial: Tutorial Multithreading

Ansonsten, wie du die Interpolation machen willst, ist dir klar?

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 14, 2009 15:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Ich habe es jetzt noch nicht getestet aber ich mache einen RenderPass zusätzlich. Man sollte davor nur alles Sichern. Ich schreibe es hier mal hin falls es mal jemand braucht:
Code:
  1.  
  2. type
  3.  
  4. TFogColor = record
  5.   Red : single;
  6.   Green : single;
  7.   Blue : single;
  8.   Alpha : single;
  9. end;
  10.  
  11. implemention
  12.  
  13. CreateHighMap();
  14. var
  15.    Screen:Pointer;
  16.    pTexData: Pointer;
  17.    FogColor:TFogColor;
  18. begin
  19. glEnable(GL_FOG);
  20. glHint(GL_FOG_HINT, GL_NICEST);
  21.  
  22. FogColor.Red := 0; //Kein Rot
  23. FogColor.Green := 0; //Kein Grün
  24. FogColor.Blue := 0; //Kein Blau
  25. FogColor.Alpha := 0;
  26.  
  27. glFogfv(GL_FOG_COLOR, @FogColor);
  28.  
  29. glFogi(GL_FOG_MODE, GL_LINEAR); //Linear
  30. glFogf (GL_FOG_START, 0); //Start
  31. glFogf (GL_FOG_END, 100); //Ende
  32.  
  33.  
  34. //Textur erstellen
  35.   GetMem(pTexData, 500*500*3);
  36.  
  37.   // Textur generieren und drauf zeigen
  38.   glGenTextures(1, @Screen);
  39.   glBindTexture(GL_TEXTURE_2D, Screen);
  40.  
  41.   // Daten in den Speicher, Lineares Filtering aktivieren
  42.   glTexImage2D(GL_TEXTURE_2D, 0, 3, 500, 500, 0, GL_RGB, GL_UNSIGNED_BYTE, pTexData);
  43.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  44.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  45.  
  46.   // Freigeben
  47.   FreeMem(pTexData);
  48.  
  49.  
  50. //Rendern
  51. //Reset
  52. glClearColor(0.0,0.0,0.0,0);
  53. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  54.  
  55. //Bildschirmgröße anpassen
  56. glViewport(0, 0, 500, 500);
  57.  
  58. //Rendern und Binden
  59. glBindTexture(GL_TEXTURE_2D, Screen);
  60. glpushMatrix();
  61.  
  62. for x:=1 to 49 do
  63.     begin
  64.     for y:=1 to 49 do
  65.     begin
  66.     gltranslatef(10,0,0);
  67.     glBegin(GL_QUADS);
  68.     glColor3f(1, 1, 1); glVertex3f(0 , Cell[1].Cells[x  ,y  ], 0 );
  69.     glColor3f(1, 1, 1); glVertex3f(10, Cell[1].Cells[x+1,y  ], 0 );
  70.     glColor3f(1, 1, 1); glVertex3f(10, Cell[1].Cells[x+1,y+1], 10);
  71.     glColor3f(1, 1, 1); glVertex3f(0 , Cell[1].Cells[x  ,y+1], 10);
  72.     glEnd();
  73.     end;
  74.     glTranslatef(0,10,0);
  75.     end;
  76.  
  77. glPopmatrix();
  78. glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 500, 500, 0);
  79.  
  80. //Reseten für Hauptrendern
  81. glDisable(GL_FOG);
  82. glClearColor(0,0.0,0.0,0);
  83. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  84. glViewport(0, 0, 800, 600);
  85. end;
  86.  
  87.  

Ich möchte mich nochmal bei den Autoren des Nebel-Tutorial und des RenderPass-Tutorials bedanken, macht weiter so.
[edit]Habe Nebel berechnung nochmal korigiert.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 14, 2009 16:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Habe ein paar kleine Anmerkung.
- Du benutzt 500x500 als Texturgröße. Das können nur neuere Grafikkarten. Ältere benötigen als Größe eine Potenz von 2. Also 512x512 ist das Naheliegenste.
- Den lokalen Speicherbereich kannst du dir sparen. Wenn du nil als Datenpointer bei glTexImage2D übergibst, dann akzeptiert OpenGL das auch. Den Speicher muss er so oder so erstellen. Nur so entfällt dann das Kopieren des sowieso nicht genutzen Speichers.
- Für den Parameter Internalformat bei glTexImage2D (aktuell die 3) solltest du besser GL_RGB8 verwenden. Ich meine es gibt Treiber die 3 etc nicht mehr mögen.
- Bei der Heightmap setzt du bei jedem Vertex die Farbe (1, 1, 1). Wenn du das ein einziges Mal vor den beiden Schleifen machst reicht das auch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 14, 2009 17:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
Ich hab jetzt die Tipps umgesetzt, ich habe jetzt glCopyTexImage2D(); Auch dann GL_RGB8 verwendet oder hätte ich das auf RGB lassen können. (Was ist eigentlich der unterschied zwischen RGB und RGB8?)
Code:
  1.  
  2. type
  3.  
  4. TFogColor = record
  5.   Red : single;
  6.   Green : single;
  7.   Blue : single;
  8.   Alpha : single;
  9. end;
  10.  
  11. implemention
  12.  
  13. CreateHighMap();
  14. var
  15.    Screen:Pointer;
  16.    FogColor:TFogColor;
  17. begin
  18. glEnable(GL_FOG);
  19. glHint(GL_FOG_HINT, GL_NICEST);
  20.  
  21. FogColor.Red := 0; //Kein Rot
  22. FogColor.Green := 0; //Kein Grün
  23. FogColor.Blue := 0; //Kein Blau
  24. FogColor.Alpha := 0;
  25.  
  26. glFogfv(GL_FOG_COLOR, @FogColor);
  27.  
  28. glFogi(GL_FOG_MODE, GL_LINEAR); //Linear
  29. glFogf (GL_FOG_START, 0); //Start
  30. glFogf (GL_FOG_END, 100); //Ende
  31.  
  32.  
  33. //Textur erstellen
  34.   // Textur generieren und drauf zeigen
  35.   glGenTextures(1, @Screen);
  36.   glBindTexture(GL_TEXTURE_2D, Screen);
  37.  
  38.   // Daten in den Speicher, Lineares Filtering aktivieren
  39.   glTexImage2D(GL_TEXTURE_2D, 0, 3, 512, 512, 0, GL_RGB8, GL_UNSIGNED_BYTE, nil);
  40.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  41.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  42.  
  43.  
  44. //Rendern
  45. //Reset
  46. glClearColor(0.0,0.0,0.0,0);
  47. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  48.  
  49. //Bildschirmgröße anpassen
  50. glViewport(0, 0, 512, 512);
  51.  
  52. //Rendern und Binden
  53. glBindTexture(GL_TEXTURE_2D, Screen);
  54. glpushMatrix();
  55.  
  56. glColor3f(1, 1, 1);
  57. for x:=1 to 49 do
  58.     begin
  59.     for y:=1 to 49 do
  60.     begin
  61.     gltranslatef(10,0,0);
  62.     glBegin(GL_QUADS);
  63.     glVertex3f(0 , Cell[1].Cells[x  ,y  ], 0 );
  64.     glVertex3f(10, Cell[1].Cells[x+1,y  ], 0 );
  65.     glVertex3f(10, Cell[1].Cells[x+1,y+1], 10);
  66.     glVertex3f(0 , Cell[1].Cells[x  ,y+1], 10);
  67.     glEnd();
  68.     end;
  69.     glTranslatef(0,10,0);
  70.     end;
  71.  
  72. glPopmatrix();
  73. glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 0, 0, 512, 512, 0);
  74.  
  75. //Reseten für Hauptrendern
  76. glDisable(GL_FOG);
  77. glClearColor(0,0.0,0.0,0);
  78. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  79. glViewport(0, 0, 800, 600);
  80. end;
  81.  
  82.  

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 14, 2009 18:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn du die Textur schon vorher erstellst und keine Größenänderung machst (beides dinge, die du einhalten solltest), solltest du eher glCopyTexSubImage2D verwenden, was in jedem falle performanter ist, weil dann keine neue Textur erstellt wird, sondern nur der Inhalt der alten überschrieben.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 14, 2009 21:02 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
So richtig verstanden hab ich das noch nicht.
Mit "Loch" meinst du "Vertiefung" oder?
Soll das sowas wie ein Heightmap-Editor werden?

Wenn dein Raster für das Terrain nur 50x50 ist kann man auch keine Vertiefungen zwischen die Vertices machen (außer vllt mit Geometryshadern).
Jeder der Vertices entspricht ja einem Pixel der Heightmap.

Wenn man nicht jeden Vertex verändern und dauernd im VBO aktualisieren will, kann man vllt den Vertexshader die Verschiebung überlassen.
Das würde dann in etwa so funktionieren:
Man hat eine Textur (die Heightmap) und ein flaches Gitter aus ziemlich vielen Vertices. Jeder Vertex hat als Texturkoordinate eine andere, sodass jeder Texel einem Vertex zugeordnet ist. Im Vertexshader wird dann auf die Heightmap zugegriffen und aus der Farbe dann die Höhe ermittelt.

Wenn man die Höhen bestimmter Vertices ändern will, kann man dann einfach in einem Renderpass die aktuelle Heightmap zeichnen und über Blending dann ein Quad dazuaddieren oder subtrahieren, das Quad kann mit einem Kreis oder ähnlichem texturiert sein. Das Ergebnis kopiert man wieder in die Heightmap.
Der Vorteil ist die Berechnungen für die Heightmap und die Vertices bei der Darstellung finden alle auf der Graka statt, die das schön parallel macht.


Ich hoffe das hat irgendwie geholfen, weil, wie gesagt, ich hab eigentlich keine Ahnung ob das wirklich dein Problem war.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 15, 2009 17:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
@Schläfer: Ich habe als "Grundgelände" nur 50x50 Höhenpunkte berechnet das ganze soll dann aber aus 500x500 gestreckt werden.
PS:Ein Highmapeditor soll es nicht werden es ist für ein Spiel gedacht indem der Spieler den Boden verändern kann.
Wie effizient findet ihr eigentlich meine Methode (ich habe nähmlich leider keine Ahnung davon ob das für Spielverhältnisse schnell ist oder lahm)

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 15, 2009 17:24 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Also benutzt du den Fog um zwischen den Vertices der groben Landschaft zu interpolieren?
Aber das macht man doch nur einmal, dann hat man seine neue Heightmap oder nicht?
Vielleicht kannst du mal erläutern wie du das dann weiterverwendest, weil nur durch lineare Interpolation bekommt man ja keine neuen Informationen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 15, 2009 20:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Okt 16, 2008 13:18
Beiträge: 252
@Schläfer: Ich mache es der Übersichtlichkeit wegen. Denn ich benutze in meinem Programm nichtmehr Weiß nach Schwarz, sondern der Benutzer kann bis zu 3 Ebenen untereinander Bauen(Was dan in RGB gespeichert wird), also er hat eine Landschaft und kann dort Tunnel ziehen. Bei so einer Situation nun die Höhendaten zu berechnen schien mir mit einer HighMap am einfachsten weil wenn zum Beispiel 50 Dreiecke in dem Bereich wären der ausgewertet werden müsste, müsste ich alle 50 Dreiecke prüfen, wenn jetzt sagen wir mal noch 20 Computerspieler mit ähnliche Situation herumlaufen wird es kritisch, mit der HighMap lese ich einfach die Höhendaten aus und bin fertig. Auch für den Weg durchs Gelände für die Computer schien es mir einfacher.

_________________
You even trying ...

Website: http://rise-of-light.de/


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.011s | 15 Queries | GZIP : On ]