DGL
https://delphigl.com/forum/

Schattendemo
https://delphigl.com/forum/viewtopic.php?f=20&t=10624
Seite 1 von 3

Autor:  MBS [ So Okt 21, 2012 14:28 ]
Betreff des Beitrags:  Schattendemo

Hi Leute,

Hat irgendjemand eine Schattendemo für mich?
Ich habe versucht das Tutorial http://wiki.delphigl.com/index.php/GLSL_Licht_und_Schatten zu machen^^
Ich habe das prinzip + den Shadercode verstanden, nur ich schaffe es nicht die Schatten in meinem Programm umzusetzten, weil ich den Delphi-Quellcode vom Tutorial nicht nachvollziehen kann.

Danke für's Lesen :D

Autor:  Thmfrnk [ Mo Okt 22, 2012 06:57 ]
Betreff des Beitrags:  Re: Schattendemo

Für den Anfang ist auch dieses Tutorial nicht schlecht: http://fabiensanglard.net/shadowmapping/index.php

Wo genau hast du denn Probleme?

Autor:  MBS [ Do Okt 25, 2012 18:28 ]
Betreff des Beitrags:  Re: Schattendemo

Ich kann einfach nicht ruhig schlafen, solange das nicht läuft, denn das ist etwas ziemlich wichtiges.
Ich habe im Anhang meine Projektdatei und das Ergebnis des Programms.
Irgendetwas läuft schön falsch. Es sieht aus, als wäre meine ganze Szene im Schatten.

Ich hoffe ihr könnt mir helfen und nimmt euch auch kurz Zeit mein Projekt durchzugucken :D

Dateianhänge:
Projekt.zip [97.95 KiB]
516-mal heruntergeladen
Ergebnis.jpg [52.59 KiB]
Noch nie heruntergeladen

Autor:  MBS [ Sa Okt 27, 2012 19:21 ]
Betreff des Beitrags:  Re: Schattendemo

Hat denn niemand kurz Zeit sich das durchzusehen :(

Das wäre so nett von euch :wink:

Autor:  Lord Horazont [ So Okt 28, 2012 11:37 ]
Betreff des Beitrags:  Re: Schattendemo

Niemand hat die Zeit, sich mal eben so eine Zip runterzuladen, die bei sich zu kompilieren (ne Fremde .exe ausführen ... hmm; falls man überhaupt Windows hat) und dann deine Fehler zu debuggen. Du musst schon versuchen, den Fehler irgendwie einzugrenzen. Lass dir z.B. den Inhalt der relevanten Texturen ausgeben (wenn es Shadowmapping ist). Rechne ein kleines Offset auf die Daten drauf um zu schauen obs vielleicht nur nen Rundungsfehler ist und whatnot.

Wenn du nicht zeigst, dass du selber ein wenig Arbeit reingesteckt hast, den Fehler zu finden, wird sich nur schwer jemand motivieren lassen. Leider. Aber wir haben auch alle nicht unendlich viel Zeit.

grüße

Autor:  MBS [ So Okt 28, 2012 17:08 ]
Betreff des Beitrags:  Re: Schattendemo

ok :)

Ups, als ich gerade eine logische Reinfolge schreiben wollte, was ich gemacht habe und daher bei OnCreate anfangen wollte, sah ich gleich, dass ich die Prozedur zum erstellen des Framebufferobjekts gar nicht ausgeführt habe. :oops:
Jetzt sehe ich schon sowas wie Licht^^ Ich werde versuchen, die noch seltsamen Schatten zu fixen ;)
Wenn ich da noch das ein oder andere Problem habe melde ich mich :)

Das kennt ihr doch bestimmt auch, dass man nicht auf den Fehler kommt, bis man es jemanden zeigen möchte^^

Autor:  Lord Horazont [ So Okt 28, 2012 17:09 ]
Betreff des Beitrags:  Re: Schattendemo

Ja, genau deswegen sollst du ja erstmal versuchen den Fehler einzugrenzen ;). Aber schön dass es jetzt schonmal besser funktioniert :)

grüße

Autor:  MBS [ So Okt 28, 2012 17:31 ]
Betreff des Beitrags:  Re: Schattendemo

So sieht das momentane ergebnis aus (siehe Anhang) ^^

Ich frag mich gerade, was deneben gegangen sein könnte.
Ich denke irgendetwas mit dem Framebufferobjekt. Ich denke aber nicht, dass das am Shader leigen könnte.

Falsch an dem Ergebnis ist, dass:
1. das Quad keinen Schatten castet
2. der Lichtkreis nicht dieselbe Farbe hat, sondern dass an den Winkeln 0° und 180° ein schwarzer Übergang ist

Dateianhänge:
Unbenannt.png [57.97 KiB]
Noch nie heruntergeladen

Autor:  MBS [ Mo Okt 29, 2012 13:07 ]
Betreff des Beitrags:  Re: Schattendemo

Was habe ich gemacht?
Beim erstellen der Anwendung habe ich die Shader geladen und ein Framebufferobjekt für das Rendern der Schatten erstellt.
An diesem Framebufferobjekt habe ich eine Texture gebunden, die das grenderte als shadow_map speichern soll. Die Größe der Texture entspricht meiner der Variabeln shadow_size.
Nach dem erstellen dieses Framebufferobjekts und der Framebuffertexture prüfe ich den Status des Framebufferobjekts.
Im Quellcode sieht das so aus:
Code:
  1.  
  2. procedure TForm1.CreateFBO;
  3. begin
  4.   shadow_size := 4096; // Die Auflösung, die ich erwähnte
  5.  
  6.   glGenTextures(1, @shadow_map); //Die shadowtexture
  7.   glBindTexture(GL_TEXTURE_2D, shadow_map);
  8.   glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, shadow_size, shadow_size, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NIL);
  9.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  10.  
  11.   glGenFramebuffersEXT(1, @shadow_fbo);  //das Framebufferobjekt
  12.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, shadow_fbo);
  13.   glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, shadow_map, 0);
  14.   glDrawBuffer (GL_FALSE);
  15.   glReadBuffer(GL_FALSE);
  16.   CheckFrameBufferObject;  //FBO prüfen
  17. end;
  18.  


Beim ausführen der Procedure CreateFBO kam es zu keinen Fehlern, der Status des Framebufferobjekts hatte keine Fehler.

Dieser Abschnitt (Shader laden + FBO) scheint einwandfrei funktioniert zu haben. Deshalb erläutere ich jetzt, was ich beim Rendern, das ich in dem OnIdle-Event der Anwendung ausführe gemacht habe.
Als erstes habe ich die Zeit für die FPS berechnung gemessen. Danach habe ich versucht, das FBO zu rendern (mit den ShadowShader). Da ich zwei Lichter rendere habe ich eine for-Schleife in der ich 360° rendere. Danach deaktiviere ich das Framebufferobjekt und rendere dich Szene mit dem Final-Shader. Nach dem eigentlichen Rendern berechne ich die FPS.
Im Quellcode sieht das bei mir so aus:
Code:
  1.  
  2. procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
  3. var light,lights: integer;
  4. begin
  5.   StartTime:=GetTickCount;
  6.   //---------------------
  7.   //Rendern
  8.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  9.  
  10.   glMatrixMode(GL_PROJECTION);
  11.   glLoadIdentity;
  12.   gluPerspective(45.0,ClientWidth/ClientHeight,1,1000);
  13.  
  14.   glMatrixMode(GL_MODELVIEW);
  15.   glLoadIdentity;
  16.  
  17.  
  18.   //Shader für Dualparabolische Maps aktivieren
  19.   glUseProgramObjectARB(ShadowShader);
  20.  
  21.   //Framebufferobjekt aktivieren
  22.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, shadow_fbo);
  23.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  24.  
  25.   lights:=2; //Count der Lichter
  26.   for light := 0 to lights-1 do //zwei Lichter
  27.   begin
  28.     glViewport(round(shadow_size/2*(lights/4)), round(shadow_size/4 *(light mod 4)), round(shadow_size/4), round(shadow_size/4));
  29.     glUniform1iARB(glGetUniformLocationARB(ShadowShader, 'light'), light);
  30.     glUniform1iARB(glGetUniformLocationARB(ShadowShader, 'renderpass'), 0);
  31.     DrawObjects;
  32.     glViewport(round(shadow_size/4+shadow_size/2*(lights/4)), round(shadow_size/4*(light mod 4)), round(shadow_size/4), round(shadow_size/4));
  33.     glUniform1iARB(glGetUniformLocationARB(ShadowShader, 'renderpass'),1);
  34.     DrawObjects;
  35.   end;
  36.  
  37.   // Framebufferobjekt deaktivieren
  38.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  39.  
  40.   //Finalen Shader aktivieren
  41.   glUseProgramObjectARB(FinalShadowsShader);
  42.   //Viewport an Fenstergröße anpassen
  43.   glViewport(0, 0, ClientWidth, ClientHeight);
  44.  
  45.   //Finalrender
  46.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  47.   DrawObjects;
  48.  
  49.   SwapBuffers(dc);
  50.   //---------------------
  51.  
  52.   DrawTime:=GetTickCount-StartTime;
  53.   inc(TimeCount,DrawTime);
  54.   inc(FrameCount);
  55.  
  56.   if TimeCount>1000 then
  57.   begin
  58.     Frames:=FrameCount;
  59.     TimeCount:=TimeCount-1000;
  60.     FrameCount:=0;
  61.     Caption:=IntToStr(Frames)+' FPS';
  62.     //Errorhandler;
  63.   end;
  64.  
  65.   Done:=False;
  66. end;
  67.  


Das zeichnen der Objekte übernimmt die Prozedur DrawObjects.

Code:
  1.  
  2. procedure TForm1.DrawObjects;  //Rendern der Objekte
  3. const
  4.     light_position1 : Array[0..3] of GlFloat = (100.0, 10.0, 5.0, 1.0);
  5.     light_position2 : Array[0..3] of GlFloat = (-10.0, 2.0, -5.0, 1.0);
  6.     light_ambient  : Array[0..3] of GlFloat = (0.8, 0.8, 0.8, 1.0);
  7.     light_diffuse  : Array[0..3] of GlFloat = (0.8, 0.8, 0.8, 1.0);
  8.  
  9. begin
  10.   glLightfv(GL_LIGHT0, GL_AMBIENT,  @light_ambient[0]); //Zwei Lichter hinzufügen, das der Shader mit den Lichterposition arbeitet
  11.   glLightfv(GL_LIGHT0, GL_DIFFUSE,  @light_diffuse[0]);
  12.   glLightfv(GL_LIGHT0, GL_POSITION, @light_position1[0]);
  13.   glLightfv(GL_LIGHT1, GL_AMBIENT,  @light_ambient[0]);
  14.   glLightfv(GL_LIGHT1, GL_DIFFUSE,  @light_diffuse[0]);
  15.   glLightfv(GL_LIGHT1, GL_POSITION, @light_position2[0]);
  16.   glDisable(GL_LIGHTING); //OpenGl-Licht deaktivieren
  17.   glEnable(GL_LIGHT0); //Lichter aktivieren
  18.   glEnable(GL_LIGHT1);
  19.  
  20.   glLoadIdentity;
  21.   glTranslatef(10,-15,-50); //Position der Camera
  22.   glRotatef(45,0,1,0);        //Rotation der Camera
  23.   glPushMatrix;
  24.     glColor4f(0.3,0.3,0.3,1);
  25.     glBegin(GL_QUADS);
  26.     glVertex3f(-35,2,-35);
  27.     glVertex3f(-35,2, 15);
  28.     glVertex3f( 15,2, 15);
  29.     glVertex3f( 15,2,-35);
  30.     glEnd();
  31.   glPopMatrix;
  32.  
  33.   glColor4f(0.9,0.9,0.9,1);
  34.   glTranslatef(0,0,-5);
  35.   glPushMatrix;
  36.   glBegin(GL_QUADS);
  37.     glVertex3f(0,10,0);
  38.     glVertex3f(0,0,0);
  39.     glVertex3f(10,0,0);
  40.     glVertex3f(10,10,0);
  41.   glend;
  42.   glPopMatrix;
  43.   //-------
  44. end;
  45.  


Das habe ich gemacht, das ergebnis ist seltsam^^ Es etwas wie ein Licht gerendert, doch es entstehen keine Schatten und der Lichtkreis ist auch fehlerhaft.
Ich habe das Gefühlt, dass es am Rendern des Framebufferobjekts liegt. Da ich mit Framebufferobjekten noch nicht viel Erfahrung habe, bitte ich euch um Hilfe :D

PS: Ihr könnt auch gerne selbst einen Blick auf das Projekt werfen. Im Anhang habe ich die Projekt-Datei ;)

Dateianhänge:
Dateikommentar: Die Projektdatei.
Projekt.rar [90.54 KiB]
501-mal heruntergeladen

Autor:  MBS [ Di Dez 18, 2012 17:36 ]
Betreff des Beitrags:  Re: Schattendemo

Hat jemand von euch noch eine Schattendemo auf der Platte?

Autor:  yunharla [ Di Dez 18, 2012 19:36 ]
Betreff des Beitrags:  Re: Schattendemo

ähm.... ich sags mal .... nett.... die Basics sind schon voller Fehler....
ich empfehl dir mal nehe und robsite durchzuarbeiten um die Grundlagen zu verstehen...

Autor:  MBS [ Mi Dez 19, 2012 21:33 ]
Betreff des Beitrags:  Re: Schattendemo

Kannst du mir nicht bitte sagen, wo die Fehler sind, damit ich weiß wo die Nadel im Heuhaufen sein könnte?

Autor:  Traude [ Do Dez 20, 2012 14:53 ]
Betreff des Beitrags:  Re: Schattendemo

Wenn mich nicht alles täuscht, gibt es dafür im Wiki einen Artikel, nämlich hier: http://wiki.delphigl.com/index.php/GLSL ... d_Schatten

Autor:  MBS [ Do Dez 20, 2012 14:59 ]
Betreff des Beitrags:  Re: Schattendemo

Genau. Den Beitrag habe ich ja durchgearbeitet. Das Ergebnis ist meine Projektarchiv, das ich schon hochgeladen habe. Doch ich wollte auch fragen, ob jemand von euch etwas ausführbares hat oder mir Fehlerstellen in meinem Projekt zeigen kann.

Autor:  Traude [ Do Dez 20, 2012 17:14 ]
Betreff des Beitrags:  Re: Schattendemo

Ja , ich habe etwas Ausführbares. Allerdings nicht aus diesem Tutorial, sondern von der Website Fabien Sanglard; das ist kein Dual Paraboloid- sondern ein normales Shadow Mapping, nur mit einer Shadowmap, und ich habe es in meine Engine "hineingeflochten".

Das bedeutet, damit Du damit etwas anfangen kannst, muss ich es in eine einfachere Form gießen, was gar nicht so einfach ist. Und ich arbeite schon lange nicht mehr mit Delphi, sondern mit Free Pascal. Ich verwende kein TForm, sondern erzeuge alle meine Fenster selbst. Das sollte eigentlich in Delphi auch laufen.

Zusätzlich ist gerade die Woche vor Weihnachten(!).

Allerdings - ich habe eine Vorlage für eine Test-Grafikanwendung, mit der ich alle meine Tests mache und auch archiviere. Die könnte ich verwenden und ein ShadowMapping einfügen, das wäre vielleicht bis morgen Abend zu schaffen.

Seite 1 von 3 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/