Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 18:57

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Stencil - Schatten
BeitragVerfasst: Fr Nov 05, 2010 15:18 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Habs jetzt endlich hinbekommen Schatten in OpenGL zu rendern :).
Allerdings habe ich folgende Probleme bemerkt:
- Der Schatten wird ins "Unendliche" projeziert
- Wenn die Kamera innerhalb der Silhouette ist, wirkt der Schatten "zerstochen"

Um die beiden Probleme verständlicher zu machen, hier zwei Screenshots:

http://xyross.de/file.php?id=82
http://xyross.de/file.php?id=83

Ich habe mich nach diesem Tutorial gerichtet:
http://www.joachimrohde.com/cms/xoops/modules/articles/article.php?id=36

Ich hab das bei mir ein etwas anders eingebaut (heißt jetzt aber nicht das deswegen der Schatten die zwei Probleme macht).
Bei mir sieht das wie folgt aus:
Code:
    glCullFace(GL_BACK);

    glPushAttrib(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT | GL_POLYGON_BIT | GL_STENCIL_BUFFER_BIT);
    glDisable(GL_LIGHTING);
    glDepthMask(GL_FALSE);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_STENCIL_TEST);
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
    glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFFL);

    glEnable(GL_CULL_FACE);

    // Pass 1
    glFrontFace(GL_CCW);
    glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);

    glDLShadow = glGenLists(1);
    glNewList(glDLShadow, GL_COMPILE_AND_EXECUTE);
   // Draw geometry...
    glEndList();

    // Pass 2
    glFrontFace(GL_CW);
    glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);

    glCallList(glDLShadow);
    glDeleteLists(glDLShadow, 1);


    glFrontFace(GL_CCW);
    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

    glStencilFunc(GL_NOTEQUAL, 0, 0xFFFFFFFFL);

    // Shadow color
    glColor4f(0.0f, 0.0f, 0.0f, 0.4f);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glPushMatrix();
    glLoadIdentity();
    glBegin(GL_TRIANGLE_STRIP);
        glVertex3f(-0.1f, 0.1f,-0.10f);
        glVertex3f(-0.1f,-0.1f,-0.10f);
        glVertex3f( 0.1f, 0.1f,-0.10f);
        glVertex3f( 0.1f,-0.1f,-0.10f);
    glEnd();
    glPopMatrix();
    glPopAttrib();


Ansonsten ist alles wie im Tutorial.
Weiß jemand woran das liegen koennte?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Fr Nov 05, 2010 16:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Schau dir mal unseren Artikel hier zu dem Thema an : http://wiki.delphigl.com/index.php/Volu ... ilschatten

Bei den Stencilschatten muss man z.B.die zFail-Methode nutzen wenn die Kamera im Schatten liegt, dass trifft nämlich genau auf dein zweites Bild zu. Die Methode ist zwar minimal komplexer weil man dem Schatten einen "Deckel" verpassen muss, aber für sowas unumgänglich.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Fr Nov 05, 2010 18:30 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Ah danke!
Hab jetzt die zFail - Methode angewendet. Dadurch sind die 2 Probleme behoben aber ein neues taucht auf: Jetzt wird der Schatten 2x gerendert.
Also ein Schatten der passt und noch einer der immer relativ zur Kameraposition liegt.

Nochmal ein Screenshot :):

http://xyross.de/file.php?id=84

Code:
Code:
    glPushAttrib(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ENABLE_BIT | GL_POLYGON_BIT | GL_STENCIL_BUFFER_BIT);
    glDisable(GL_LIGHTING);

    glDepthMask(0);
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
    glDisable(GL_CULL_FACE);
    glEnable(GL_STENCIL_TEST);
    glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);


    glActiveStencilFaceEXT(GL_BACK);
    glStencilOp(GL_KEEP, GL_INCR_WRAP_EXT, GL_KEEP);
    glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFFL);


    glActiveStencilFaceEXT(GL_FRONT);
    glStencilOp(GL_KEEP, GL_DECR_WRAP_EXT, GL_KEEP);
    glStencilMask(~0);
    glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFFL);


   // Draw geometries...


    glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
    glStencilFunc(GL_NOTEQUAL, 0, 0xFFFFFFFFL);

    glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glPushMatrix();
    glLoadIdentity();
    glBegin(GL_TRIANGLE_STRIP);
        glVertex3f(-0.1f, 0.1f,-0.10f);
        glVertex3f(-0.1f,-0.1f,-0.10f);
        glVertex3f( 0.1f, 0.1f,-0.10f);
        glVertex3f( 0.1f,-0.1f,-0.10f);
    glEnd();

    glPopMatrix();
    glPopAttrib();


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Fr Nov 05, 2010 19:11 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Bei zFail muss man für jedes Schattenvolumen eine Kappe konstruieren, also quasi nach hinten mit einer Silhouette abschliessen und nach vorne. Hast du das auch gemacht? Wenn nicht dann entstehen die von dir gezeigten doppelten Schatten.

P.S. : Bitte poste doch Bilder hier direkt als Anhang oder so, ansonsten muss man die immer erst runterladen bevor man sie sehen kann.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Fr Nov 05, 2010 20:24 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Das mit den Kappen hab ich jetzt gemacht. Sieht zwar etwas unsauber aus aber Hauptsache ist ja das
moeglichst keine Loecher innerhalb dess Schattenvolumes sind oder?

Hier die Screenshots:
Dateianhang:
shadow1.jpg

Dateianhang:
shadow2.jpg


Leider hat sich am Problem nichts verändert :(.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Fr Nov 05, 2010 20:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dann machst du es nicht korrekt. Ist dein Mesh auch wirklich geschlossen? Denn Meshs mit Löchern kann man mit Stencilschatten via zFail nicht verwenden. Und wie erstellst du die Kappen? Normalerweise kann man dazu ja direkt die Silhouette des Schattenwerfers nutzen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Fr Nov 05, 2010 20:32 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Ja, ich verwende die Silhouette dess Schattens und verbinde alle Punkte zu einem GL_POLYGON.
Das Modell hat keine Loecher...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Fr Nov 05, 2010 21:14 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Hm... aber ich glaube das hängt nicht direkt mit den Kappen zusammen... weil mir ist gerade aufgefallen das
der nicht den selben Schatten 2x rendert sondern das normale Objekt als Schatten rendert.

Edit:
Habs soeben mal mit einem Würfel ausprobiert wo garantiert keine Loecher drin sind -> selbe Problem :(..
Also fällt das mit den Loechern schonmal weg...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Fr Nov 05, 2010 23:18 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Für die Kappe beim Objekt sollte man kein einfaches GL_POLYGON verwenden, weil sonst diese Kappe auf das Objekt selbst Schatten werfen kann (an Stellen wo dies nicht geschehen sollte). Das wäre zum Beispiel bei einer Suppenschüssel deren Öffnung in Richtung Licht zeigt der Fall.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Sa Nov 06, 2010 12:18 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
@Schläfer
Stimmt... Ist ja nur vorrübergehend um es zu testen...

Hab das Licht jetzt mal an eine bessere Position gesetzt um die Silhouette besser erkennbar zu machen.

Dateianhang:
schatten1.jpg

Dateianhang:
schatten2.jpg

Dateianhang:
schatten3.jpg


Wie man auf dem 2. Bild sieht ist die vordere Kappe eingeknickt... Darf das sein oder muss die Kappe einflächig sein?
Und passt auch die Position der hinteren Kappe oder muss die vor das Objekt?


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Sa Nov 06, 2010 15:38 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Darf das sein oder muss die Kappe einflächig sein?
Wie viele Flächen die Kappe hat ist grundsätzlich egal, es dürfen bloß keine Löcher drinnen sein. Die dem Licht zugewandte Kappe muss zudem zu deiner Geometrie passen (und zwar so, dass sie nicht davor liegt, und auch nicht (zu weit) dahinter). Die dem Licht abgewandte Kappe muss auf der FarCP liegen, oder dahinter, wenn die FarCP deaktiviert ist (NV_Depth_Clamp glaub ich hieß das) Was deine Bilder angeht: Da werd ich nicht wirklich schlau daraus. Hast du da einfach die dem Licht zugewandten Kappen ein Stück verschoben, um die abgewandten zu kriegen? Weil so gehts nicht wirklich...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Sa Nov 06, 2010 15:51 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Auf den 2 Bildern (ohne Stencil - Operationen) ist die selbe Szene zu sehen, aber aus 2 verschiedenen Perspektiven.
Ich hab absichtlich die Länge dess Schattenwurfs verringert damit man sieht das die Kappe richtig drauf ist. Auf dem 3. Bild hab ich die Länge dess Schattens natürlich verlängert, sonst würde man ja garkeinen Schatten sehen ;).

Zitat:
Die dem Licht zugewandte Kappe muss zudem zu deiner Geometrie passen (und zwar so, dass sie nicht davor liegt, und auch nicht (zu weit) dahinter)

Ja, die Kappen passen, die verschließen den Schattenwurf am Anfang und Ende lückenlos.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Stencil - Schatten
BeitragVerfasst: Mi Nov 10, 2010 19:10 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hm, hast du auch daran gedacht, dass die beiden Kappen in unterschiedlicher Orientierung gezeichnet werden müssen? Also die Vertices der Kappe beim Objekt gegen den Uhrzeigersinn und die der entfernten im Uhrzeigersinn. Die Seitenflächen müssen außerdem auch nach außen zeigen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.013s | 16 Queries | GZIP : On ]