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

Aktuelle Zeit: So Jul 13, 2025 20:22

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



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 02:38 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Hallo,

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.

lg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 07:57 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Wie ist denn dein Vertex Array aufgebaut ?
Nutzt du eine Index tabelle (Indices) ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 08:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 13:03 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ja den shader nutze ich :D 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;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 13:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
trotz anleitung forenbeiträge und ettlicher versuche noch nie geschaft habe auch nur 1 dreieck aus einem vbo zu rendern

Sollte es daran liegen, dass deine Vertices Integer Koordinaten haben, OpenGL bzw. der VBO aber Floats braucht?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 13:54 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 14:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 14:19 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Eine kurze Google-Suche sagt mir das Real wahrscheinlich 48bit hat. Also was ganz krummes.
jepp. und kann soweit ich weiß kein 0 und kein unendlich. Dürft noch aus der zeit kommen, als es noch keine FPUs gab.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 17:16 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
achso ok ich werd das mal umbasteln ich melde mich wenn es arge probleme gibt :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 21:08 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ok ich denke es is ok wenn ich gleich den thread hier nehme oder? will ja nich alles mit ättlichen fragen von mir zumüllen XD

also ich hab das VBO erstellt und da daten reingepackt allerdings wirkt es etwas verkorkst

ich hab das reinpacken der daten so gelößt

Code:
  TVertex = packed record
    X,Z : Single;
  end;

  TTerrainBlock=class
    TerrainV : array[0..(64*64)] of TVertex;
    VBO : gluint;
[...]

constructor TTerrainBlock.Create();
var x,y,z : Integer;
begin
z := 0;
   for x := 0 to 63 do
    for y := 0 to 63 do begin

      TerrainV[z].X := X;
      TerrainV[z].Z := Y;
      inc(z);
    end;

  glGenBuffers(1, @VBO);
  glBindBufferARB(GL_ARRAY_BUFFER, VBO);
  glEnableClientState(GL_VERTEX_ARRAY);
  glBufferDataARB(GL_ARRAY_BUFFER, 64*64*SizeOf(TVertex), @TerrainV, GL_STATIC_DRAW);
end;


das ganze sieht gerendert als GL_TRIANGLES dann etwa so aus was ja aber noch nich so ganz das is was man jetzt erwartet hätte

Bild

benöte ich unbedingt ein IBO dazu? Coolcat hatte schonmal eines gepostet doch leider kann ich c code nur schlecht interpretieren


Zuletzt geändert von Dropye am Do Okt 14, 2010 21:11, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 21:10 
Offline
DGL Member
Benutzeravatar

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 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: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 21:13 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
wow das ging schnell :D

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?

Zitat:
1 2 3
4 5 6
7 8 9


und nicht
Zitat:
1 2 4
3 5 6


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 21:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 21:31 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Allgemeiner Speicherverbrauch
BeitragVerfasst: Do Okt 14, 2010 21:50 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ok ich hab das einfach mal ausprobiert und sieheda es klappt wunderbar gelößt hab ich die sache nun so

Code:
  TVertex = packed record
    X,Z : Single;
  end;

  TTriangle = packed record
    ver : array[0..2] of TVertex;
  end;

  TTerrainBlock=class
    TerrainV : array[0..8192] of TTriangle;
    VBO : gluint;
[...]

constructor TTerrainBlock.Create();
var x,y,z : Integer;
begin
z := 0;
   for x := 0 to 63 do
    for y := 0 to 63 do begin

      TerrainV[z].ver[0].X := X;
      TerrainV[z].ver[1].X := X+1;
      TerrainV[z].ver[2].X := X;
      TerrainV[z].ver[0].Z := Y;
      TerrainV[z].ver[1].Z := Y;
      TerrainV[z].ver[2].Z := Y+1;
      inc(z);

      TerrainV[z].ver[0].X := X;
      TerrainV[z].ver[1].X := X+1;
      TerrainV[z].ver[2].X := X+1;
      TerrainV[z].ver[0].Z := Y+1;
      TerrainV[z].ver[1].Z := Y;
      TerrainV[z].ver[2].Z := Y+1;
      inc(z)
    end;

  glGenBuffers(1, @VBO);
  glBindBufferARB(GL_ARRAY_BUFFER, VBO);
  glEnableClientState(GL_VERTEX_ARRAY);
  glBufferDataARB(GL_ARRAY_BUFFER, 8192*SizeOf(TTriangle), @TerrainV, GL_STATIC_DRAW);
end;


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.

Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]