Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

21.10.2013, 18:29

Was genau meinst du mit "VBOs mit diesen Strukturen verbinden"!?

12

21.10.2013, 20:36

Angenommen, ich habe hier mehrere Modelle, deren Daten in VBOs geladen wurden. Nun habe ich mehrere Instanzen dieser Meshs. Woher weiß ich jetzt, ob sich nicht eine Instanz, mit ihren im VBO definierten Vertices von einem Würfel in den nächsten bewegt hat? Denn dann müsste ich jeden Frame alle Objekte durchprüfen. Und da glaube ich nicht, dass das effektiv wäre. Dann lieber normales Frustrum culling.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

21.10.2013, 21:30

Naja, du würdest natürlich nicht alle Vertices checken. Wenn es nur um Culling geht, würdest du generell nur auf Ebene ganzer Objekte arbeiten und dabei einfach nur z.B. Bounding Boxen betrachten...

14

21.10.2013, 22:42

Zu den Caches: Ist es dementsprechend sinnvoll, wenn ich eine Art Suchfunktion nach Shader / Program bzw. Texturen implementiere?

Ich meinte Tatsächlich Caches, also den schnelle, aber kleinen Zwischenspeicher für CPUs (bei meinem zweiten Punkt).

Was du mit der Suchfunktion meinst, verstehe ich ehrlich gesagt nicht und Shader/Texturen hört sich auch eher nach meinem dritten Punkt an (wo ich Changes und nicht Caches meinte :D).
Ich habe bei mir einfach eine Renderjob Liste und einen Vergleichsoperator für Renderjob-Objekte. Damit kann ich meine Renderjobliste (bzw. den Vektor) sortieren und beim Rendern dann jedesmal schauen, ob sich eine Textur oder ein Shader geändert hat und entsprechend nur dann neu setzen. Im Grunde sehr einfach, aber wenn man oft dieselbe Textur benutzt, bringt das wirklich viel.
Lieber dumm fragen, als dumm bleiben!

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

15

21.10.2013, 22:58

Ich mache es so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Mesh{
    // deine VBOs
}

3dObjekt{
    BoundingBox bb, Position p, Mesh* m, bool sichtbar;
}

Octree{
    Octree* Teile[8];

    einfügen(3dObjekt){
        // alle Teile durchlaufen, testen ob BoundingBox+Position innerhalb davon (einer oder mehrere), wenn Teil weitere Teile hat -> you guess
    }

    update(){
        // alle 3dObjekte durchlaufen, culling test mit hilfe des Octrees -> sichtbar true/false
    }
}

Renderer{
    render(){
        if(einObjekt->sichtbar){
            // rendern...
        }
    }
}

16

22.10.2013, 17:56

@DeKugelschieber: Das ist so ziemlich das, was ich wissen wollte, danke dir :thumbsup:. Du fügst die Objekte also ein, und merkst dir eine BoundingBox. Wenn sich ein Objekt bewegt, prüfst du das einfach in der Update-Methode, und platzierst, das ganze evtl. um, richtig? Was mir etwas schleierhaft ist, ist warum du das Culling in der Update-Methode durchführst, aber ich glaube nicht, dass das groß einen Unterschied macht. Danke dir, das war die Antwort!

@Jonathan_Klein: Diese Liste ist etwa das, was ich mit der Suchfunktion meinte. Ich wollte eine Möglichkeit, alle Objekte zu "suchen" die eine bestimmte Textur benutzen. Das dürfte in etwa hinkommen.

Danke euch allen, ich glaube, ich weiß jetzt, wie ich den Octree und die anderen Optimierungen implementiere. Danke euch!

Liebe Grüße,
~ EuadeLuxe ~

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

17

22.10.2013, 18:58

Zitat von »EuadeLuxe«

Wenn sich ein Objekt bewegt, prüfst du das einfach in der Update-Methode, und platzierst, das ganze evtl. um, richtig?

Du kannst es so machen, ja. Ich hab mich hiermit auf hauptsächlich statische Objekte bezogen.

Die update Methode soll dann im main loop aufgerufen werden und prüft mit dem aktuellem Kamera frustum ob Teile sichtbar sind oder eben nicht, macht also nicht weiter als sichtbar auf true/false zu setzen:

Quellcode

1
2
3
4
void mainLoop(){
    octree->update();
    renderer->render(); // hat jetzt alle 3dObjekte mit sichtbar true/false und rendert entsprechend. Im nächsten frame wird neu gecullt (brauchst du nicht wenn die Kamera sich nicht bewegt)
}


Um bewegliche Objekte einzufügen macht es evt. Sinn einfach noch eine bool Variable zu nehmen und diese auf true zu setzen wenn du das Objekt bewegst. Dann kann der Octree gucken ob dies so ist und das Objekt in eine andere Box/Boxen einfügen (Teile).
Da das ganze aber eher langsam ist (ein Octree wird schnell groß!), würde ich hauptsächlich statische Objekte einfügen. Für große Gruppen von z.B. Einheiten kannst du dann eine Box um die Gruppen nehmen und damit testen. Lieber zu viel rendern als zu viel cullen ;)

Kleiner Tipp noch: cull einfach mit Kugeln, das ist schneller und wie gesagt: ein bisschen zu viel rendern tut weniger weh als "hohe" CPU Last (je nachdem wie viel du da cullen willst und wie viele vertices die einzelnen Modelle haben).

18

22.10.2013, 21:34

Ja, das habe ich mir auch gedacht. Also ich halte dann mal fest: Statische Objekte: Octree, dynamische Objekte: normales Frustrum culling oder Bounding Volume Hierarchy, oder aber Bounding Sphere. Terrain: evtl. LOD.

Bisher implementiert habe ich schon die BoundingSphere, und das Frustrum culling. Also von daher sollte der Rest relativ einfach jetzt gehen. Danke dir! Vor allem wegen der Antwort zu den dynamische Objekten! Das war echt hilfreich! Beim Terrain muss man wohl dennoch auf die Vertices zugreifen, oder? Ich meine, wenn man immer das gesamte Terrain rendern würde, wäre das bei Außenwelten, viel zu groß, oder? Aber dafür kann ich auch einfach eine extra Klasse einfügen ;).

Ich glaube ich unterschätze immer wieder die CPUs und GPUs. Ich will immer alles so effizient wie möglich gestalten, und denke dadurch viel zu kompliziert auf einmal.
Danke für die Antworten, das war echt klasse!

#EDIT: Gerade eben nochmal auf etwas gestoßen: Was bitte ist denn ein "dynamischer Octree"? Hier ein Video:


Liebe Grüße,
~ EuadeLuxe ~

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

19

23.10.2013, 07:08

Für Terrain würde ich auch eher ein LOD System nehmen (welches spielt ja erstmal keine Rolle).

Zitat

Was bitte ist denn ein "dynamischer Octree"?

Eigentlich nichts weiter als das was wir schon hatten. Also Neueinordnung von bewegten Objekten.
Ein Tipp noch: merke dir nur die Boxen in denen auch tatsächlich etwas ist. Leere Boxen solltest du natürlich nicht prüfen!

20

23.10.2013, 14:31

Was bitte ist denn ein "dynamischer Octree"?

Na alles und gar nichts. Bei so Themen gehen die Begrifflichkeiten ganz schnell durcheinander, und dann heißen unterschiedliche Dinge auf einmal gleich und andersherum. Ein Octree ist zum Beispiel auch eine Art Bounding Volume Hierarchy.

Wenn du Octrees benutzen willst: Hast du dir schon Gedanken darüber gemacht, was mit Objekten passiert, die auf der Kante sind? Im Allgemeinen haben Figuren ja eine Ausdehnung, und können damit nicht mehr eindeutig einen von mehreren Unterknoten zugeordnet werden. Bei statischer Geometrie kann man (wenn man es denn unbedingt möchte) einfach die Dreiecke teilen, aber Spielfiguren wird man im allgemeinen nicht teilen wollen.

Und dann wären da noch so fragen wie "wie genau unterteile ich meinen Octree". Du könntest entlang jeder Achse immer die Hälfte nehmen. Wenn du eine große, flache Karte hast, kannst du damit 3-4- mal unterteilen, dann ist jede Box so flach, das kein einziges Objekt mehr herein passt, obwohl die Ausdehnung entlang der anderen Achsen immer noch mehrere Meter groß sein kann.

Hast du überhaupt schon probiert, wie die Performance nur mit Frustum-Culling ist? Bist du dir überhaupt sicher, dass du zwingend einen Octree benötigen wirst?
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige

Ähnliche Themen