Hallo tdoly!
Die Frage ist, wie viel Erfahrung du mit der Thematik überhaupt hast. Wenn du noch nie Schatten jeglicher Art implementiert hast, dann solltest du das erstmal nachholen.
Grundlegend gibt es im Echtzeit3D Bereich, also OpenGL zwei Grundlegende Schattentypen, die jeweils ihre Vor- und Nachteile haben:
Achso, da fällt mir noch ein: Soll denn der weiche Schatten in echtzeit geändert werden, oder reicht es, wenn dieser in Lightmaps oder Vertex-Farbe abgespeichert wird? Mein Beitrag bezieht sich nun erstmal auf die in Echtzeit änderbaren Schatten.
Stencil Volumes und Shadow Maps.
Nur kurz, denn darüber gibt es schließlich genug Material um sich genauer zu informieren:
Bei Stencil werden Volumen von jedem Objekt gebildet und durch den Stencil-Test lassen sich somit alle Pixel, die innerhalb solcher Volumen bilden markieren. Jedes Pixel, was dann nicht in einem Schattenvolumen liegt, ist beleuchtet. Nachteil ist, dass viel Overdraw entsteht und keine Alpha-Test-Texturen funktionieren, weil dies nur auf die Geometrie angewendet wird.
Beim Shadowmapping rendert man die Tiefenwerte in eine Textur und projeziert diese dann auf die Geometrie, die beleuchtet werden soll. So kann man an jedem Pixel die Entfernung zur Lichtquelle berechnen und diese mit dem Wert in der Shadowmap vergleichen und weiß so, ob diese im Schatten liegt oder nicht.
Bei weichen Schatten kommt es nun drauf an, welche Technik du zugrunde legst. Beim Stencilschatten könnte man statt für eine Lichtquelle, das ganze für mehrere Lichtquellen berechnen. Schiebt man diese Lichtqullen zu einem kleinen Volumen zusammen und bekommt jede eine Teilhelligkeit der endgültigen Lichtquelle, so kann man exakte pixelgenaue weiche Schatten bilden. Das ganze verschlinkt aber extrem viel Rechenzeit.
Bei den Shadowmaps wird einfach mehrfach in die Shadowmap gesampelt. Dabei wird die Texturkoordinate immer etwas vom Zentrum verschoben. Das Problem ist, dass man bei einem Pixel eigentlich nicht wissen muss, welche Fläche die naheste zur Lichtquelle ist, so wie es in der Standard-Shadowmap-Implementierung getan wird, sondern man muss herausfinden, welche Fläche in der Umgebung als Lichtblocker fungiert. Das wird in dem von Schrompf geposteten Artikel auch getan. Denn wenn man den Abstand zwischen Blocker und Pixel und den Abstand zur Lichtquelle kennt, kann man berechnen, wie weich der Schatten sein müsste. Dadurch ändert sich dann der Radius beim sampeln. Sorry, wenn das alles etwas schwammig und oberflächlich formuliert ist. Ich möchte dir erstmal einen Überblick geben, was da für Möglichkeiten sind. Wenn du dich für eine Variante entschieden hast, kann man darauf ja noch einmal gezielter eingehen.
Hier hab ich noch ein Beispiel beider Varianten:

- Soft Stencil Shadows

- Soft Shadow Maps
Gruß
Zudo