glsl sampler2DShadow und shadow2D Klärung
Schnelle hintergrund von wo ich bin (um sicherzugehen, dass wir auf der gleichen Seite, und Plausibilitätsprüfung, wenn ich bin fehlt/Annahme etwas dumm):
- Ziel: ich möchte meine Szene Rendern mit Schatten, mit deferred lighting
und shadowmaps. - Kampf: finden Sie eine klare und konsistente Dokumentation über wie zu verwenden shadow2D und sampler2DShadow.
Hier ist, was ich bin derzeit dabei:
In der fragment-shader von meinem letzten rendering pass (die eine, die tatsächlich berechnet final frag Werte), habe ich die MVP-Matrizen vom pass aus das Licht, die Sicht, die Tiefe textur von Sprach-pass (auch bekannt als die "Schatten-map"), und die position/normal/Farbe Texturen aus meiner geometrie-Puffer.
Aus, was ich verstehe, ich brauche zu finden, was UV-von der Schatten-map die position des aktuellen fragments entspricht. Ich mache das indem die folgenden:
//Bring position value at fragment (in world space) to screen space from lights POV
vec4 UVinShadowMap = (lightProjMat * lightViewMat * vec4(texture(pos_tex, UV).xyz,1.0)).xy;
//Convert screen space to 'texture space' (from -1to1 to 0to1)
UVinShadowMap = (UVinShadowMap+1)/2;
Nun, dass ich diesen UV -, ich kann die percieved 'Tiefe' aus dem Licht ' s pov mit
float depFromLightPOV = texture2D(shadowMap, UVinShadowMap).r;
und vergleichen Sie das mit der Entfernung zwischen der position zum aktuellen fragment und das Licht:
float actualDistance = distance(texture2D(pos_tex, UV).xyz, lightPos);
Das problem kommt aus dieser 'Tiefe' gespeichert ist, in Werte von 0-1, und der tatsächliche Abstand ist in Welt-Koordinaten. Ich habe versucht zu tun, die Konvertierung manuell, aber konnte es nicht zu funktionieren. Und bei der Suche online, es sieht aus wie die Art, wie ich dies tun SOLLTE, ist mit einem sampler2DShadow...
Hier also meine Frage(N):
Welche änderungen muss ich vornehmen, verwenden Sie stattdessen shadow2D? Was bedeutet shadow2D auch tun? Ist es nur mehr-oder-weniger-ein-auto-Umwandlung-von-zu-Tiefe-zur-Welt-textur? Kann ich die gleiche Tiefe textur? Oder muss ich das Rendern der Tiefe, textur einen anderen Weg? Was gebe ich in shadow2D? Der Welt-Raum-position des fragment-ich will das überprüfen? Oder die gleiche UV wie vorher?
Wenn alle diese Fragen beantwortet werden können, in eine einfache Dokumentation Seite würde ich gerne, wenn jemand nur post, dass. Aber ich schwöre ich habe die Suche nach Stunden und kann nichts finden, dass Sie einfach sagt, was eigentlich Los ist mit shadow2D!
Dank!
- Vielleicht möchten Sie sich bei der Antwort auf stackoverflow.com/questions/19516538/..., da es erklärt viele Dinge, die Sie Fragen.
- Ich denke, das ist näher (und zusammen mit dem wiki-link in der Antwort sollte Ihre Fragen): stackoverflow.com/questions/20877938/... (beachten Sie, dass der Frage-Titel ist irreführend - sampler2dshadow ist nicht veraltet)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst, welche version der GLSL Sie mit?
Anfang mit GLSL 1.30, gibt es keine Besondere textur-lookup-Funktion (name, sowieso) für die Verwendung mit
sampler2DShadow
. GLSL 1.30+ verwendet eine Reihe von überladungen vontexture (...)
ausgewählt werden, basierend auf der Art dersampler
vergangen, und die Dimensionen der Koordinaten.Zweitens, wenn Sie verwenden
sampler2DShadow
müssen Sie zwei Dinge anders:Textur-Vergleich muss aktiviert sein, um Undefinierte Ergebnisse
GL_TEXTURE_COMPARE_MODE
=GL_COMPARE_REF_TO_TEXTURE
Die Koordinaten, die Sie passieren zu
texture (...)
sind 3D statt 2D. Die neue 3. Koordinate wird der Wert für die Tiefe, die Sie gehen zu vergleichen.Letzte, Sie sollten verstehen, was
texture (...)
gibt, wenn mitsampler2DShadow
:Wenn dieser Vergleich geht,
texture (...)
zurück 1.0, wenn es nicht gelingt, wird es wieder 0.0. Wenn Sie eineGL_LINEAR
textur-filter auf Ihre Tiefe, textur, danntexture (...)
führen 4 Tiefe Vergleiche, die mit den 4 engsten Tiefe Werte in Ihrer Tiefe textur und einen Wert zurückgeben irgendwo in-zwischen 1.0 und 0.0 um eine Vorstellung zu geben von der Anzahl der Proben, die bestanden/nicht bestanden.Dass ist die richtige Art und Weise zu tun, die hardware-anti-aliasing von shadow maps. Wenn Sie versucht haben, verwenden Sie einen regelmäßigen
sampler2D
mitGL_LINEAR
und implementieren die Tiefe testen Sie sich selbst, Sie bekommen eine einzige gemittelte Tiefe zurück, und ein boolean-pass/fail-Ergebnisse anstelle der oben beschriebene Verhalten fürsampler2DShadow
.Als für immer ein Wert für die Tiefe zu testen aus einem Welt-Raum positionieren, Sie waren auf dem richtigen Weg (obwohl Sie vergaß, Perspektive, Aufteilung).
Es gibt drei Dinge, die Sie tun müssen, um erzeugen eine Tiefe von einem Welt-Raum-position:
W
KomponenteDer Letzte Schritt davon ausgegangen, dass Sie die Standard-Tiefe... wenn Sie wurden nicht genannt
glDepthRange (...)
dann funktioniert das.Das Ergebnis von Schritt 3 dient als beide eine Tiefe Wert (
R
) und textur-Koordinaten (ST
) für die Suche in Ihre Tiefe anzeigen. Dies macht es möglich, diesen Wert übergeben direkt zutexture (...)
. Daran erinnern, dass die erste 2-Komponenten der textur-Koordinaten sind die gleichen wie immer, und der 3. einen Wert für die Tiefe zu testen.GL_LINEAR
textur-filter? Ich meine, ich brauche keinen Schatten, sondern nur visualisieren Tiefe mitsampler2DShadow
.