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

Aktuelle Zeit: Fr Jul 18, 2025 08:07

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit Shadowmapping
BeitragVerfasst: Sa Jul 30, 2011 11:49 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Moin,

ich bin schon 3 Tage am basteln ein vernünftiges Shadowmapping für Sonnenlicht hinzubekommen. Problem ist das die "Welt" ziemlich groß sein kann (ca 4x4km und größer). Ich hab gedacht das ich das mit PSM hinbekomme, doch da meine Kamera frei beweglich ist is das mist. Nun bin ich grad beim "normalem" shadowmapping:
1. ich transformiere meine modelviewmatrix mit gluLookAt das ich das meine Sonne genau auf den Mittelpunkt scheint
2. ich rendere meine Szenen Tiefe in ein FBO
3. die projektionsmatrix der Sonne setzte ich auf 90° FOV und 1 und 200 (near und far)
4. die projektion mach ich in dem ich die inverse projectionsmatrix mit der Sonennmatrix multipliziere und später druch w teile

doch das problem ist das entweder nur große objekte schatten werden oder wenn ich mit den near/far werten spiele nur kleine objekte. Und nach 1km ist alles schwarz. Irgenwas mach ich da falsch.
Kann es sein das die near/far werte noch irgendwo in die Schattenberechnugn mit einfließen müssen?

Wollte mich eigentlich noch an CSM versuchen, doch wenn nichtmal das normale Shadowmapping funktioniert...

Vielleicht kann mir ja einer helfen.

Grüße
Thomas


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Shadowmapping
BeitragVerfasst: Sa Jul 30, 2011 21:23 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Eigentlich müsste das gehen, das klingt eher nach einem Genauigkeitsproblem. Hast du einen 24bit-Tiefenpuffer? Versuch sonst mal, lineare Tiefenwerte da reinzuschreiben (ruhig auch mit nem größeren zFar, ich nehme außerdem mal an, dass du Shader benutzt).

Vielleicht liegt das Problem aber auch bei der Projektion. Liege ich richtig, dass du dafür die Pixelposition und die Tiefeninformation mehr oder weniger un-projectest? Ich hab das bisher immer so gemacht, dass ich anhand der Vertexpositionen genau dieselben Transformationen wie beim Rendern der Shattentextur durchgeführt habe, und weils ein Texturzugriff ist und kein Framebuffer-Writing, das ganze dann noch plus und mal 0.5, ums auf den Bereich 0..1 zu mappen. Da landet man zumindest bein exakt denselben Koordinaten.


Ach ja:
Zitat:
1. ich transformiere meine modelviewmatrix mit gluLookAt das ich das meine Sonne genau auf den Mittelpunkt scheint

Nur ne Verständnisfrage, heißt, das, du renderst die Szene einfach aus Sicht der Sonne?

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Shadowmapping
BeitragVerfasst: So Jul 31, 2011 03:23 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Für Sonnenlicht sollte man vllt eine orthogonale Projektion benutzen. Da die Sonne so weit entfernt ist, sind die Schatten annähernd parallel.
Das mit der Bittiefe ist auch etwas was du überprüfen solltest. Kann sein das bei GL_DEPTH_COMPONENT (ohne eine Zahl hinten dran) automatisch nur 16Bit verwendet werden.
Ansonsten, wenn du sicher bist das die Shadowmaps richtig sind, kannst du ja mal etwas Shader-Code zeigen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Shadowmapping
BeitragVerfasst: Mo Aug 01, 2011 18:17 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
ja so ganz lösen konnte ich das problem immer noch nicht. Hier nun ein bisschen Code:

1. Initialisieren des ShadowFBO
Code:
  1.  
  2. function TShadowFbo.Generate(Attachments: Integer): Boolean;
  3. var
  4.   i: Integer;
  5.   FBOState: TuInt32;
  6. begin
  7. SetLength(tex, Attachments);
  8.   for I := 0 to Attachments - 1 do
  9.    begin
  10.       // Try to use a texture depth component
  11.       glGenTextures(1, @tex[i]);
  12.       glBindTexture(GL_TEXTURE_2D, tex[i]);
  13.       // GL_LINEAR does not make sense for depth texture. However, next tutorial shows usage of GL_LINEAR and PCF
  14.       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  15.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  16.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  17.       // No need to force GL_DEPTH_COMPONENT24, drivers usually give you the max precision if available
  18.       glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, width, Height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
  19.    end;
  20.       glBindTexture(GL_TEXTURE_2D, 0);
  21.       // create a framebuffer object
  22.       glGenFramebuffersEXT(1, @container);
  23.       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, container);
  24.       // Instruct openGL that we won't bind a color texture with the currently binded FBO
  25.       glDrawBuffer(GL_NONE);
  26.       glReadBuffer(GL_NONE);
  27.       // attach the texture to FBO depth attachment point
  28.       glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, tex[i], 0);
  29.       // check FBO status
  30.       FBOState := glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
  31.       if FBOState<> GL_FRAMEBUFFER_COMPLETE_EXT then
  32.      result:=false
  33.       else Result:=True;
  34.  
  35.       // switch back to window-system-provided framebuffer
  36.       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  37. end;
  38.  



2. Erstellen der Sonnenmatrix und Rendern der Tiefentextur aus Sicht der Sonne

Code:
  1.  
  2. procedure TCoreEngine.GenSunShadowMap;
  3.  procedure GenShadowMatrix;
  4.  var
  5.   modelView: TMatrix4d;
  6.   projection: TMatrix4d;
  7.  begin
  8.   glMatrixMode(GL_MODELVIEW);
  9.    glPushMatrix;
  10.     glLoadIdentity;
  11.      gluLookat(SunlightX, SunlightY, SunlightZ, 0, 0, 0,   0, 1, 0);
  12.      glGetFloatv(GL_MODELVIEW_MATRIX, @sunMat);
  13.     glLoadIdentity;
  14.      gltranslatef(0.5, 0.5, 0);
  15.      glScalef(0.5, 0.5, 1.0);
  16.       gluPerspective(sunfov, 1,    shadowNear, shadowFar);
  17.       glMultMatrixf(@sunMat);
  18.       glGetFloatv(GL_MODELVIEW_MATRIX, @sunMatrix);
  19.    glPopMatrix;
  20.  end;
  21.  
  22. begin
  23.  GenShadowMatrix;
  24.      sunShadowFbo.bind;
  25.       glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
  26.           GL_TEXTURE_2D, sunShadowFbo.Tex[0], 0);
  27.         glViewPort(0, 0, sunshadowFBO.Width, sunshadowFBO.Height);
  28.         glMatrixMode(GL_PROJECTION);
  29.          glPushMatrix;
  30.           glLoadIdentity;
  31.            gluPerspective(sunfov, 1, shadowNear, shadowFar + 30); // Keine ahnung ob das richtig ist
  32.          glMatrixMode(GL_MODELVIEW);
  33.              glPushMatrix;
  34.               glLoadIdentity;
  35.                gluLookat(SunlightX, SunlightY, SunlightZ, 0, 0, 0,   0, 1, 0);
  36.                  glClear( GL_DEPTH_BUFFER_BIT);
  37.                  glColorMask(false, false, false, false);
  38.                  glPushMatrix;
  39.                   renderObjects;
  40.                  glPopMatrix;
  41.               glColorMask(true, true, true, true);
  42.             glPopMatrix;
  43.          glMatrixMode(GL_PROJECTION);
  44.           glPopMatrix;
  45.          glMatrixMode(GL_MODELVIEW);
  46.      sunShadowFBO.Unbind;
  47. end;
  48.  


3. Fragment Shader für Sonnenlicht

Code:
  1.  
  2. uniform sampler2D Texture0;
  3. uniform sampler2D sunShadowMap;
  4. varying vec3 globalLightVec;
  5. varying vec3 vNormal;
  6. varying vec4 vVertex;
  7. varying vec3 aNormal;
  8.  varying vec4 projCoord;
  9.  
  10.  
  11. void main(void) {
  12.  
  13.    vec4  shadowCoordWdiv;
  14.    float distanceFromLight;  
  15.          vec4 SK = projCoord;            
  16.             SK.z += 2.0;         
  17.             shadowCoordWdiv =  (SK / SK.w);    
  18.             shadowCoordWdiv.z += 0.0007;           
  19.    
  20.    distanceFromLight = texture2D(sunShadowMap, shadowCoordWdiv.xy).z;          
  21.    
  22.    vec4 backgroundColor = vec4(0.0);
  23.    vec3 normal = normalize(aNormal);
  24.    
  25.   if (gl_FrontMaterial.ambient.a > 0.0) {  
  26.      backgroundColor = gl_FrontMaterial.ambient;
  27.    }   else
  28.       backgroundColor = texture2D(Texture0, gl_TexCoord[0].xy);      
  29.      
  30.  
  31.     vec3 Reflected = normalize(reflect( -globalLightVec, normal));  
  32.     vec3 Eye = normalize(-vVertex.xyz);      
  33.     vec4 IAmbient  = 0.8 * gl_FrontMaterial.ambient;
  34.     vec4 IDiffuse  =  2.0 * max(dot(normal, globalLightVec), 0.0) * gl_FrontMaterial.diffuse;
  35.     //vec4 ISpecular = gl_LightSource[0].specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess) * gl_FrontMaterial.specular;
  36.    
  37.     vec4 global_color = vec4((gl_FrontLightModelProduct.sceneColor + IAmbient + IDiffuse) * backgroundColor);// + ISpecular);  
  38.  
  39.       if(projCoord.q > 0.0) {    
  40.           if (distanceFromLight > shadowCoordWdiv.z)      {
  41.               //Licht
  42.               gl_FragColor = global_color;
  43.               }
  44.         else{
  45.               //Schatten
  46.               gl_FragColor = IAmbient * backgroundColor;
  47.               gl_FragColor.a = 0.2;
  48.               }
  49.     }
  50.      else
  51.       gl_FragColor = vec4(0.0);        
  52. }
  53.  


4. Vertex Shader für Sonnenlicht
Code:
  1.  
  2. varying vec3 vNormal;
  3. varying vec4 vVertex;
  4. varying vec3 aNormal;
  5. varying vec3 globalLightVec;
  6. varying vec4 projCoord;
  7.  
  8. uniform mat4 InvMat;
  9. uniform mat4 texMat;
  10.  
  11. void main(void) {
  12.    vNormal    = normalize(gl_NormalMatrix * gl_Normal);
  13.    aNormal    = gl_NormalMatrix * gl_Normal;
  14.    vVertex      = gl_ModelViewMatrix * gl_Vertex;
  15.    
  16.  
  17.    
  18.    vec4 posWorld = InvMat * vVertex;
  19.    projCoord  = texMat * posWorld;
  20.  
  21.    
  22.    vec3 v = vec3(0.0, 2000.0, 0.0);
  23.    globalLightVec =  normalize(gl_LightSource[0].position.xyz - vVertex.xyz);
  24.    
  25.    gl_TexCoord[0]    = gl_MultiTexCoord0;
  26.    gl_Position       = gl_ModelViewProjectionMatrix * gl_Vertex;
  27. }
  28.  



Und anbei noch 2 Bilder die das Problem verdeutlichen.
Im ersten Bild hab ich ShadowNear auf 2.09 und ShadowFar auf 5000. Damit wird schatten über die ganze Szene geworfen, aber der Schatten fängt erst 1m hinter dem objekt an. Im 2. Bild ist ShadowNear = 2.07 und ShadowFar auf 5000. Nun fängt der Schatten gleich am Objekt an aber ich kann nicht die ganze Szene schattieren... :(


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Shadowmapping
BeitragVerfasst: Mo Aug 01, 2011 21:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm… Scheint mir, dass die Auflösung des Tiefenbuffers dein Problem ist. Ich habe mal von einer Technik gelesen, die den Buffer nach der Entfernung von der Kamera unterteilt und für die Abschnitte mit abgestufter Auflösung die Shadowmaps berechnet. Habe aber den Namen vergessen…

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  
 Betreff des Beitrags: Re: Probleme mit Shadowmapping
BeitragVerfasst: Mo Aug 01, 2011 21:30 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
was du meinst sind CSM (Cascaded Shadow Maps), bevor ich die implementiere wollt ich aber erst das normale Shadowmapping hinbekommen. Soweit ich bisher woanders überall sehen konnte ist das einzigste Problem das die Schatten je größer die Entfernung ist verpixeln, aber nicht wie bei mir der Schatten am Anfang verschwindet..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Shadowmapping
BeitragVerfasst: Di Aug 02, 2011 04:11 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hi,

Hab' nur mal kurz drüber geschaut, aber mir sind ein paar Sachen aufgefallen, die für mich nicht so richtig Sinn ergeben:

Zitat:
SK.z += 2.0;
Was macht denn die Zeile? Und könnte es vllt sein das die Zeile mit der Darauffolgenden vertauscht werden muss?

Zitat:
gluPerspective(sunfov, 1, shadowNear, shadowFar);
...
gluPerspective(sunfov, 1, shadowNear, shadowFar + 30); // Keine ahnung ob das richtig ist
Unterscheiden sich da nicht die Matrizen die zum Zeichnen und für den Shader verwendet werden?




PS:
Zitat:
// GL_LINEAR does not make sense for depth texture. However, next tutorial shows usage of GL_LINEAR and PCF
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Funktioniert das wirklich? Würde mich mal interessieren wo du das her hast.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Probleme mit Shadowmapping
BeitragVerfasst: Di Aug 02, 2011 13:19 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
habs jetzt hinbekommen... Anscheinend waren die Matrizen doch unterschiedlich. Jetzt klappt alles wunderbar.

Kurz noch hinterher, ich hab gehört das Nvidia automatisch Hardware PCF macht? Wie kann ich das nutzen? Hab schon versucht anstatt texture2D > shadow2D und als Samper > sampler2DShadow zu verwenden, doch sieht genauso aus..


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.009s | 15 Queries | GZIP : On ]