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

Aktuelle Zeit: Mo Jul 21, 2025 18:55

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 09, 2003 11:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 14, 2003 23:00
Beiträge: 24
hi

ich will z.b. ein spielfeld mit mehreren hundert oder tausend spielfeldern machen, wie eine art schachbrett... höhenstufen müssen nicht dabei sein vorerst. jetzt meine frage: wie mach ich das am besten, dass die performance trotzdem noch gut ist? ich will jedes spielfeld texturieren und möchte die "landschaft" auch drehen können... und später objekte darauf platzieren... was wäre also geeignet? habe mal ein versuch gestartet, dass nur das gezeichnet wird was man auc hwirklich sieht... aber ausser eine riesige IF abfrage ist die performance trotzdem nicht akzeptabel gewesen. vielleicht hat jemand nen link zu einem tutorial oder sonst was...?
(hab ne gf4 und xp1.7)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 09, 2003 11:45 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
www.delphigl.de da gibts nen tutorial darüber


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 09, 2003 11:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 14, 2003 23:00
Beiträge: 24
frustum culling ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 09, 2003 12:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
chuckylein hat geschrieben:
frustum culling ?

Jupp...ist auch so ziemlich die einfachste und schnellste Methode um festzustellen, welche Objekte nicht sichtbar sind.

Was in deinem speziellen Fall auch einiges an Performance bringen sollte, wäre das Sortieren und Zeichnen der Felder nacht Texturen, dies ist besonders dann sehr effektiv, wenn du viele verschiedene Texturen hast.

Kleines Beispiel :
Dein Schachbrett hat 16x16 Felder und abwechselnd (wie bei nem echten Schachbrett) ne weisse und ne schwarze Textur.Wenn du dein Feld dann ganz normal so zeichnest :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>for</span> i := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>15</span> <span class='reserved'>do</span>
<span class='reserved'>for</span> j := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>15</span> <span class='reserved'>do</span>
<span class='reserved'>begin</span>
glBindTexture(GL_TEXTURE_2D, Feld[i,j].TexID);
glBegin(GL_QUADS)
[...]
<span class='reserved'>end</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->
Dann muß deine Grafikkarte insgesamt 255 Texturenbindings machen, was sehr kostspielig ist und stark an der Framerate zerrt.Deshalb wärs in diesem Falle dann besser, wenn du nach Texturen sortiert zeichnen würdest, also z.B. so :
<!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre><span class='reserved'>for</span> i := <span class='integer'>0</span> <span class='reserved'>to</span> NumMaterials <span class='reserved'>do</span>
<span class='reserved'>begin</span>
glBindTexture(GL_TEXTURE_2D, Material[i]);
<span class='reserved'>for</span> x := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>15</span> <span class='reserved'>do</span>
<span class='reserved'>for</span> y := <span class='integer'>0</span> <span class='reserved'>to</span> <span class='integer'>15</span> <span class='reserved'>do</span>
<span class='reserved'>if</span> Feld[i,j].Material = Material[i] <span class='reserved'>then</span>
<span class='reserved'>begin</span>
// Feld zeichnen
<span class='reserved'>end</span>;
<span class='reserved'>end</span>;</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3-->

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 09, 2003 13:55 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Eventuell wäre zu Überlegen, ob man für das Frustum Culling einen QuadTree verwendet. Wenn ein Feld sichtbar ist, dann wird es als sichtbar markiert.
Zum Sortieren der Felder nach Texturen möchte ich noch eine Anregung geben. Speichere am besten bei jedem Feld einen Zeiger auf das nächste Feld mit der gleichen Texture. So brauchst du keine IF Abfrage mehr durchführen.
Pro Material mußt du dann noch das erste Feld mit diesem Material speichern.
Alledrings kostet das dann 8 Byte pro Feld zusätzlich.
Code:
  1.  
  2. for i := 0 to NumMaterials-1 do
  3. begin
  4.  glBindTexture(GL_TEXTURE_2D, Material[i].TextureId);
  5.  f:=Material[i].FirstField;
  6.  while assigned(f) do
  7.  begin
  8.   if f.visible then f.Draw;
  9.   f:=f.NextField;
  10.  end;
  11. end;
  12.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 09, 2003 14:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Also wenn's dann ganz schnell gehen soll:
Frustum Culling implementierst du in diesem speziellen Fall am besten nicht über die einzelnen Quads, Quadtree oder OctTree benötigst du (für den Boden) auch keinen - vielmehr brauchst du nur die vier Eckpunkte des Trapezes, die im Frustum liegen, und iterierst deine Zeichenroutine über alle Quads die innerhalb liegen (dann sparst du dem Prozessor viel Rechenarbeit).

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 09, 2003 15:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 14, 2003 23:00
Beiträge: 24
kannste das bissle genauer erklären, lars? ;)
*netgeblickt hat*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 09, 2003 16:44 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Mars's Idee macht bei so einer Ebene Sinn. Ich war jetzt in Gedanken noch von einer Landschaft ausgegangen.
Meine Idee war zu jedem verwendeten Material die erste Fläche zu speichern, die es verwendet. Jede Fläche speichert dann einen Zeiger auf die nächste Fläche die dieses Material verwendet, so daß man dann für jedes Material eine verlinkte Liste von Flächen hat, die dieses Material verwenden.

Bsp:
Fläche Material Nächste Fläche
1 A 2
2 B 4
3 A nil
4 B nil

Material A: erste Fläche 1
Material B: erste Fläche 2

Bei Rendern setzt man das Material und durchläuft die Liste bis es keine nächste Fläche mehr gibt.

Idealerweise sollte man diese Aufteilung aber nicht für das ganze Level sondern immer nur jeweils für einen Block aus z.b. 64*64 Flächen machen. Die genaue Größe kann sich ändern. Wenn man mit Mars's Methode festgestellt hat das so ein Block sichtbar ist, dann durchläuft man für jedes Material, das sich in diesem Block befindet die Liste.


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


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.021s | 17 Queries | GZIP : On ]