Einzelnen Beitrag anzeigen

Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Z-Buffering (Mal wieder ^^)

  Alt 25. Apr 2016, 10:37
Hey,

danke das ihr euch Zeit genommen habt mein Anliegen anzusehen

Zitat von Namenloser:
Den Code habe ich jetzt nicht nachvollzogen, aber deine Beschreibung klingt für mich, als hättest du mehr oder weniger Ray Tracing neu erfunden. Vielleicht solltest du komplett auf Ray Tracing setzen, dann kannst du auf die „Zwischen-Bitmaps“ und auf den Z-Buffer verzichten. Dadurch sollte das ganze nicht nur speichereffizienter sondern auch einfacher werden. Doom I und II haben übrigens auch Ray Tracing verwendet.
Ja du hast so ziemlich genau Recht (hätte ich auch nicht anders von dir erwartet ), ich versuche den Z-Buffer hinzubekommen in dem ich jedes Polygon auf einen Bitmap zeichne und dann die Tiefe jedes gezeichneten Pixels berechne. Nach dem ich dies für alle gemacht habe, zeichne ich die Pixel aller Ebenen auf das "End-Bild" wobei nur die Sichtbaren (anhand der berechneten Tiefe) gezeichnet werden, bzw die nicht sichtbaren überschrieben.

Ich habe mir Ray Tracing angesehen, aber da habe ich wieder ähnliche Probleme mit der Mathematik und werde wieder nachfragen müssen und um das Isometrisch hinzukriegen müsste ich wieder rum experimentieren, da würde ich lieber einfach schnell meine Idee ausprobieren und falls das klappt in meine schon funktionierende Orthogonale Render-Umgebung implementieren :/

Ich glaube ich habe das Problem auch gefunden und zwar liegt es wahrscheinlich an der Berechnung eines Pixels vom 2-Dimensionalen in den 3-Dimensionalen Raum. Das wäre der erste Code-Teil den ich gepostet habe. Die Berechnung stimmt so nicht und muss auf eine andere weise berechnet werden, muss wohl noch ein wenig nachforschen. Und wenn die Berechnung klappt wird der Z-Buffer ziemlich sicher funktionieren. Über jede Hilfe bin ich natürlich sehr dankbar.

Du hast dir aber viel vorgenommen ...
Am Besten schaust du mal wirklich bei den Profis nach, wie das gemacht wird.

Wenn ich deine Schleifen sehe
Delphi-Quellcode:
 for x := 0 to 499 do // Hier wird noch mal die finale Matrix erstellt
    begin
      for y := 0 to 499 do
      begin
        for c := 0 to Buffers.Count-1 do
        begin
vermute ich mal das es schnell ein Performance und Speicher Problem geben wird, je nachdem wieviele
Ebenen du brauchst.
Ich bin mir bewusst dass das wie es jetzt ist nicht wirklich gut ist, jedoch hatte ich mit dem Code wie gesagt nur vor zu testen ob die Möglichkeit wie ich es mir erdacht habe wirklich funktioniert. Die 3^for-schleife liesse sich ganz einfach um ein vielfaches schneller machen indem man die 3. mit der 1. tauscht und dann nur noch die tatsächliche 2D Breite und Höhe jeder Ebene durchgeht. Dann könnte ich das Bild noch in mehrere Teilen und mit mehreren Threads arbeiten und das speichern der Pixel auch viel Resourcem freundlicher lösen und so weiter, da ist noch vieles das man am code ganz einfach optimieren kann... Geschätzt sind das bestimmt 80% weniger die das Programm durch Schleifen und Berechnungen muss. Wie gesagt, der Code ist keinesfalls optimiert und nur da um die Theorie zu "beweisen"

Ich glaube auch nicht das ich mir da "zu viel vorgenommen" habe, denn theoretisch sollte es mit der Methode, wie ich es mir so denke, ja eigentlich wirklich einfach sein, sobald die Formeln stimmen.

Zitat von P_G:
Deshalb ist Backface culling ja so ein komplexes Thema, und es gibt sicher ein viele mathematische Tricks dazu.
Backface-Culling ist nicht mehr das Problem, das konnte ich eigentlich ziemlich einfach lösen und funktioniert tadellos

Such mal nach "Peter Bone" und "Engine3D" (http://www.glorioustrainwrecks.com/m.../engine3d.html). Der hat vor Jahren Backface-Culling und Z-Buffering in eine kleine Delphi-Engine integriert, die allein mit dem Canvas und ohne OpenGL oder DirectX arbeitet. Vielleicht hilft dir das (zu Studienzwecken) weiter.
Auf der oben genannten Seite kann man nicht mehr auf die zip-Datei zugreifen, aber das ganze schwirrt noch im Netz herum - einfach mal suchen...
Danke für den Link hab sowas für Delphi nirgends gefunden! Werde ich mir ansehen aber ich glaube DAS ist wirklich zu komplex Und vorallem ist das leider nicht orthogonal :/
Milos
  Mit Zitat antworten Zitat