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

Aktuelle Zeit: Fr Apr 19, 2024 17:40

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Schattenberechnung - so richtig?
BeitragVerfasst: Do Mai 02, 2013 16:08 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Hey,

Ich schlage mich schon seit... ja ewigkeiten mit einem Problem herum und kann den Fehler einfach nicht ausfindig machen.
Meine Schatten sind einfach etwas "zu tief" platziert (siehe Bild im Anhang) und einfach ein Offset zu addieren verursacht andere Probleme.

Ich erkläre mal in kurzen Stichpunkten wie ich die Schatten erstelle (ohne groß Code zu zeigen), in der Hoffnung, jemand erkennt einen Fehler.

- Tiefentexture erstellen und an FBO binden (Eigenschaften der Textur: GL_LINEAR (bei min, mag filter), Comparemode = GL_COMPARE_R_TO_TEXTURE, CompareFunc = GL_LEQUAL, GL_DEPTH_TEXTURE_MODE = GL_INTENSITY)
- FBO erstellen, Draw und ReadBuffer sind auf GL_None, Texture ans FBO hängen

Tiefentextur erstellen:
- Projektionsmatrix laden: glOrtho(-0.05 * Window_x, 0.05 * Window_x, -0.05 * Window_y, 0.05 * Window_y, 1000.0f, 10000.0f);
- In Modelview mode und gluLookAt mit der jeweiligen Position (beide Matritzen werden ausdem gespeichert für die Spätere berechnung)
- FBO einbinden, Szene rendern, FBO ausbinden

Schatten rendern:
- Matrixmode auf Texture stellen und GLTexture1 aktivieren (Um die fertige Matritze dort im Shader zu haben)
- Bias Matrix Laden, multiplizieren mit der Projektionsmatrix und nochmal multiplizieren mit der Modelview Matrix
- Wieder auf Modelview mode stellen und Szene normal rendern

Im Shader passiert noch folgendes:
(Hier zeige ich kurz Code, da ich die Shader möglichst minimalistisch gehalten habe um nicht noch irgendwo Fehler zu verursachen).

Vertex:
Code:
  1. varying vec4 ShadowCoord;
  2. varying vec3 vertex_normal;
  3. varying vec3 vertex_light_position;
  4.  
  5. void main()
  6. {
  7.     ShadowCoord = gl_TextureMatrix[1] * gl_Vertex;
  8.     vertex_normal = normalize(gl_NormalMatrix * gl_Normal);
  9.     vertex_light_position = normalize(gl_LightSource[0].position.xyz);
  10.  
  11.     gl_Position = ftransform();
  12.     gl_TexCoord[0] = gl_MultiTexCoord0;
  13.     gl_FrontColor = gl_Color;
  14. }


Fragment:
Code:
  1. uniform sampler2DShadow ShadowMap;
  2.  
  3. varying vec4 ShadowCoord;
  4. varying vec3 vertex_normal;
  5. varying vec3 vertex_light_position;
  6.  
  7. void main()
  8. {
  9.     float shadow = shadow2D(ShadowMap, vec3(ShadowCoord)).r;
  10.     shadow += 0.3; //damit es heller ist
  11.  
  12.     float diffuse_value = max(dot(vertex_normal, vertex_light_position), 0.0) + 0.3;
  13.     vec4 texel = texture2DProj(NormalMap, gl_TexCoord[0]);
  14.     if (diffuse_value <= shadow)
  15.         texel.rgb *= diffuse_value;
  16.     else
  17.         texel.rgb *= shadow;
  18.  
  19.     gl_FragColor = texel * gl_Color;
  20.  


Ich denke das sollte alles noch gut überschaubar sein und hoffe, dass jemand ein Fehler entdeckt.
Falls doch jemand gerne mehr Code sehen will oder manche Informationen zu ungenau sind, einfach sagen! Gebe gerne mehr Infos wenn gewünscht.


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenberechnung - so richtig?
BeitragVerfasst: Fr Mai 03, 2013 19:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Wenn ich das richtig sehe hast du einen Bias von 0.3, was viel zu viel des Guten ist. Einer von 0.005 sollte eigentlich ausreichen. Wenn du das ganze super professionell angehen willst, nutzt du auch noch die Geometrie aus um den Bias zu berechnen.

-> Fragment Shader:
Code:
  1. float bias = 0.005*tan(acos(cosTheta)); // cosTheta is dot( n,l ), clamped between 0 and 1 (musst du im Vertexshader einbauen)
  2. bias = clamp(bias, 0,0.01);


Da ich das aber lange nicht so gut erklären kann, schau dir einfach mal folgenden Link an: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/ Ist zwar in englisch aber sehr hilfreich! ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenberechnung - so richtig?
BeitragVerfasst: Fr Mai 03, 2013 20:54 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Meinst du diese Zeile:
shadow += 0.3; ?

Dadurch wird der Schatten lediglich heller. Wenn ich es auskommentiere sind alle Schatten lediglich komplett schwarz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenberechnung - so richtig?
BeitragVerfasst: Sa Mai 04, 2013 10:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Tschuldige, hab deinen Code nur so überfolgen und dachte den Fehler gefunden zu haben. :/

Du erwähnst bei dir die Biasmatrix (finde übrigends interessant das über diesen Weg zu lösen). Probier mal aus wenn du die Biasmatrix weglässt (oder einfach auf die Einheitsmatrix stellst), dann dürfte der versetzte Schatten wegsein, aber dafür werden die Flächen ohen Schatten ziemlich komisch aussehen. Wenn das eintritt, dann hast du einen zu großen Wert in der Biasmatrix und solltest mal einen kleineren ausprobieren -> Gerade soviel das nicht die komischen Schattenartefakte auftreten aber auch, dass es nicht zu einer so von dir beschrieben Versetzung des Schattens kommt.

P.S. Wenn du dir den Link von mir anschaust, dort wird statt einer Biasmatrix einen Biaswert im Shader verwendet, ich glaube auf die Optik bezogen sollte das der bessere Weg sein, aber da kann ich auch durchausfalsch liegen. Es wird doch auch empfohlen, dass du nur solide Objekte verwenden solltest, dann gehst du schonmal einigen Problemen aus dem weg.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenberechnung - so richtig?
BeitragVerfasst: Sa Mai 04, 2013 16:03 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Also ohne Biasmatrix oder der Einheitsmatrix statt der Biasmatrix geht garnix mehr.
Ich muss die Koordinaten ja schon auf den Bereich von 0-1 bringen und nicht -1 - 1. Ich werde es einfach mal so versuchen wie in deinem Link^^ Sieht ja ziemlich gut erklärt aus.

Werde dann später mal berichten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Schattenberechnung - so richtig?
BeitragVerfasst: So Mai 05, 2013 11:15 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Ich habe noch eine komische Entdeckung gemacht :?

Im Normalfall habe ich ja erst die BiasMatrix geladen und mit der Projektionsmatrix und Modelviewmatrix multipliziert.
Das mache ich zwar weiterhin so aber um diesen Fehler auszugleichen, habe ich einfach noch ein glTranslatef hinzugefügt und ich muss die höhe einfach nur um -0.5 ändern.
Code:
  1.     glLoadMatrixf(Bias);
  2.     glMultMatrixf(LightProjMatrix);
  3.     glMultMatrixf(LightMatrix);
  4.     glTranslatef(0.0f, 0.0f, -0.5f);

(Im Gegensatz wie es sonst alle nutzen, ist bei mir y und z vertauscht).

Damit ist die Schattenposition schon ziemlich ordentlich aber wieso? Erklären kann ich mir das nicht :?


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 36 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.160s | 17 Queries | GZIP : On ]