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

Aktuelle Zeit: Di Jul 15, 2025 00:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Raumunterteilung und Optimierung
BeitragVerfasst: Di Okt 21, 2003 08:53 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tach,

ich komm heute mal mit einer etwas komplexeren frage, ich versuche momentan mein weltformat zu optimieren.

ich hab im moment ne extrem einfache welt struktur, die einfach viel zu langsam ist :(
Hat auch noch keine optimierung wie displaylisten oder VBO, da ich das erst implementieren wollte nachdem das format an sich optimiert ist.

Hier man ein paar daten wie das format aufgebaut ist:


Code:
  1.  
  2. type
  3.   // ***************************************************************
  4.   // Welt Position, Normale Vector
  5.   // Tangente, BiNormale Vector
  6.   // Light und HalfAngle Vector (endgültiger bumplight vector)
  7.   // Texture Koordinaten array, meinstens immer Length = 1 bei einer decal texture
  8.   // ***************************************************************
  9.   TR3DVertex = record
  10.     Position,
  11.     Normal,
  12.  
  13.     Tangent,
  14.     Binormal,
  15.  
  16.     Light,
  17.     HalfAngle : TR3DVector;
  18.  
  19.     Texcoords : array of TR3DTexcoord;
  20.   end;
  21.  
  22.   // ***************************************************************
  23.   // Start Index im Face Array
  24.   // End   Index im Face Array
  25.   // Position, Rotation, Skalierung
  26.   // AABB Index im AABB Array
  27.   // Schatten für das Objekt aktiviert ?
  28.   // ***************************************************************
  29.   TR3DObject = record
  30.     StartFaceIndex,
  31.     EndFaceIndex : Integer;
  32.     Position,
  33.     Rotation,
  34.     Scale        : TR3DVector;
  35.     AABBIndex    : Integer;
  36.     DrawShadows  : Boolean;
  37.   end;
  38.  
  39.   // ***************************************************************
  40.   // StartIndex im Vertices Array
  41.   // Der Name unseres Shaders
  42.   // Der Absolute Index unseres Shaders (mit diesem wird gearbeitet)
  43.   // Tangente, BiNormal und Poly Normale
  44.   // ***************************************************************
  45.   TR3DFace = record
  46.     VerticeIndex : Integer;
  47.     ShaderID     : String;
  48.     ShaderIDX    : Integer;
  49.     Basis        : TR3DOrthoNormalBasis;
  50.   end;
  51.  
  52.   // ******************
  53.   // Unsere Welt Klasse
  54.   // ******************
  55.   TR3DWorld = class(TObject)
  56.   private
  57.     fPointLights       : array of TR3DPointLight;  // Punktlichter
  58.     fSpotLights        : array of TR3DSpotLight;   // Spotlichter
  59.     fShaders           : array of TR3DShader;      // Shaders
  60.     fVertices          : array of TR3DVertex;      // Vertices (Vectors)
  61.     fFaces             : array of TR3DFace;        // Faces
  62.     fObjects           : array of TR3DObject;      // Objekte
  63.     fTextures          : TR3DTextureManager;       // Texture Library
  64.     fAABBs             : array of TR3DAxisAlignBoundingBox; // Bounding     Boxes
  65.   end;
  66.  
  67.  


gerender wird ungefähr so:

Code:
  1.  
  2. procedure TR3DWorld.DrawWorld(_Lightmode : Integer);
  3. var
  4.   I, J    : Integer;
  5. begin
  6.   For I := 0 to High(fObjects) do
  7.   begin
  8.     For J := fObjects[I].StartFaceIndex to fObjects[I].EndFaceIndex do
  9.     begin
  10.       DrawPolygon(J, I, _Lightmode);
  11.     end;
  12.   end;
  13. end;
  14.  


DrawPolygon rendert per glBegin(GL_TRIANGLE_STRIP) ein Triangle mit 3 Points.


Nun meine frage, was wäre das beste das ganze zu optimieren, was für eine Raumunterteilung könnte man machen.

Danke schonmal fürs durchlesen,
Final

Achja ehe ichs vergesse, wens interessiert wie das ganze aussieht, der guckt unten bei meiner signatur, da gibts nen link "radical3D Engine". ;)

Direktlink is: Template


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 21, 2003 16:33 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ich würde auf jeden Fall eine Hierachie da einbauen. Aus den Bounding Boxen der Modelle könnte man z.B. einen Baum mit jeweils 2 Unterknoten machen. Eine andere Idee wäre Sektoren und Portale zu definieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 21, 2003 16:51 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Was ist der Unterschied zwischen Sektoren und Portale?

Sektoren, nen Array aus Objekten
und Portal ein Index welches auf zwei Sektoren zeigt... also den vorherigen und den nächsten sektor.

???


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 21, 2003 19:07 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ja, so in etwa. Ein Sektor muß nicht zwangsläufig ein Leaf im BSP Baum sein. Ein Sektor enthält alle Objekte in diesem Sektor, die man eventuell noch mal in einen Baum innerhalb des Sektors einfügen kann.
Ein Portal benötigt zwei Verweise auf die beiden Sektoren die es verbindet und da ein Portal ja eine Fläche ist, braucht man auch noch die Eckpunkte. Außerdem muß man feststellen können, in welchem Sektor sich gerade die Kamera befindet. Deshalb muß dem Sektor auch irgendwie ein Volumen z.B. eine Brush zugeordnet werden.
Außer Portalen gibt es aber noch weitere Möglichkeiten. Man könnte auch AntiPortale definieren, und von der Kamera aus berechnen welche Objekte durch diese Flächen verdeckt werden. Bei Außenleveln macht das mehr Sinn als Portale. Außerdem kann man ab eine GF3 auch NV_occlusion_query benutzen. Es gibt unter http://www.inf.bme.hu/~kenez/occl.html eine Demo(leider ohne Quelltext) die eine Szene mit 22 Millionen Dreiecken ohne Vorberechnung mit nv_occlusion_query darstellt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 22, 2003 09:28 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Hmm, also müsse ich um z.b. einen Sektor zu definieren, nen Brush um paar Objekte ziehen, berechne den am besten zu ner AABB um, und prüf dann später welche objekte sich im aabb befinden.
Dann definiere ich davor, z.b. ne tür Brush wo ich dann portal als nehme wo den index für diesen sektor und den vorherigen sektor enthält.

Nur eins ist scheisse die übersichtlichkeit beim levelbaun geht dadurch verloren :(, wenn ich z.b. nen monster level habe und mach daraus z.b. 20 sektoren, und dann natürlich auch 10 portale, dann würde ich später im editor nru noch die Sektoren Quads sehen, und müsste erst mich mit der camera reinbewegen das ich weiter arbeiten kann.

Wenns, so wäre das es nur ganz leicht sichtbar wäre, dann wäre es natürlich besser.

Wenn man jetzt z.b. an der wand steht und das portal is hinter einem, dann brauch er schonmal den sektor nich zeichen, also würde ne Point-Plane Intersection da schon reichen oder ?.

Mir ist aber eins nich klar, woher soll man aber später wissen in welchem Sektor man sich befindet, prüft man dann ganz einfach ob sich die Player AABB im sektor befinden oder ?


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]