Registriert: Di Aug 09, 2011 07:33 Beiträge: 163
Programmiersprache: C/C++
Hey,
Das Thema Schatten ist wohl das schlimmste was mir bis jetzt bei OpenGL begegnet ist. Es ist mir zwar möglich ein ganz normales ShadowMapping durchzuführen aber wenns schon darum geht, das etwas auf Shader auszulagern und dann z.B. PCF anzuwenden hörts auf
Ich zeige daher mal ein paar Codeteile, in der Hoffnung das jemand den Fehler findet (oder die Fehler).
Das sollten die wichtigsten Sachen sein. Das im FBO die richtigen Texturen weiss ich sicher, da ich das schon am laufen hatte (nur eben ohne Shader)! Für mich ist es eben wichtig die beiden Texturen in den Shader zu bekommen damit ich dort auch PCF anwenden kann. Falls noch irgendwas fehlt einfach sagen!
Registriert: Di Aug 09, 2011 07:33 Beiträge: 163
Programmiersprache: C/C++
Erstmal danke für die Antwort!
Dieses Tutorial auf der Website habe ich mir schonmal angeschaut aber das klappt doch garnicht? Wenn ich die fertige exe downloade und ausführe => verbuggt! Lade den Code und compile es selber => verbuggt!
Dort wird nicht mal im Ansatz ein korrekter Schatten angezeigt (siehe Anhang)
Registriert: Di Aug 09, 2011 07:33 Beiträge: 163
Programmiersprache: C/C++
Also ich habe den Code mal durchgearbeitet aber letztendlich will es nicht laufen. Ich wollte mir zum Debuggen das FBO anzeigen lassen - also die DepthTexture - doch da ist nicht wirklich viel zu sehen! Habe daher mal ein FBO von mir 1 zu 1 übernommen, was aber komischerweise nix bringt. Hab auch schon andere Parts ausgetauscht aber ebenso ohne Erfolg. Ich packe den Source nochmal in den Anhang, vllt. stößt ja jemand auf ein Problem - so lang ist der Code ja nicht.
Ich hatte mir auch mal sein normales ShadowMapping angeschaut und muss sagen, dass es auch dort ein Fehler gibt. Im Fragment Shader will er z.B. eine vec4 Variable an texture2D übergeben - läuft natürlich nicht. Als vec2 mit .st oder texture2DProj und dann vec4 läuft. Fehler sind wohl keine Seltenheit
Registriert: Di Aug 09, 2011 07:33 Beiträge: 163
Programmiersprache: C/C++
Ich schieb das Thema nochmal nach oben und zeige mein aktuellen Stand nochmal kurz aber deutlich:
Im C++ Code: - Shader wird aktiviert - Szene wird gerendert - Shader deaktiviert
Der C++ Code übergibt dem Shader die Tiefentextur sowie die Matrix von der Texture. Diese Matrix setzt sich aus folgenden 3 Dingen zusammen: BiasMatrix * ProjectionMatrix * LightMatrix
BiasMatrix sollte klar sein. ProjectionMatrix hat den Inhalt von gluPerspective (also Fov, Ration, Near, Far) LightMatrix enthält die Kameradaten der Lichtquelle (also Ort und Blickrichtung (via gluLookAt).
Diese Daten werden jedenfalls an den Shader übergeben.
Im VertexShader sieht es so aus:
Code:
uniform mat4 SMC1;
void main()
{
gl_FrontColor = gl_Color;
gl_TexCoord[0]= gl_MultiTexCoord0;
gl_TexCoord[1]= gl_Vertex * SMC1;
gl_Position = ftransform();
}
Einen passenden Fragmentshader kann ich nicht wirklich präsentieren, da ich vieles Probiert habe aber nix klappt. Habe halt lediglich meine uniform sampler2DShadow ShadowMap und eben es mit Shadow2DProj probiert (als Koordinaten gl_TexCoord[1]) genommen - aber es geht halt leider nicht.
Anmerkung, vllt. ist es wichtig: Ohne Shader habe ich die Schatten immer mit diesen beiden Zeilen dargestellt:
Könnte mir bitte jemand einen korrekten FragmentShader zeigen, also wo einfach nur der Schatten dargestellt wird? Wäre wirklich nett! Bei Fragen steh ich natürlich zur Verfügung
Registriert: Di Aug 09, 2011 07:33 Beiträge: 163
Programmiersprache: C/C++
Ich habe es nun endlich zum laufen gebracht!
Welche Technik wäre denn "state of art", um weiche Kanten zu erzeugen? PCF liefert zwar bei ausreichender samplerate gute Ergebnisse aber die Performance ist nicht so überzeugend.
Du könntest dir noch Variance Shadow Maps anschauen. Dabei kann man die Shadowmaps filtern wie man will und benötigt nur noch einen Texturelookup um dann den Schatten darzustellen. Allerdings wird das durch höheren Speicherverbrauch erkauft. Außerdem hat man nicht das Problem mit Bias und inkorrekten Selfshadows (dafür aber ein anderes: Light Bleeding).
Eine Möglichkeit für PCF wäre noch es mit Dithering zu verwenden. So kann man die nötigen Texturlookups reduzieren und hat trotzdem noch weiche Schatten (die allerdings aus vielen kleinen Einzelpunkten bestehen). Wenn Geschwindigkeit wichtiger ist, wäre das aber zumindest eine Überlegung wert.
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
AMD hat geschrieben:
Ich habe es nun endlich zum laufen gebracht!
Woran lag es denn ?
Auf jeden Fall kommt mir folgendes aus dem Vertex Shader merkwürdig vor:
Code:
gl_TexCoord[1] = gl_Vertex * SMC1;
Sollte die Matrix nicht vorne stehen?
AMD hat geschrieben:
Welche Technik wäre denn "state of art", um weiche Kanten zu erzeugen? PCF liefert zwar bei ausreichender samplerate gute Ergebnisse aber die Performance ist nicht so überzeugend.
Ich hatte mich bislang mit 5 Samples zufrieden gegeben und vorhin mal auf 1 Sample mit dithering umgestellt. Nicht der wahnsinn, aber es reicht erstmal. Aber meinen Shader muss ich sowieso nochmal überarbeiten, weil ich an verschiedenen Stellen immer die Kameraposition rausrechnen muss. Du musst das anscheinend nicht. Allerdings komme ich an die Fragmentkoordinaten auch erst im Fragmentshader, da sie ja aus der Positionstextur des Deferredrenderer kommt.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Registriert: Di Aug 09, 2011 07:33 Beiträge: 163
Programmiersprache: C/C++
Danke für die Antworten. Qualität ist zwar nicht unrelevant aber das ganz so wichtig ist es auch nicht. Ich schau mir jedenfalls mal das dithering an.
Der Fehler war im Fragmentshader. Es wurde vom shadow2DProj der Wert .w genommen - das klappt auf nvidia Karten ganz gut aber nicht bei AMD/ATI. Nachdem ich es auf .r geändert habe läuft es auf beiden Karten
Mitglieder in diesem Forum: 0 Mitglieder und 3 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.