Jump to content
Unity Insider Forum

weak reflections


bitwiseio

Recommended Posts

Hallo Leute,

vielleicht könnt ihr mir weiter helfen, ich arbeite gerade mit reflection probes, die ich als child an die cam gehangen habe, sieht auf dem Boden auch erstmal recht schick aus, jedoch habe ich dort 2 ziemlich gravierende Probleme.:

1. Reflektionen sind auf den Wänden verdreht, als würde man von oben in den Raum rein schauen
2. Reflektionen verschieben sich auf dem Boden und in den Wänden/Scheiben anhand der Spielerposition obwohl folgende settings eingestellt wurden (realtime, every frame, no timeslicing), jedoch erst nach dem Build, im Editor hat es vorher funktioniert

Ich hoffe Ihr könnt mir helfen, ich sitze an diesen problem nun schon seit Tagen.

edit: Wenn ersteinmal nur das 2. Problem behoben werden könnte, wäre mir schon sehr geholfen. 🙏

LG bitwiseio

relection.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Reflection Probe als child einer cam? Sowas habe ich noch nie gesehen.

Normalerweise werden Reflection Probes statisch in der Welt platziert. Ich kann mir auch gut vorstellen, dass die Probleme dadurch verursacht werden. Das 1. Problem möglicherweise durch die Rotation der Kamera und somit auch des Reflection Probes und das 2. weil Reflection Probes nicht dazu konzeptioniert sind, bewegt zu werden (Korrigiert mich bitte, wenn ich hier falsch liege).

Ich schlage einfach mal vor, dass du mehrere statische Reflection Probes in deine Szene platzierst oder dir mal das Screenspace reflection / Planar Reflection als alternative anschaust.

Bei mehreren Realtime Reflection Probes könnte aber es genaus wie wie zuviele Planar-Reflections schnell zu Performance-Problemen kommen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo SkipToPlay,

danke für die schnelle Antwort, ich arbeite grad mit der urp und plane ein Build fürs Web, daher kommt ssr für mich leider nicht in frage, hätte es sonst gern verwendet.
Eine statische Positionierung habe ich schon versucht, jedoch hat sich beim bewegen des Characters die reflektion dort auch mit bewegt und stimmte nicht mit den Objektkanten überein(Problem 2), deshalb habe ich diese an die Usercam gehangen(3rd Person Cam), habe dadurch auch ein super Ergebnis erzielt, um die ganzen Möbel auf dem Boden zu reflektieren. jedoch verhält sich nach dem Build die reflektion wie eine Baked reflektion, hätte gedacht, dass es an irgendeiner Einstellung liegen könnte.

Eine statische reflektion probe die auf realtime gestellt ist bekommt ja auch in Echtzeit reflektionsupdates rein, daher denke ich sollte eine bewegte probe da kein problem darstellen. Der run um Editor funktioniert ja auch, nur nach dem Build im Webbrowser verschiebt sich die Reflektion wie ein Bild ohne ein Reflektionsupdate zu bekommen.

Das rotieren von reflection probes hatte bei mir noch nie eine Auswirkung auf die ausrichtung der Spiegelung.

Ich kann diesbezüglich auch gern mal ein kleines Testprojekt erstellen, vllt hilft das ja etwas weiter, dass man sieht wie ich dor ran gehe.

Planar Reflections werde ich mir auch einmal ansehen, danke für den Tip.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie @SkipToPlay schon sagte sind Reflection Probes statisch im Raum verteilt (um eine entsorechende Abdeckung zu erzeugen) und normalerweise auch "baked" in einem Raum dessen Lichtverhältnisse sich nicht ändern und beides trifft bei dir denke ich zu. Möchte man dynamische Objekte in die "Reflection Probes"-Berechnung mit einfließen lassen, dann verwendet man Typ "Realtime". Ansonsten wenn sich beim Bewegen des Characters die Reflections ändern stimmt etwas anders nicht... bspw. Lichtquellen, Lightmap-Settings oder verwendete Shader.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sagen wir mal ich habe einen Character der sich in einem Raum bewegt und dieser soll sich in der Scheibe spiegeln, dann müsste ich doch auf realtime gehen dass sie die Reflektion erneuert oder?  Und dementsprechend müsste ich doch die Probe mit dem Character mit bewegen um keine perspektivische Verzerrung, bzw eine falsche Positionierung in der Spiegelung zu haben, oder sehe ich das falsch?

Bzw. wäre dann der einzige weg für solch eine Spiegelung ssr was ich auf grund von urp nicht kann, oder plane reflections wie ich das verstanden habe. Reflection probes wären dann der falsche Ansatz für diesen Zweck, oder anders gesagt, was wäre für diesen fall die beste Vorgehensweise?

Könnte das auch ein Bug sein? ich verwende grad die 2019.4.7f1.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine Reflection Probe ist eine Rumdum-Kamera. Wenn du, sagen wir mal, unterhalb dieser Kamera stehst, dann siehst du auf der Unterseite der produzierten Cubemap den Kopf von oben. Wenn du die Probe mit dem Spieler mitbewegst, dann ist der Spieler immer an der selben Position auf dem Bild, das die Probe produzierst. Sagen wir mal abstrakt, der Spieler ist z.B. in der "Mitte", dann ist der Spieler in der Mitte des Spiegels. Du gehst zur Seite und der Spieler ist immer noch in der Mitte, sollte sich ja aber auf der Spiegeloberfläche bewegt haben.

Kurz: Reflection Probes müssen relativ zur Oberfläche sein, auf denen sie angezeigt werden sollen. Wenn du z.B. Spiegelungen auf einem Auto haben willst, dann sollte die Probe sich mit dem Auto mitbewegen. Wenn die spiegelnden Flächen statisch sind, muss auch die Probe statisch sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ersteinmal danke, dass Ihr so hilfsbereit seit, finde ich echt Klasse!

Ich habe eben mal etwas vorbereitet, was mein Problem genau zeigt.
Beide Probes sind realtime, every frame, no timeslicing.

Der 1. Lauf ist mit bewegender Probe.
Der 2. mit statischer Position.
https://help.cryps.de/unity/reflection.mp4

Den erste lauf sieht auch recht gut aus(Wände aussen vor genommen), aber nach dem Build verhält sich dieser wie der Build mit statischer Position.

Dynamische Positionierung (verhält sich trotzdem wie der statische)
https://help.cryps.de/unity/dynamic

Statische Positionierung
https://help.cryps.de/unity/fixed

Hier der Codeausschnitt für die Positionierung
https://help.cryps.de/unity/code.png

Ich habe eben auch nochmal das Testprojekt hochgeladen.
https://help.cryps.de/unity/test.7z

Bzw hier auchnochmal der Code:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour{

    public float movementSpeed = 10f;
    public float rotationCamSpeedY = 250f;
    public float rotationUserSpeedX = 200f;

    public bool badReflectionActive = true;
    public bool goodReflectionActive = false;

    private GameObject player;
    private GameObject stativ;
    private Camera cam;
    private ReflectionProbe reflectionBad;
    private ReflectionProbe reflectionGood;
    private Vector3 movement = Vector3.zero;
    private Vector3 rotationCam = Vector3.zero;
    private Vector3 rotationUser = Vector3.zero;

    // Start is called before the first frame update
    void Start()
    {
        this.player = GameObject.Find("player");
        this.stativ = GameObject.Find("stativ");
        this.cam = GameObject.Find("cam").GetComponent<Camera>();
        this.reflectionBad = GameObject.Find("reflection_bad").GetComponent<ReflectionProbe>();
        this.reflectionGood = GameObject.Find("reflection_good").GetComponent<ReflectionProbe>();

        GameObject.Find("reflection_bad").SetActive(this.badReflectionActive);
        GameObject.Find("reflection_good").SetActive(this.goodReflectionActive);

        Cursor.lockState = CursorLockMode.Locked;
    }

    // Update is called once per frame
    void Update()
    {
        this.assignMovementControls();
        this.assignCamControls();
        this.fixReflection();
    }

    private void fixReflection(){
        Vector3 camPos = this.cam.transform.position;
        camPos.y *= -1;
        this.reflectionGood.transform.position = camPos;

    }

    private void assignMovementControls(){
        this.movement.z = Input.GetAxis("Vertical") * this.movementSpeed;
        this.movement.x = Input.GetAxis("Horizontal") * this.movementSpeed;
        this.rotationUser.y = Input.GetAxis("Mouse X") * this.rotationUserSpeedX;

        this.player.transform.Translate(this.movement * Time.deltaTime);
        this.player.transform.Rotate(this.rotationUser * Time.deltaTime);
    }

    private void assignCamControls(){
        this.rotationCam.x = Input.GetAxis("Mouse Y") * this.rotationCamSpeedY * -1;

        this.stativ.transform.Rotate(this.rotationCam * Time.deltaTime);

    }
}


 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Joa, die Reflection Probe verhält sich wie erwartet - und wie gewollt :)

Man darf halt nicht vergessen, dass die Dinger ein Rundumbild von einem einzigen Punkt aus machen. Das heißt dann schlussendlich, dass maximal ein einziger Punkt auf der Spiegelfläche das korrekte Pixel abbildet.

Jetzt wollte ich hier noch mehr schreiben, dann ist mir aber beim Recherchieren, damit ich keinen Käse rede, die Einstellung "Box Projection" aufgefallen: https://docs.unity3d.com/Manual/AdvancedRefProbe.html

Sieht sehr nach dem aus, was du brauchst:

GraphicsSettings_BoxProjection.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Auf diesen Artikel bin ich auch schon gestoßen, habe jetzt auch nochmal die Boxprojektion angeschalten, jedoch hat sich nichts verändert. Nach dem Build ist die Reflection wieder kaputt. :(

Ich denke auch das hat was mit den globalen Einstellungen zu tun und muss dort noch einen weiteren shader eintragen. Nur weiss ich nicht welchen von den über 100 ich genau brauche. 10 sind ja standardmäßig in der urp mit drin.

https://help.cryps.de/unity/shader_settings.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ignorier mal die "always included shaders". Nur weil ein Shader da nicht in der Liste steht, heißt das nicht, dass er nicht da ist. Der Standard-Shader, der 90% aller Oberflächen befeuert, steht da schonmal nicht drin :)

Wenn im Build etwas grafisches anders ist, kann es sein, dass du in Editor und Build unterschiedliche Quality Levels und damit unterschiedliche Grafikfeatures hast.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh my god, das war's,

einmal war bei rendering die urp nicht eingetragen und das default quality level war auf medium gestellt. Jetzt sieht der Build auch so aus wie im Editor.
Jetzt muss ich irgendwann nur noch das mit den Wänden fixen.

Vielen, vielen Dank für die Hilfe, das bringt mich grad echt schon einmal einen Schritt weiter.

Hier auch nochmal Build mit der korrekten Spiegelung auf dem Boden.
https://help.cryps.de/unity/solution2

Die Boxprojection habe ich auch wieder abgeschalten, diese hatte irgendwie keine Auswirkung, ich denke diese hat auch nur einen Effekt, wenn man die Standard RP von Unity benutzt.

Wenn ich das mit den Wänden gelöst habe werde ich dies hier auch nochmal mitteilen. :)

solution.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...