AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Aufbau von Klassen für 3D rendering

Ein Thema von roboter202 · begonnen am 1. Jan 2012 · letzter Beitrag vom 2. Jan 2012
Antwort Antwort
roboter202

Registriert seit: 6. Mär 2011
98 Beiträge
 
Delphi 6 Professional
 
#1

Aufbau von Klassen für 3D rendering

  Alt 1. Jan 2012, 18:16
Hallo,

Ich hab zwar schon etwas Erfahrung was die Verwendung von OpenGL angeht aber mich würde interessieren wie man am besten die Spiel eigene "Welt" zeichnen kann. Ich dachte Daran eine Vaterklasse für alle zeichnbaren Objekte anzulegen. Darunter gibt es dann die entsprechenden "Objekte" die alle die Methode zeichnen geerbt haben. Bei zeichnen der Welt müsste man dann alles geladenen Objekte der Szene durchlaufen und bei bedarf deren zeichnen-Routine aufrufen.

Delphi-Quellcode:
for i := 0 to Scene.ObjectsCount - 1 do
begin
  if Scene.Objects[i].mustBeDrawn then Scene.Obejcts[i].draw;
end;
Beim durchstöbern von Code anderer Programme z.B. Minecraft hab ich aber herausgefunden das nicht das Objekt selbst die OpenGL befehle ausführt sondern nur Daten an einen Tesselator sendet der dann die Vertexe an die Grafik sendet.

Ist meine Lösung akzeptabel?
Gibt es andere, bessere Lösungen?
Christian
i := 0 ; While i = 0 do beep ;
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Aufbau von Klassen für 3D rendering

  Alt 2. Jan 2012, 00:54
Minecraft ist wegen seiner Voxel-Welt ein Spezialfall. Im Grunde würde da ja jeder Würfel für sich gezeichnet werden, was aber nicht nötig ist, da oftmals eine Menge von Würfeln einfach nur eine große Fläche ergeben. Daher ist dort noch eine Zwischenschicht, die von den Objekten gesagt bekommt: "So würde ich gerne aussehen", der Tesselator weiss aber im Gegensatz zum einzelnen Objekt, dass es in der Nachbarschaft noch andere gibt, durch die sich das vereinfachen lässt.

Es gibt ganz grob zwei mögliche (und praktizierte) Wege in "normalen" 3D-Szenen:
1) Jeder zeichnet sich selbst
2) Jeder übergibt seine Randdaten an einen Renderer, der dann abschließend alles in einem Rutsch zeichnet

Nummer 2 hat den großen Vorteil, dass man durch entsprechend intelligentes Gruppieren seine Resourcen effizienter nutzen kann, und vor allem weit weniger State-Changes auslöst (Wechsel von Shadern, Texturen, Buffertypen), aber eben erkauft durch den Overhead einer Verwaltungsschicht. Der Gewinn ist dann eher bei komplexeren Szenen zu erwarten. Bei Methode 1 muss man auch ein wenig drauf achten, dass jedes Objekt seinen Durchlauf immer sauber verlässt, also Matrixstack anfangs gepusht, nachher gepoppt, States zurück gesetzt, etc. pp., sonst kann es mal passieren, dass das bloße Zeichnen eines Teils alle nachfolgenden bzw. untergeordneten Teile ungewollt beeinflusst.
1 ist also eher Quick & Dirty für kleinere überschaubare Dinge, Nummer 2 ist aufwendiger in Implementierung und (zunächst) Laufzeit, lohnt sich aber in aller Regel schon.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Aufbau von Klassen für 3D rendering

  Alt 2. Jan 2012, 10:45
Schau dir doch mal GLScene an - und sei es nur um Anregungen zu bekommen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Aufbau von Klassen für 3D rendering

  Alt 2. Jan 2012, 12:27
Oder Asphyre Sphinx 2
Markus Kinzler
  Mit Zitat antworten Zitat
roboter202

Registriert seit: 6. Mär 2011
98 Beiträge
 
Delphi 6 Professional
 
#5

AW: Aufbau von Klassen für 3D rendering

  Alt 2. Jan 2012, 13:46
Vielen dank ich werde mir das mal anlesen.
Also macht Minecraft es so wie bei der 2. Methode um nachher zu optimieren.
Christian
i := 0 ; While i = 0 do beep ;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz