Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 13:30

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Shadow mapping
BeitragVerfasst: Di Apr 05, 2011 17:07 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Ich bin vom Stencil - Schatten auf Shadow mapping umgestiegen. Dabei gehe ich wie folgt vor:

Es wird eine Tiefentextur aus der Sicht der Lichtquelle erstellt. Über einen Shader, der über ein bildschirmfüllendes Quad gelegt ist, wird dann berechnet, ob der Pixel im Schatten ist oder nicht. Dafür werden 2 Distanzen verglichen. Einmal wird die Distanz aus der Tiefentextur der Lichtquelle genommen und dann wird sie über das aktuelle Fragment des Pixels zur Lichtquelle berechnet (im 2D - Shader). Ist die erste Distanz kleiner als die zweite, liegt der Pixel im Schatten.

Das Problem dabei liegt in der Berechnung der Texturkoordinaten für die Tiefentextur der Lichtquelle. Also ich hab den Vertex im 2D - Shader über die Tiefentextur(aus der Kamerasicht) berechnet und will die 2D - Position dafür in der Tiefentextur der Lichtquelle berechnen. Habe hier im Forum auch Formeln dafür gefunden, nur kann ich diese nicht richtig umsetzen...

Ich hoffe man versteht, was ich meine :D.


2D - Shader:
Code:
const char txtShader_ShadowFragment[] = {
    "uniform sampler2D Texture0;   // Scene - Texture\n"
    "uniform sampler2D Texture1;   // Depth - Texture\n"
    "uniform sampler2D Texture2;   // ShadowMap - Texture\n\n"

    "uniform vec3 vLightPos;\n\n"

    "const float f = 5000.0;\n"
    "const float n = 5.0;\n\n"

    "void main() {\n"
        "vec2 texcoord = vec2(gl_TexCoord[0]);\n"
        "vec4 vColor = texture2D(Texture0, texcoord);\n"
        "float fDepth = texture2D(Texture1, texcoord).r;\n\n"

        "if(fDepth >= 1.0) {\n"
        "   gl_FragColor.rgb = vColor.xyz;\n"
        "   return;\n"
        "}\n\n"

        "vec4 vVertex;\n"
        "vVertex.xy = texcoord.st * 2.0 - 1.0;\n"
        "vVertex.z = fDepth * 2.0 - 1.0;\n"
        "vVertex.w = 1.0;\n"
        "vVertex = gl_ProjectionMatrixInverse * vVertex;\n"
        "vVertex.xyz /= vVertex.w;\n"
        "vVertex.w = 1.0;\n\n"

        "vec3 vLight = vec4(gl_ModelViewMatrix * vec4(vLightPos, 1.0)).xyz;\n\n"

//  ************ Hier liegt das Problem ************
        "vec2 shadowcoord;\n"
        "vec4 w1 = vec4(0, 0, 1280, 960) * gl_TextureMatrix[1] * vVertex;\n // gl_TextureMatrix[1] = ModelViewProjections - Matrix der Lichtquelle"
        "w1 /= w1.w;\n\n"
//  *******************************************

        "shadowcoord.x = (0.5*w1.x+0.5);\n"
        "shadowcoord.y = (0.5*w1.y+0.5);\n\n"

        "float fShadow = 1.0;\n"
        "float fShadowDepth = texture2D(Texture2, shadowcoord).r;\n"
        "float fZ = (2.0 * n) / (f + n - fShadowDepth * (f - n));\n"

        "float distance = distance(vVertex, vLight);\n"
        "if(distance > fZ) {\n"
            "fShadow = 0.5;\n"
        "}\n\n"

        "gl_FragColor.xyz = vColor * fShadow;\n"
    "}\n"
};


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shadow mapping
BeitragVerfasst: Mo Apr 25, 2011 21:54 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Hab mich mit dem Thema nochmal befasst und im Internet http://fabiensanglard.net/shadowmapping/ die Seite gefunden. Dort wird die Geometrie aber doppelt gerendert (1. Tiefentextur erstellen und 2. Prüfen, ob das Fragment im Schatten liegt). Aber man kann das ja über einen 2D - Shader in nur einen Renderpass vereinen (so ähnlich wie Deferred Shading).

Code:
  1. const char txtShader_DeferredShadowFragment[] = {
  2.     "uniform sampler2D Texture0;    // Color - Texture\n"
  3.     "uniform sampler2D Texture1;    // Camera - Depth - Texture\n"
  4.     "uniform sampler2D Texture2;    // Light - Depth - Texture\n\n"
  5.  
  6.     "void main() {\n"
  7.         "vec2 texcoord = vec2(gl_TexCoord[0]);\n"
  8.         "float fDepth = texture2D(Texture1, texcoord).r;\n\n"
  9.  
  10.     // Vertex - Position von Pixel berechnen
  11.         "vec4 vVertex;\n"
  12.         "vVertex.xy = texcoord.st * 2.0 - 1.0;\n"
  13.         "vVertex.z = fDepth * 2.0 - 1.0;\n"
  14.         "vVertex.w = 1.0;\n"
  15.         "vVertex = gl_ProjectionMatrixInverse * vVertex;\n"
  16.         "vVertex.xyz /= vVertex.w;\n\n"
  17.  
  18.     // gl_TextureMatrix[7] = bias * projection * modelview der lichtquelle
  19.     "vec4 ShadowCoord = gl_TextureMatrix[7] * vVertex;
  20.         "vec4 shadowCoordinateWdivide = ShadowCoord / ShadowCoord.w;\n"
  21.         "shadowCoordinateWdivide.z += 0.000025;\n\n"
  22.  
  23.         "float distanceFromLight = texture2D(Texture2, shadowCoordinateWdivide.xy).z;\n\n"
  24.         "float shadow = distanceFromLight < shadowCoordinateWdivide.z ? 0.25 : 1.0;\n\n"
  25.  
  26.         "gl_FragColor = shadow * texture2D(Texture0, texcoord);\n"
  27.     "}\n"
  28. };


Theoretisch sollte das funktionieren, weil ich alle Angaben habe wie in den Shadern von der Website, die ich oben erwähnt habe. Aber das Problem liegt höchstwahrscheinlich beim Berechnen der Vertex - Position vom Pixel. Hab schon viel rumprobiert, aber es ist nichts gescheites dabei rausgekommen... mal bewegen sich
die Schatten relativ zur Kameraposition, dann ist alles schwarz oder man sieht garkeine Schatten..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shadow mapping
BeitragVerfasst: Mo Apr 25, 2011 22:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Aber man kann das ja über einen 2D - Shader in nur einen Renderpass vereinen (so ähnlich wie Deferred Shading).

Kann man? Was passiert wenn nicht sichtbare Objekte (z.B. hinter der Kamera) einen Schatten in die Kamera werfen? Wie soll da ein Screenspace-Ansatz wie Deferred Shading helfen? Die Szene muss zweifach gerendert werden! Allerdings kann man für den ersten Pass natürlich ein Low-Poly-Modell benutzen und ohne Texturen und sonstige Effekte rendern.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shadow mapping
BeitragVerfasst: Mi Apr 27, 2011 12:56 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Stimmt, daran hab ich garnicht gedacht... wie dumm von mir :roll:. Naja egal, muss ich wohl 2 Renderpässe durchführen.

Ich wollte noch versuchen, dass eine Punktlichquelle Schatten wirft. Da gibts ja mehrere Techniken wie man das lösen kann. Ich wollte es erstmal mit einer Cube - Map versuchen, also das aus der Sicht der Lichtquelle 6 Texturen erstellt werden (links, rechts, vorne, hinten, oben und unten). Da taucht aber das Problem auf: Die Funktion "gluPerspective" bietet nur den horizontalen FOV, d. h. wenn ich 90.0 Grad an die Funktion übergebe, dann wird der Winkel nur im horizontalen Bereich (Breite) gesetzt. Der vertikale Winkel muss sich aber auch irgendwie verstellen lassen, oder? Sonst ist die Cube - Map ja fehlerhaft, weil sie nicht die ganze Szene enthält (hab ich auch daran gemerkt, das die Schatten an manchen Stellen abgehackt sind).

Mein Funktionsaufruf sieht so aus:
Code:
  1. gluPerspective(90.0f, 1.0f, 0.5f, 1000.0f);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Shadow mapping
BeitragVerfasst: Mi Apr 27, 2011 13:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Der vertikale Winkel muss sich aber auch irgendwie verstellen lassen, oder?

Der wird indirekt über das Seitenverhältnis gesetzt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 17 Queries | GZIP : On ]