Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Hey ho
In den Vergangenen Monaten hab ich ein kleines Jump'n'Run Spiel mit OpenGL entstehen lassen. Der aktuelle Entwicklungspunkt sieht die Implementierung von Schatten vor.
Bei der Realisierung habe ich mich unter anderem an diesem Tutorial orientiert joachimrohde.com.
wobei render_shadow_volume die Schatten Volumina zeichnet (eine kopie sprengt hier zum einen den rahmen, zum anderen habe ich erfolgreich geprüft, dass das Volumen korrekt berechnet wird).
irgendwo habe ich da falsche Einstellungen. ich kann allerdings beim besten Willen nicht finden wo. Wenn ich die anwendung starte sieht das ganze etwa so aus:
Mir ist klar, dass ich das Viereck über den ganzen Monitor zeichnen sollte, nur dann erkennt man keinen unterschied, und denkt nur die ganze Szene wäre sehr dunkel.
Ich wäre jedem, der sich die Sache mal anguckt und unter Umständen mit seinem eigenen Code vergleicht sehr verbunden.
Also alle bis auf den letzten Block sehen auf den ersten Blick soweit korrekt aus. Der letzte ist allerdings Käse.
GL_KEEP,GL_KEEP,GL_KEEP ist soweit korrekt, er soll ja schließlich keine Änderungen mehr durchführen, aber GL_NEVER kann nicht stimmen.
Mein eigener Quelltext dafür ist leider verschollen, aber du musst dort das Zeichnen auf den Bereich limitieren, bei dem ... durch den Z-Buffer... nur die Front-Planes gezeichnet wurden, bei NeHe sieht's so aus:
Was mich nach wie vor wundert ist dass er trotz NEVER das graue Rechteck gezeichnet hat.
Vergleich dein Projekt einfach noch mal hiermit:
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=27
Was aus deinem Code nicht ersichtlich ist:
Dumme Frage, aber um sicher zu gehen: Du hast schon 8-Bit-Stencil reserviert oder?
Ansonsten nochmal die Checkliste:
- Welt normal zeichnen
- Stencil-Buffer mit 0 clearen
- Depth-Write aus
- Color-Mask aus
- Stencil-Test auf Always, Increase +1
- Front-Planes zeichnen
- Stencil-Test auf Always, Decrease +1
- Back-Planes zeichnen
- Stencil-Write ausschalten
- Stencil-Test auf != 0
- Shadow-Rect über den ganzen Bildschirm zeichnen
Wenn der Quelltext von deinem Test kompakt und problemlos direkt compilierbar ist, kannst du ihn mir mal an alyx ät theneposproject.de schicken, dann schau ichs mir morgen Abend mal an und habs wahrscheinlich in 2 Minuten, aber so ist's immer ein bischen Rätsel raten :-).
Gut, dann bin ich beruhigt. Das erklärt auch wieso er bei GL_NEVER trotzdem gezeichnet hat... er wird wohl sämtliche Stencil-Funktionen völlig ignoriert haben, da es nicht verfügbar war, damit auch das NEVER :-).
So, ich hab das jetzt in einer vernünftigen Weise realisiert.
Der Haken ist nur: nah an den Kanten meiner Objekte flimmert manchmal der Schatten quasi weg und wieder zurück (ich stehe mit meiner Kamera in dem Moment auf keinen Fall im Volumen drin ist).