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

Aktuelle Zeit: Fr Jul 18, 2025 08:49

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



Ein neues Thema erstellen Auf das Thema antworten  [ 37 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3
Autor Nachricht
BeitragVerfasst: Sa Jan 16, 2010 13:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Wo du umrechnest ist erstmal egal, allerdings musst du bedenken das die Umrechnung im Shader für jeden Vertex/Pixel neu berechnet würde, wenn du das im Shader machst. Also besser direkt das korrekte Uniform übergeben.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 17, 2010 19:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Der Shader hatte noch einige Fehler, welche nun alle gefunden und beseitigt wurden. Auf einer Grafikkarte von ATi hätte der Shader sonst keine Chance gehabt. Außerdem sollten uniforms möglichst nicht nur nach einem Buchstaben benannt sein, da sonst der Typecast im Programm via PGLChar daneben geht (nullterminierte Strings). Schönen Dank nochmal an Sascha und Horazont. Wie der Screenshot zeigt, existiert mittlerweile ein Kegelstumpf. Der Kegelstumpf ist jedoch fest. Doch was ist nun noch notwendig ? Wie kriege ich in die uniform uS die Rotation noch rein ? Sonst ist es logischerweise fest. Das glRotatef war nur ein simpler Versuch, natürlich gescheitert. Wie man im Vertexshader sieht führe ich die Umwandlung des Koordinatensystems über diesen durch und übergebe das Ergebnis dann an den Fragmentshader.
Code:
glRotatef(-RotMars/7, 0.0, 0.0, 1.0);glUniform4f(glGetUniformLocationARB(pShadow, PGLChar('uS')), x, 0.0, 0.0, 1.0);glUniform1f(glGetUniformLocationARB(pShadow, PGLChar('ue')), x);glUniform1f(glGetUniformLocationARB(pShadow, PGLCharARB('ur')), 0.07/2);

Vertex-Shader
Code:
uniform vec4 uS;varying vec4 S;varying vec3 P;varying vec3 L;varying vec3 normal;varying vec4 FrontColor;varying vec3 obj; void main(void) {  normal   = normalize(gl_NormalMatrix*gl_Normal);  P        = vec3(gl_ModelViewMatrix*gl_Vertex);  L        = normalize(gl_LightSource[0].position.xyz-P);  S        = gl_ModelViewMatrix*uS;   gl_TexCoord[0] = gl_MultiTexCoord0;  FrontColor     = gl_Color;   gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;}

Fragment-Shader
Code:
uniform sampler2D Texture0;uniform vec3 ur;uniform float ue;varying vec4 S;varying vec3 P;varying vec3 L;varying vec3 normal;varying vec4 FrontColor;varying vec3 obj;float f;float d;void main(void) {  vec3 Eye       = normalize(-P);  vec3 Reflected = normalize(reflect(-L, normal));  vec4 IAmbient  = gl_FrontLightProduct[0].ambient;  vec4 IDiffuse  = gl_FrontLightProduct[0].diffuse;  vec4 ISpecular = gl_FrontLightProduct[0].specular;    f = dot(normalize(S.xyz-L), P-L);  d = float(P-f*(S.xyz-L));  if ((f < ue) || (d < float((ur/ue)*f)))    gl_FragColor = vec4((gl_FrontLightModelProduct.sceneColor+IAmbient+IDiffuse)*texture2D(Texture0, vec2(gl_TexCoord[0]))+ISpecular);  else    gl_FragColor = vec4((gl_FrontLightModelProduct.sceneColor+IAmbient)*texture2D(Texture0, vec2(gl_TexCoord[0])));}


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

_________________
Meine Musik: spiker-music.net


Zuletzt geändert von Nils am Mi Jul 28, 2010 21:37, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 18, 2010 15:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Wie der Screenshot zeigt, existiert mittlerweile ein Kegelstumpf.

Ich sehe auf deinem Screen nicht mal lokale Beleuchtung?

Zitat:
Doch was ist nun noch notwendig ? Wie kriege ich in die uniform uS die Rotation noch rein ?

glRotatef hat auf Uniforms keine Auswirkung.

Der Fehler liegt hier:
Code:
  1. // (Vertexshader)
  2. S        = gl_ModelViewMatrix*uS;


Du multiplizierst den Schattenwerfer S mit der ModelView-Matrix des gerade gerenderten Planeten. Du musst aber die ModelView-Matrix des Schattenwerfers nehmen. Am besten liest du beim rendern des Schattenwerfers mit glGet(GL_MODELVIEW_MATRIX, ...) die ModelView-Matrix aus. Damit transformierst du dann S, wobei S in lokalen Koordinaten ist, also wahrscheinlich (0,0,0,1)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 18, 2010 19:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hm, also so ?
Code:
glGetFloatv(GL_MODELVIEW_MATRIX, @MM);glUniform4f(glGetUniformLocationARB(pShadow, PGLChar('uS')), MM[0], 0.0, 0.0, 1.0);glUniform1f(glGetUniformLocationARB(pShadow, PGLChar('ue')), MM[0]);glUniform1f(glGetUniformLocationARB(pShadow, PGLCharARB('ur')), 0.07/2);

Offensichtlich nicht, denn die Schatten sind zwar vorhanden, aber an falscher Stelle.

_________________
Meine Musik: spiker-music.net


Zuletzt geändert von Nils am Mi Jul 28, 2010 21:36, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 18, 2010 22:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Eine Matrix in OpenGL besteht aus 16 Werten....das kann nicht funktionieren wenn du nur den ersten Wert benutzt ;)

=>
http://wiki.delphigl.com/index.php/Tuto ... nem_Vektor

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 23, 2010 14:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ich habe jetzt mal die Soft-Shadow-Variante zu Ende gedacht. Ich denke das Bild sagt bereits das wichtigste.
Dateianhang:
softShadow.png

Die Repräsentation der Kegel ist hier etwas anders, da insbesondere der innere Kegel sehr spitz/lang werden kann. Dies könnte zu numerischen Ungenauigkeiten führen. Außerdem müssten Spezialfälle umgangen werden. Wenn nämlich der Occluder größere als die Lichtquelle wird, liegt die Kegelspitze plötzlich auf der anderen Seite. Hier werden die Kegel durch die Positionen L und O sowie die Radien rL und rO definiert. So können diese Fälle gleich behandelt werden. Auch können wir für den äußeren Kegel einfach einen negativen Lichtquellenradius rL verwenden. Die Daten beider Kegel sind also bis auf dieses Vorzeichen identisch, was natürlich die Hälfte der Shader-Uniforms einspart.

rF_inner und rF_outer sind die Radien der Kegel in Höhe des Fragmentes F bzw. F'. Die Formeln für inneren und äußeren Kegel sind identisch, nur das eben für den äußeren Kegel wie schon erwähnt ein negativer Lichtquellenradius rL verwendet wird.

Die Ausgabe des ganzen ist ein Faktor s zwischen 0 und 1, wobei 0 voller Schatten und 1 volles Licht darstellt. Das ganze ist leider eine etwas längliche Fallunterscheidung. Im Shader sollte man die natürlich so umbauen das Werte nur dann berechnet werden wenn sie auch wirklich gebraucht werden. Zu beachten ist das im folgenden rF_inner auch negativ werden kann. In dem Fall befinden wir uns soweit hinter dem Objekt das keine Vollschatten-Zone mehr existiert.
Code:
  1. if (dLF' < dLO || rF >= rF_outer) {
  2.     // Fragment vor dem Occluder oder außerdem des äußeren Kegels.
  3.     s = 1.0;
  4. }
  5. else if (rF_inner >= rF) {
  6.     // Wir befinden uns im Vollschatten
  7.     s = 0.0;
  8. }
  9. else if (rF_inner >= 0 || rF >= -rF_inner) {
  10.     // Wir befinden uns im Halbschatten, lineare Interpolation
  11.     s = (rF - rF_inner) / (rF_outer - rF_inner);
  12. }
  13. else {
  14.     // Wir empfangen Licht von zwei Richtungen, also oben und unten am Occluder vorbei.
  15.     // Die beiden rF heben sich gegenseitig auf.
  16.     s = (-2*rF_inner) / (rF_outer - rF_inner);
  17. }


Kleine Notiz: Der Schatten wird orthogonal zur Geraden LO interpoliert. Diese Berechnung ist nicht physikalisch korrekt. Allerdings dürfte niemandem der Unterschied auffallen.


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

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 30, 2010 19:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Habe das ganze jetzt in UC umgesetzt, hier ein paar Screens:
Bild Bild Bild
(klicken zum vergrößern)

Edit: Der Kegelvolumen-Schatten-Shader findet sich mit ausführlicher Erklärung in der Shadersammlung.

_________________
Yeah! :mrgreen:


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 13 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.008s | 16 Queries | GZIP : On ]