Wo du umrechnest ist erstmal egal, allerdings musst du bedenken das die Umrechnung im Shader für jeden Vertex/Pixel neu berechnet würde, wenn du das im Shader machst. Also besser direkt das korrekte Uniform übergeben.
Der Shader hatte noch einige Fehler, welche nun alle gefunden und beseitigt wurden. Auf einer Grafikkarte von ATi hätte der Shader sonst keine Chance gehabt. Außerdem sollten uniforms möglichst nicht nur nach einem Buchstaben benannt sein, da sonst der Typecast im Programm via PGLChar daneben geht (nullterminierte Strings). Schönen Dank nochmal an Sascha und Horazont. Wie der Screenshot zeigt, existiert mittlerweile ein Kegelstumpf. Der Kegelstumpf ist jedoch fest. Doch was ist nun noch notwendig ? Wie kriege ich in die uniform uS die Rotation noch rein ? Sonst ist es logischerweise fest. Das glRotatef war nur ein simpler Versuch, natürlich gescheitert. Wie man im Vertexshader sieht führe ich die Umwandlung des Koordinatensystems über diesen durch und übergebe das Ergebnis dann an den Fragmentshader.
Wie der Screenshot zeigt, existiert mittlerweile ein Kegelstumpf.
Ich sehe auf deinem Screen nicht mal lokale Beleuchtung?
Zitat:
Doch was ist nun noch notwendig ? Wie kriege ich in die uniform uS die Rotation noch rein ?
glRotatef hat auf Uniforms keine Auswirkung.
Der Fehler liegt hier:
Code:
// (Vertexshader)
S = gl_ModelViewMatrix*uS;
Du multiplizierst den Schattenwerfer S mit der ModelView-Matrix des gerade gerenderten Planeten. Du musst aber die ModelView-Matrix des Schattenwerfers nehmen. Am besten liest du beim rendern des Schattenwerfers mit glGet(GL_MODELVIEW_MATRIX, ...) die ModelView-Matrix aus. Damit transformierst du dann S, wobei S in lokalen Koordinaten ist, also wahrscheinlich (0,0,0,1)
Ich habe jetzt mal die Soft-Shadow-Variante zu Ende gedacht. Ich denke das Bild sagt bereits das wichtigste.
Dateianhang:
softShadow.png
Die Repräsentation der Kegel ist hier etwas anders, da insbesondere der innere Kegel sehr spitz/lang werden kann. Dies könnte zu numerischen Ungenauigkeiten führen. Außerdem müssten Spezialfälle umgangen werden. Wenn nämlich der Occluder größere als die Lichtquelle wird, liegt die Kegelspitze plötzlich auf der anderen Seite. Hier werden die Kegel durch die Positionen L und O sowie die Radien rL und rO definiert. So können diese Fälle gleich behandelt werden. Auch können wir für den äußeren Kegel einfach einen negativen Lichtquellenradius rL verwenden. Die Daten beider Kegel sind also bis auf dieses Vorzeichen identisch, was natürlich die Hälfte der Shader-Uniforms einspart.
rF_inner und rF_outer sind die Radien der Kegel in Höhe des Fragmentes F bzw. F'. Die Formeln für inneren und äußeren Kegel sind identisch, nur das eben für den äußeren Kegel wie schon erwähnt ein negativer Lichtquellenradius rL verwendet wird.
Die Ausgabe des ganzen ist ein Faktor s zwischen 0 und 1, wobei 0 voller Schatten und 1 volles Licht darstellt. Das ganze ist leider eine etwas längliche Fallunterscheidung. Im Shader sollte man die natürlich so umbauen das Werte nur dann berechnet werden wenn sie auch wirklich gebraucht werden. Zu beachten ist das im folgenden rF_inner auch negativ werden kann. In dem Fall befinden wir uns soweit hinter dem Objekt das keine Vollschatten-Zone mehr existiert.
Code:
if (dLF' < dLO || rF >= rF_outer) {
// Fragment vor dem Occluder oder außerdem des äußeren Kegels.
s = 1.0;
}
else if (rF_inner >= rF) {
// Wir befinden uns im Vollschatten
s = 0.0;
}
else if (rF_inner >= 0 || rF >= -rF_inner) {
// Wir befinden uns im Halbschatten, lineare Interpolation
s = (rF - rF_inner) / (rF_outer - rF_inner);
}
else {
// Wir empfangen Licht von zwei Richtungen, also oben und unten am Occluder vorbei.
// Die beiden rF heben sich gegenseitig auf.
s = (-2*rF_inner) / (rF_outer - rF_inner);
}
Kleine Notiz: Der Schatten wird orthogonal zur Geraden LO interpoliert. Diese Berechnung ist nicht physikalisch korrekt. Allerdings dürfte niemandem der Unterschied auffallen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mitglieder in diesem Forum: Google [Bot] und 13 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.