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

Aktuelle Zeit: Sa Jun 08, 2024 07:49

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Mär 13, 2012 17:42 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Hi,
ich habe die letzten Tage erfolglos versucht einen Schatten mit dem Stencil-Puffer zu erzeugen. Er tut einfach schlicht und ergreifend: Gar nichts. Als hätte ich den Code einfach auskommentiert.

Hier der kritische Teil:

Code:
  1. glCullFace(GL_BACK);
  2.  
  3.     glPushAttrib(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_ENABLE_BIT
  4.                  or GL_POLYGON_BIT or GL_STENCIL_BUFFER_BIT);
  5.     glDisable(GL_LIGHTING);
  6.     glDepthMask(false);
  7.     glDepthFunc(GL_LEQUAL);
  8.     glEnable(GL_STENCIL_TEST);
  9.     glColorMask(false, false, false, false);
  10.     glStencilFunc(GL_ALWAYS, 1, $FFFFFFFF);
  11.  
  12.     glEnable(GL_CULL_FACE);
  13.  
  14.     // Pass 1
  15.     glFrontFace(GL_CCW);
  16.     glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
  17.  
  18.     RenderShadowVolume;
  19.  
  20.     // Pass 2
  21.     glFrontFace(GL_CW);
  22.     glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
  23.  
  24.     RenderShadowVolume;
  25.  
  26.  
  27.     glFrontFace(GL_CCW);
  28.     glColorMask(true, TRUE, TRUE, TRUE);
  29.  
  30.     glStencilFunc(GL_NOTEQUAL, 0, $FFFFFFFF);
  31.  
  32.     glColor4f(0.0, 0.0, 0.0, 0.4);
  33.  
  34.     glEnable(GL_BLEND);
  35.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  36.     glLoadIdentity;
  37.  
  38.     glPushMatrix;
  39.  
  40.     glBegin(GL_TRIANGLE_STRIP);
  41.         glVertex3f(-0.1, 0.1,-0.10);
  42.         glVertex3f(-0.1,-0.1,-0.10);
  43.         glVertex3f( 0.1, 0.1,-0.10);
  44.         glVertex3f( 0.1,-0.1,-0.10);
  45.     glEnd;
  46.     glPopMatrix;
  47.     glPopAttrib;
  48.  


Ja, der Code ist nicht von mit, sondern aus einem Tutorial, desen Link ich nicht mehr finde. Also theoretische sollte es funktionieren.
In der Procedure RenderShadowVolume wird das Schatten-Volumen gerendert - was allerdings richtig sein sollte..
Vorher berechne ich alle Dreiecke die angestrahlt werden - das geht 100% ig - und anschließend berechne ich die Silhouette und verlängere diese nach "unendlich"
Nach einer Triangulation sieht ein Plot etwa so aus: (das farbige Ding gehört nicht mehr dazu - das ist das Objekt welches beleuchtet wird)

Bild


Wenn ich die Methode nicht komplett falsch verstanden habe sollte das funktionieren :?

Aufgerufen wird das dann so:
Code:
  1.  
  2.   //Skybox rendern
  3.   RenderSkybox;
  4.  
  5.   with CenterPos do
  6.     glTranslatef(-x, -y, -z);
  7.  
  8.   // Das Objekt zeichnen
  9.   glEnable(GL_LIGHTING);
  10.    RenderCylinder;   //Rendert das Objekt (das "farbige Ding" )
  11.   glDisable(GL_LIGHTING);
  12.  
  13.   //Schatten zeichnen
  14.    RenderShadow;


RenderShadow ruft obigen Code auf.

Wie gesagt: Es tut sich gar nichts...

OpenGl initialisiere ich so:
Code:
  1. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 8, 0, 0, 0);

Der Stencilbuffer hat also seine 8 Bit, daran kanns nicht liegen

Ich weiß nicht mehr woran das liegen könnte... Was mach ich schon wieder falsch?

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 13, 2012 19:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich misstraue deinem Schatten-Renderer (ab Zeile 34 in deinem Codeschnipsel). Die Koordinaten sehen arg komisch aus. Sollte das ein Fullscreenquad werden? Wenn ja: glLoadIdentity auch auf die Projektionsmatrix anwenden und die Koordinaten von -1 bis 1 wählen, Tiefentest raus.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 14, 2012 12:06 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Lord Horazont hat geschrieben:
Ich misstraue deinem Schatten-Renderer (ab Zeile 34 in deinem Codeschnipsel). Die Koordinaten sehen arg komisch aus. Sollte das ein Fullscreenquad werden? Wenn ja: glLoadIdentity auch auf die Projektionsmatrix anwenden und die Koordinaten von -1 bis 1 wählen, Tiefentest raus.

greetings


Ja in der Tat - dem sollte man misstrauen.

Habs geändert auf:

Code:
  1.  
  2.      glMatrixMode(GL_PROJECTION);
  3.      glLoadIdentity;
  4.  
  5.      glMatrixMode(GL_MODELVIEW);
  6.      glLoadIdentity;
  7.  
  8.      glDisable(GL_DEPTH_TEST);
  9.  
  10.     glPushMatrix();
  11.     glBegin(GL_TRIANGLE_STRIP);
  12.         glVertex3f(-1, 1,-1);
  13.         glVertex3f(-1,-1,-1);
  14.         glVertex3f( 1, 1,-1);
  15.         glVertex3f( 1,-1,-1);
  16.     glEnd();
  17.     glPopMatrix();


Anschließend hat er was getan und zwar so was:
Bild

Ich habe zwar nicht so viel Ahnung, aber ich dachte das hängt mit einem falsch berechneten Schattenvolumen zusammen. Nachdem ich die Routine umgeschrieben hatte bzw optimiert hatte, geht es sogar. Allerdings schmiert er jetzt am Ende und am Anfang immer noch "aus" (siehe Bild 2)
(Ja, ich weiß die Farben sind im Moment noch nicht so optimal gewählt :P )

Bild


Bild

Täusche ich mich, oder liegt das daran dass hier die Silhouette nicht geschloßen ist? (was sie eigentlich sein sollte..)

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 25 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]