OpenGL Schadowmap relativ zur kamera

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Andy90
Beiträge: 67
Registriert: 08.10.2023, 13:02

OpenGL Schadowmap relativ zur kamera

Beitrag von Andy90 »

Hallo, ich habe mir gestern mal das Tutorial für Shadowmaps auf https://learnopengl.com/Advanced-Lighti ... ow-Mapping angeschaut. Soweit ist auch alles klar und ich bekomme es hin, dass meine Objekte Schatten werfen. Jetzt ist ja aber der Bildausschnitt in dem Tutorial fest definiert, wie kann ich es am besten bewerkstelligen das er den Bildausschnitt der Shadowmap abhängig von der Kamera macht? Aktuell verfolge ich den Ansatz, dass ich die Projektion Matrix anhand der Kamera Position definiere also etwa so

Code: Alles auswählen

        public mat4 GenerateLightSpaceMatrix()
        {
            //new vec3(-2f, 4.0f, -1.0f)
            float near_plane = 1.0f, far_plane = 7.5f;

            float left = _camX - 10f;
            float right = _camX + 10f;
            float top = _camY + 10f;
            float bottom = _camY - 10f;

            // Könnte auch funktionieren
            //float top = _camZ + 10f;
            //float bottom = _camZ - 10f;

            mat4 lightProjection = mat4.Ortho(left, right, bottom, top, near_plane, far_plane);
            mat4 lightView = mat4.LookAt(lightPos, new vec3(0.0f, 0.0f, 0.0f), new vec3(0.0f, 1.0f, 0.0f));

            return lightProjection * lightView;
        }
Screenshot 2023-11-01 192118.png
was bis jetzt auch gut funktioniert. Ist das so richtig, oder gibt's da andere Methoden das zu bewerkstelligen?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4890
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: OpenGL Schadowmap relativ zur kamera

Beitrag von Schrompf »

So geht's, aber dann hast Du einigen ShadowMap-Platz auf den Bereich hinter der Kamera verschwendet.

Was ich stattdessen empfehle: stelle Dein Frustum auf, also die Pyramide, die das Sichtfeld Deiner Kamera darstellt. Stelle außerdem das Koordinatensystem Deines Lichtes auf, also drei Vektoren entlang und quer zur Lichtrichtung. Bei Dir kommt das Licht anscheinen direkt von oben, da isses einfach. Dann kannst Du alle fünf Ecken Deiner Frustum-Pyramide in dieses Koordinatensystem transformieren und kannst eine BoundingBox aufmachen. Und die ist Deine ShadowMap.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Andy90
Beiträge: 67
Registriert: 08.10.2023, 13:02

Re: OpenGL Schadowmap relativ zur kamera

Beitrag von Andy90 »

ok das ist ein interessanter Ansatz, vielen dank :) Ich werde das mal ausprobieren. Ich merke schon, Schatten richtig und vor allem gut zu rendern ist eine Wissenschaft für sich :D
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: OpenGL Schadowmap relativ zur kamera

Beitrag von dot »

Andy90 hat geschrieben: 01.11.2023, 22:17 Ich merke schon, Schatten richtig und vor allem gut zu rendern ist eine Wissenschaft für sich :D
Es ist und bleibt ein ungelöstes Problem der Computergrafik… ^^
Benutzeravatar
Schrompf
Moderator
Beiträge: 4890
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: OpenGL Schadowmap relativ zur kamera

Beitrag von Schrompf »

Ich hab den Verdacht, dass der Wunsch nach Raytraced Shadows in allen möglichen Medien vor allem davon kommt, dass man Cascaded Virtual Moment Shadow Maps mit Normal Dependent Offset und Ketchup und Pommes quasi nie "gelöst" bekommt. Auch Jahre später findet man sich wieder, da doch noch schnell nen PostFx drüber zu jagen, um ein paar Fehlpixel zu fixen oder noch ein Offset bissl feiner einzustellen.

Grundsätzlich aber: bissl Offset gegen Selbstschatten, Augen zu und 64 Samples in ner Schleife im Shader, heutige GPUs können das stressarm, außer MeisterQ's Holz-GPU.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten