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

Aktuelle Zeit: So Mai 19, 2024 15:38

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



Ein neues Thema erstellen Auf das Thema antworten  [ 36 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Schattendemo
BeitragVerfasst: So Okt 21, 2012 14:28 
Offline
DGL Member

Registriert: So Sep 26, 2010 16:19
Beiträge: 64
Programmiersprache: Pascal
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: Mo Okt 22, 2012 06:57 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Für den Anfang ist auch dieses Tutorial nicht schlecht: http://fabiensanglard.net/shadowmapping/index.php

Wo genau hast du denn Probleme?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: Do Okt 25, 2012 18:28 
Offline
DGL Member

Registriert: So Sep 26, 2010 16:19
Beiträge: 64
Programmiersprache: Pascal
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]
421-mal heruntergeladen
Ergebnis.jpg [52.59 KiB]
Noch nie heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: Sa Okt 27, 2012 19:21 
Offline
DGL Member

Registriert: So Sep 26, 2010 16:19
Beiträge: 64
Programmiersprache: Pascal
Hat denn niemand kurz Zeit sich das durchzusehen :(

Das wäre so nett von euch :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: So Okt 28, 2012 11:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
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  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: So Okt 28, 2012 17:08 
Offline
DGL Member

Registriert: So Sep 26, 2010 16:19
Beiträge: 64
Programmiersprache: Pascal
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^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: So Okt 28, 2012 17:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ja, genau deswegen sollst du ja erstmal versuchen den Fehler einzugrenzen ;). Aber schön dass es jetzt schonmal besser funktioniert :)

grüße

_________________
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  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: So Okt 28, 2012 17:31 
Offline
DGL Member

Registriert: So Sep 26, 2010 16:19
Beiträge: 64
Programmiersprache: Pascal
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
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: Mo Okt 29, 2012 13:07 
Offline
DGL Member

Registriert: So Sep 26, 2010 16:19
Beiträge: 64
Programmiersprache: Pascal
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]
401-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: Di Dez 18, 2012 17:36 
Offline
DGL Member

Registriert: So Sep 26, 2010 16:19
Beiträge: 64
Programmiersprache: Pascal
Hat jemand von euch noch eine Schattendemo auf der Platte?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: Di Dez 18, 2012 19:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
ähm.... ich sags mal .... nett.... die Basics sind schon voller Fehler....
ich empfehl dir mal nehe und robsite durchzuarbeiten um die Grundlagen zu verstehen...

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: Mi Dez 19, 2012 21:33 
Offline
DGL Member

Registriert: So Sep 26, 2010 16:19
Beiträge: 64
Programmiersprache: Pascal
Kannst du mir nicht bitte sagen, wo die Fehler sind, damit ich weiß wo die Nadel im Heuhaufen sein könnte?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: Do Dez 20, 2012 14:53 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: Do Dez 20, 2012 14:59 
Offline
DGL Member

Registriert: So Sep 26, 2010 16:19
Beiträge: 64
Programmiersprache: Pascal
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattendemo
BeitragVerfasst: Do Dez 20, 2012 17:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 36 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.015s | 15 Queries | GZIP : On ]