ich hab mich ja nun schon seit längerem mit terrainrendering befasst und durch einen Octree (der leider noch etwas buggt) in verbindung mit frustum culling konnte ich auch die leistung recht gut und den griff bekommen, allerdings komm ich jetzt sehr schnell mit dem speicherverbrauch in konflikt da ein terrain von recht geringer größe sehr viel speicher braucht, allerdings muss es ja eine möglichkeit geben diese unmengen an Vertexen(x,y,z,n) recht effizient zu halten, bisher bin ich durch den octree leider gezwungen alle daten in einem array zu haben was mir aber so gar nicht gefallen will. auch hat der diese art des renderns meinen shader ausgehebelt, ich seh dann gar nichts mehr aber zuerst zum speicher, kennt ihr da gute vorschläge? es ist auch nicht so schlimm wenn es viel arbeit ist hauptsache ich kann möglichst große outdoor-szenen rendern.
Handelt es sich um ein Heightmap-Terrain? Wenn das der Fall ist schau dir meinen Terrainshader in der Shadersammlung an. Steht zwar ShaderModel 4.0 dran, aber wenn man das Prinzip verstanden hat sollte es auch auf älterer Hardware gehen solange ein Texturzugriff im Vertexshader möglich ist. Mit dem Shader benötigst du nur noch einen VBO mit 65x65 Vertices, die Höhenwerte kommen komplett aus einer 16bit Graustufen-Textur. Normale + Texcoords werden im Shader berechnet. Für ein 4096x4096 Terrain ohne Shader würdest du normalerweise ca. 640 MB nur für die Geometrie benötigen. Mit meinem Shader brauchst du dafür weniger als 33 MB.
ja den shader nutze ich vielleicht errinerst du dich wir hatten lange gefummelt wegen der texturenübergabe aber ich brauch nur ein einziges VBO?
-.- stimmt ein Feld 64x64 das dann immerwieder gerendert wird nur mit veränderrten koordinaten, boar is das dämlich einfach XD ich hab bisher immer soviel blocks erstellt wie ich benötigt habe und habe dann alle gerendert, das konnten mal eben 12x12 blocks werden
ich werd das mit dem vbo testen auch wenn ich es trotz anleitung forenbeiträge und ettlicher versuche noch nie geschaft habe auch nur 1 dreieck aus einem vbo zu rendern
meine Blockstruktur sieht derzeit recht einfach aus
Code:
Type TVertex=record X,Y : Integer; end;
TBlock=class TerrainV : array of array of TVertex; [...] end;
die struktur die ich gepostet habe is die die ich derzeit nutze^^ ohne vbo´s mit vbo´s weiß ich das ich floats brauche, aber welches geht ein Double? oder reicht real?
Ich glaub in Delphi/Pascal heißt der float einfach "Single", weil es die halbe Auflösung eines Doubles ist. Ich weiß nicht was Real ist...jedenfalls brauchst du einen Float nach IEEE 754 mit 32bit Auflösung. Das muss nämlich binärkompatibel mit der Grafikkarte sein, da du beim hochladen des VBOs einfach nur die Bits kopierst und nicht implizit eine Typumwandlung durchführst.
Edit: Eine kurze Google-Suche sagt mir das Real wahrscheinlich 48bit hat. Also was ganz krummes.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Sieht prinzipiell gut aus, wie zeichnest du denn?
greetings
_________________ 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 hab das bild noch dazuedidiert damit ihr euch überhaupt vorstellen könnt was das problem ist
gezeichnet wird ganz einfach so
Code:
procedure TTerrain.RenderTerrain; begin //If Frustum.IsBoxWithin(X*64,0,Y*64,64,255,64) then begin glInterleavedArrays(GL_V2F, SizeOf(TVertex), nil); glDrawArrays(GL_Triangles, 0, 64*64*SizeOf(TVertex)); //end; end;
könnte es daran liegen das ich die punkte in etwa so speichere?
Vor dem Aufruf von glInterleavedArrays sollte der VBO gebunden sein. Des weiteren brauchst du entweder die erwähnten Indices oder du musst Dreiecke in den VBO speichern und nicht einfach nur die Punkte.
ok kann ich also einfach ne neue klasse nehmen und da immer 3 zu einem dreieck zusammenschließen und dieses dan in das array speichern? oder einfach punkte in der reihenfolge sodass wenn er punkt 1,2,3 4,5,6 nimmt dann dreiecke rauskommen?
ich erhalte ein schönes viereck in der richtigen größe nun muss ich nurnoch testen wie es mit dem shader funktioniert
€ ich ba den shader nochmal angeschalten um zu sehen wie´s funktioniert, doch leider sehen alle blocks gleich aus, muss ich die vor dem neu rendern zurücksetzen? aber erstmal bin ich sehr erstaunt das ich eine landschaft mit 1920x1920 auf 30fps gerendert bekomm das is wirklich gut
Zuletzt geändert von Dropye am Do Okt 14, 2010 22:01, insgesamt 1-mal geändert.
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.