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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

13.02.2013, 13:40

Portal Culling: Wie transformiert man die ViewFrustums durch die Portale?

Hi,
ich habe mich endlich dazu durchgerungen, mal mit Portal-Based Rendering anzufangen :D
Aber leider fehlt mir noch genau ein Algorithmus - bei dem ich nur ungerne das Rad neu erfinden will:

wie transformiere ich die jeweils neuen ViewFrustums die durch die Portale 'schauen'?

Ich habe wirklich schon mehrfach im Web Infos zu dem Thema gesucht und immer wird nur die grobe Theorie erklärt und nette Bildchen dazu gezeigt.
Aber der eigentliche Knackpunkt des Problems wird nicht näher erleutert.

Hier ein Beispielbild:

(Link)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

13.02.2013, 16:16

Mit Portalen meinst du jetzt aber nicht solche wie in "Portal", oder?

Wenn du "normale" Portale meinst:
Du musst das Frustum halt einfach so einschränken, dass es nur durch das Portal schaut.
Also die Seiten einengen und die Clipping-Planes anpassen.
Dass du dabei ein asymmetrisches Frustum kriegst, sollte klar sein.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

13.02.2013, 16:18

oIch bin mir nicht sicher was dein Problem ist. Ich habe mich mit dem Thema jetzt nicht beschäftigt, aber kannst du die Welt nicht einfach aus Sicht des Portals rendern, das Ergebnis in eine Textur hauen und dann auf dein anderes Portal drauf rendern? Oder war das gar nicht deine Frage?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

4

13.02.2013, 16:33

Hoffe das hilft dir.
Musst dich leider durch etwas Code quälen.

http://www.visualizationlibrary.org/docu…cpp_source.html

Die Methoden SceneManagerPortals::extractVisibleActors()/SceneManagerPortals::visitSector() wären für dein Problem relevant. (Zeilen 136/164)
Ab Zeile 204 wird "erklärt" wie das neue Frustum berechnet wird.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CentuCore« (13.02.2013, 16:56)


5

13.02.2013, 16:51

Ohne das selbst je implementiert zu haben, hier ein paar Gedanken:

Der einzige Sinn der ganzen Sache ist es doch, mehr Objekte wegclippen zu können, um renderzeit zu sparen. Im Grunde genommen änderst du also nicht die Kamera, sondern nur das, was geclippt wird. Würdest du dein Clipping-Frustum als Kamera-Frustum benutzen, wäre der Teil vom Raum, den du siehst, auf einmal nicht so groß wie die Tür, durch den du ihn siehst, sondern würde den gesamten Bildschirm bedecken.
Du änderst also an der Kamera gar nichts, sondern benutzt bloß andere Clippin-Planes um den hinteren Raum zu rendern. Dabei wird eine Lösung vermutlich nicht optimal sein, denn Portale können komische Formen haben (im allgemeinen) und du willst vielleicht nicht beliebig viele Clippingplanes haben. Also musst du irgendwie z.B. 4 Planes finden, in denen das gesamte Portal liegt. Im einfachsten Fall nimmst du immer ein Achsenausgerichtetes Rechteck um das Portal, wenn du Drehungen zulässt wird es in manchen Fällen besser passen, oder du versuchst halt wirklich die besten Ebenen auszurechnen - die Frage ist natürlich wie viel Rechenzeit das benötigt und am Ende wieder einspart.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

13.02.2013, 17:18

Mein erster Ansatz wäre: Das Portal auf die Bildebene projizieren und ein Bounding Rectangle bestimmen. Die Rückprojektion davon gibt dir dann 4 Ebenen, die das Portal umschließen...

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

7

13.02.2013, 19:22

Danke schon mal für eure Tips :-)

@David: Der Ansatz ist mir schon klar, aber es interessiert mich nur noch wie man die ViewFrustum Planes durch das Portal transformiert.
Und ja, ich meine nicht die Portale wie in Valves "Portal" ^^.

@dot: Einen ähnlichen Ansatz hatte ich mir auch schon überlegt, aber was ist wenn ein paar Ecken des Portals hinter der Near-Clipping Plane des aktuellen ViewFrustums sind?

@Schorsch: Es geht um Culling. Also will ich nicht erst die ganzen Objekte in eine Texture rendern und dann auf's Portal 'mappen'.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

14.02.2013, 00:04

@dot: Einen ähnlichen Ansatz hatte ich mir auch schon überlegt, aber was ist wenn ein paar Ecken des Portals hinter der Near-Clipping Plane des aktuellen ViewFrustums sind?

Naja, dann müsstest du die entsprechenden Kanten gegen die Near-Plane clippen. Ich würds mit dem Culling aber nicht zu genau nehmen und in dem Fall kann man sehr wahrscheinlich einfach sagen, dass das in der Regel wohl bedeutet, dass die Kamera praktisch im Portal steht und es gut genug ist, dann einfach gleich das vollständige Frustum zu verwenden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (14.02.2013, 00:10)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

14.02.2013, 11:35

Ah ich glaube wir sprechen hier vor allem von einer anderen Art von Portalen;) Passt, der Rest weiß ja was du vor hast. Was Culling ist ist mir schon bewusst. Egal ich schalte mich hier raus und lass den Rest helfen;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

14.02.2013, 15:22

Die Portale in Portal werden übrigens nicht über Render to Texture gemacht, sondern mit Hilfe des Stencil Buffer direkt auf den Back Buffer gemalt. Hat mich damals auch ein wenig überrascht, macht aber Sinn (Performance, Bildqualität, Multisampling unter D3D9 etc.)... ;)

Werbeanzeige

Ähnliche Themen