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.
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 network • my 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
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:
type
TFogColor =record
Red :single;
Green :single;
Blue :single;
Alpha :single;
end;
implemention
CreateHighMap();
var
Screen:Pointer;
pTexData:Pointer;
FogColor:TFogColor;
begin
glEnable(GL_FOG);
glHint(GL_FOG_HINT, GL_NICEST);
FogColor.Red:=0;//Kein Rot
FogColor.Green:=0;//Kein Grün
FogColor.Blue:=0;//Kein Blau
FogColor.Alpha:=0;
glFogfv(GL_FOG_COLOR,@FogColor);
glFogi(GL_FOG_MODE, GL_LINEAR);//Linear
glFogf (GL_FOG_START,0);//Start
glFogf (GL_FOG_END,100);//Ende
//Textur erstellen
GetMem(pTexData,500*500*3);
// Textur generieren und drauf zeigen
glGenTextures(1,@Screen);
glBindTexture(GL_TEXTURE_2D, Screen);
// Daten in den Speicher, Lineares Filtering aktivieren
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glViewport(0,0,800,600);
end;
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.
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.
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:
type
TFogColor =record
Red :single;
Green :single;
Blue :single;
Alpha :single;
end;
implemention
CreateHighMap();
var
Screen:Pointer;
FogColor:TFogColor;
begin
glEnable(GL_FOG);
glHint(GL_FOG_HINT, GL_NICEST);
FogColor.Red:=0;//Kein Rot
FogColor.Green:=0;//Kein Grün
FogColor.Blue:=0;//Kein Blau
FogColor.Alpha:=0;
glFogfv(GL_FOG_COLOR,@FogColor);
glFogi(GL_FOG_MODE, GL_LINEAR);//Linear
glFogf (GL_FOG_START,0);//Start
glFogf (GL_FOG_END,100);//Ende
//Textur erstellen
// Textur generieren und drauf zeigen
glGenTextures(1,@Screen);
glBindTexture(GL_TEXTURE_2D, Screen);
// Daten in den Speicher, Lineares Filtering aktivieren
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 network • my 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
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.
@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)
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.
@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.
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.