[XNA] Sichtbares rausfinden

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    [XNA] Sichtbares rausfinden

    Hi

    Ich hab mal ne Frage zu einer Technik im XNA Framework:
    Und zwar besteht mein Spiel aus einer Auflistung von Entities, die im Moment noch alle gerendert werden (auch wenn sie hinter dem Spieler sind und gar nicht von der Kamera erfasst werden).
    Wie kann ich nun rausfinden, ob eine Position im Sichtradius der Kamera ist oder nicht?

    Nur zur Klarstellung: Ich meine nichts mit RasterizerStates oder so, sondern ob man ein Objekt wirklich sehen könnte, egal ob andere davor sind oder nicht.
    Nö werden sie nicht. Da es auf DirectX basiert müsste man irgendwo die PresentParameter einstellen können (glaub mal dass es dort war). Die GPU müsste den Rest übernehmen. Stell dir mal vor du hast 10mio vertexen und dort überal rechnen ob diese nun sichtbar sind... naja gutenacht.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Vielleicht liegt das auch an meinder Zeichenart, dass das nicht standardmäßig funktioniert?
    Denn ich habe das Modell im Code geschrieben (also jeden einzelnen Punkt definiert) diese dann in Dreiecken zur VertexData hinzugefügt, diese VertexData dann wiederrum in den VertexBuffer geschrieben und dann mit GraphicsDevice.DrawPrimitives() alle gezeichnet.
    Und ich bin mir vollkommen sicher, dass die auch gerendert werden, die hinter der Kamera sind. Ich habe nämlich mal eine Testkarte erstellt, die so viele Objekte enthielt, dass das Spiel leicht gelagt hat. Dann habe ich im Code alle ausgeblendet, die hinter dem Spieler waren (getestet, ob die X oder Z Position kleiner als die Kameraposition ist). Nur leider ist das, wie schon bemerkt, nicht performant und außerdem nicht flexibel. Aber wenigstens lief das Spiel dann auf der Testkarte flüssig.

    Kann man denn das nicht vorher berechnen, wie groß die X oder Z Position sein muss, damit ein Objekt in den Sichtradius fällt? Ich hab auch schon Nebel eingebaut und farPlane eingestellt, aber das bringt irgendwie auch nichts...
    was du in einen VertexBuffer schreibst zeichnest du entweder komplett oder gar nicht. Wenn du nun eine riesige Karte erstellen willst, dann unterteilst du deine Karte ganz einfach in viele kleinere Karten, was nun im Sichtbereich ist und was nicht ist dann eigt. nur noch reine Mathematik. Aber wie wärs, wenn du klein anfängst und erstmal alles hinter der Kamera weglässt, dann kannst weitergehen und anhand von der genaueren Richtung der Kamera vlt. auch Sichtweite und entsprechend natürlich auch dem Blickfeld, was du bei der Kamera angibst mit meistens PI / 4 bzw. MathHelper.PiOver4 oder so ähnlich was nämlich einem winkel von 45° entspricht..

    Edit: btw. die, die nicht sichtbar sind werden nicht gerendert. Aber eben auch an die Grafikkarte geschickt, die entscheidet dann schließlich erst, was denn überhaupt sichtbar ist und das schicken der ganzen Punkte an die Graka kostet eben am meisten Zeit, deshalb vorher aussortieren....
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    und wozu dann der tipp in beitrag 6? was nützt es zu berechnen was sich hinter der kamera befindet, wenn es eh verarbeitet wird? da ist die berechnung nur eine unnötige performance verschwendung...
    es wird nur an die grafikkarte geschickt, wenn du den draw-call dafür aufrufst, somit den einfach weglassen-> keine unnötige Verschwendung...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    alles klar, danke. ich hatte heute vormittag spontan lust mir mal XNA 3D anzusehen, habe jedoch noch nicht die zeit gefunden ein testprojekt anzugehen - deswegen mein interesse an diesem thread. (ich versuche mich immer vorher fundiert zu belesen ;) ) das war mir noch nicht bekannt. gut zu wissen :thumbup:
    Frustum Culling war DAS Stichwort!!!

    Vielen Dank an alle, die mir beim Lösen des Problems geholfen haben.

    Genauso wollte ich das ja haben: nur das, was im Sichtbereich (dem Viewing Frustum) ist, soll auch zur Grafikkarte übergeben werden. Mit ner einfachen BoundingBox.Contains(BoundingFrustum) = ContainmentType.Intersects funktioniert das ganze.
    Und wie findest du raus, ob du ihn weglassen solltest oder nicht?

    Nur zur Info, das Grobe des Frustum Cullings hab ich erklärt, eigt. wollte ich ja, dass er selbst sich da was zusammenbastelt, so hab ichs auch gemacht und bin relativ näh an die Lösung anderer gekommen, denn so lernt man und versteht auch.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---