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

Aktuelle Zeit: Do Jul 17, 2025 18:21

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



Ein neues Thema erstellen Auf das Thema antworten  [ 55 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Mo Mär 14, 2011 12:11 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Kann es sein das "vEye" in die falsche Richtung zeigt und deshalb "posWorld" auch falsch ist?

Außerdem kannst du dir die Zeile vor "discard" sparen, da der Pixel sowieso verworfen wird. Wobei das wahrscheinlich automatisch wegoptimiert wird.

Dann noch ein Tipp: Falls du wirklich so viele Lichter hast, kann es etwas Geschwindigkeit bringen, wenn du die Multiplikation mit der colorMap in einen eigenen RenderPass auslagerst. Also erst die Lichtfarben aufsummieren und das Ergebnis dann mit der Farbe multiplizieren. Dadurch spart man sich für jedes Licht einen Textur-Lookup.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Mo Mär 14, 2011 12:30 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
also ich rendere das Quad jetzt ohne die Projetions und ModelviewMat neu zu laden. Doch funktionieren tut es dennoch nicht.
Ich bin jetzt mal step-by-step durchgegangen..

hier der Tiefenwert:
Dateianhang:
dfs_Depth.jpg



so sieht vVertex (in rgb) bis hier her aus:
Code:
   vec4 vVertex;
        vVertex.xy = gl_TexCoord[0].st * 2.0 - 1.0 ;   
   vVertex.w = 1.0;             
   vVertex.z = fDepth * 2.0 - 1.0;   
---->
...

Dateianhang:
vVertex_1.jpg




und so nach der mutliplication mit der Projectionsmatrix
Code:
...
vVertex = gl_ProjectionMatrixInverse * vVertex;
--->

Dateianhang:
vVertex_2.jpg


und hier nach dem teilen durch w..

Code:
...
 vVertex /= vVertex.w;
--->


Dateianhang:
vVertex_3.jpg


Jedoch ändern die Farben sich nciht entsprechend der Camerabewegung, sonden sie bleiben fix..

Irgendwo ist hier der Wurm drin...


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Mo Mär 14, 2011 15:02 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
...also ich habe jetzt den vVertex nach der Multipl. mit der inversen Projectionsmatrix nochmal mit der Inverse Modelviewmatrix multipliziert. Nun sehe ich für jeden Vertex eine Farbe. Doch so ganz kann das nicht hinhauen? Guckt selbst:
Dateianhang:
vertex_4.jpg


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Di Mär 15, 2011 10:55 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
also ich komme langsam voran. Die projektion stimmt nun. ich habe den vVertex nochmal vor dem teilen durch w mit der InvModelMat multipliziert. Nun funktioniert aber die Lichtberechnung nicht wie sie soll. Undzwar geht es um den lambertTerm.

Wenn ich mir die normalen anzeige und die Kamera drehe, ändern diese sich auch bei jeder Rotation.. Das dürfte doch so eigentlich nicht sein oder?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Di Mär 15, 2011 15:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Wenn ich mir die normalen anzeige und die Kamera drehe, ändern diese sich auch bei jeder Rotation.. Das dürfte doch so eigentlich nicht sein oder?
Soweit ich weiß ist da doch die Normale nach Multiplikation mit der NormalMatrix interessant, also nach der Rotation. Von da her: die muss sich bei Rotation ändern.

Oder meinst du was anderes?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Di Mär 15, 2011 19:18 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Mal noch eine Frage: Den Wert für die Tiefe schreibst du manuell per Shader oder? Damit der auch linear ist, so wie du ihn verwendest. Weil er das ja normalerweise nicht ist.

Dann zu dem Licht: Stimmen die Normalen? Anbieten würde es sich wenn die alle im "Eye-Space" sind. Dann transformiert man die Lichtposition bevor man sie an den Shader übergibt mit der ModelViewMatrix. Und der lambertTerm wird dann so berechnet:
Code:
float lambertTerm = dot(vNormal, normalize(lightpos-vEye));


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Di Mär 15, 2011 19:52 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Zitat:
Stimmen die Normalen

Wie kann ich das prüfen? Wenn ich einfach vNormal als RGB ausgebe müsste doch für jedes Fragment die Farbe fix sein.. z.b. der kopf eines Modells ist dann z.b. pink, egal wie die Kamera drauf guckt.. Bei mir ändern sich die Normalen je nach Kamera.

Die Tiefe rendere ich ohne Shader, einfach via GL_DEPTH_COMPONENT & GL_FLOAT in eine Textur. Funktioniert aber ohne Probleme.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Di Mär 15, 2011 20:26 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Also wenn sich die Normalen ändern, sind sie im Eye-Space. Das ist auch das normale verhalten was entsteht wenn man im Vertex-Shader "gl_NormalMatrix * gl_Normal" rechnet.
Also mal zur Erklärung wie ich die Bezeichnungen handhabe: Im Eye-Space sind die Positionen und Richtungen relativ zur Kamera angegeben. Eine Fläche die zur Kamera zeigt hat die Normale (0,0,1). Wenn man die Kamera dreht oder bewegt, zeigt die Fläche nicht mehr zur Kamera und die Normale ändert sich.
Im World-Space würden sich die Normalen nicht ändern, es sei denn man dreht die Objekte.

Normalerweise, ist es besser mit den Normalen im Eye-Space zu rechnen, weil die Matrix der Kamera mit den Matrizen der Objekte multipliziert wird. Um die Normalen im World-Space zu erhalten müsste man entweder die Transformation durch die Kamera-Matrix rückgängig machen (im Vertex-Shader) oder die Objekt-Matrix übergeben. Das kostet natürlich Zeit. Außerdem muss man (wie du das auch machst) dann in dem Beleuchtungsshader auch die Position des Pixels im World-Space berechnen, das eine zusätzliche Multiplikation mit einer Matrix bedeutet.

Zu der Depth-Texture: Teste mal ob die Entfernungen von den errechneten Positionen zur Kamera auch wirklich stimmen. Bin mir jetzt nicht so ganz sicher was ein GL_FLOAT für die Tiefenwerte für eine Änderung bewirkt. Normalerweise ist die Tiefe 0 nämlich auf der NearClippingPlane, die auch einen Abstand>0 von der Kamera hat.
So könnte man das zum Beispiel testen:
Code:
if (vEye.z>-3.0){gl_FragColor=vec4(1.0,0.0,0.0,1.0);}
if (vEye.z>-2.0){gl_FragColor=vec4(0.0,1.0,0.0,1.0);}
if (vEye.z>-1.0){gl_FragColor=vec4(0.0,0.0,1.0,1.0);}

Dann müssten die farbigen Streifen die dadurch entstehen alle gleich breit sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Mi Mär 16, 2011 10:01 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Zitat:
So könnte man das zum Beispiel testen:


da sehe ich nur blau...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Mi Mär 16, 2011 17:09 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
da sehe ich nur blau...
Dann sind sie alle > -1.0 ==> versuchs mal mit anderen Werten (was weiß ich, zB -1.0, -0.6666, -0.3333), sollte es dann immer noch alles blau sein, kannst du ggf auch noch positive Werte versuchen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Mi Mär 16, 2011 21:15 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Naja, das ist wahrscheinlich schon so wie ich es vermutet hatte. Die Tiefenwerte gehen von 0 bis 1. Die reale Entfernung geht aber von der NearClipping bis zur FarClipping-Plane.
Ich hab hier mal einen Ausschitt aus meinem Shader:

Fragment-Shader:
Code:
varying vec3 vector;
[...]
float depthvalue = texture2D(depth, vec2(gl_TexCoord[0])).x;
float a = FarClip/(FarClip-NearClip);
float b = FarClip*NearClip/(NearClip-FarClip);
float rd=b/(depthvalue-a);
vec3 Eye=vector*rd;

Vertex-Shader:
Code:
uniform mat4 matrix;

varying vec3 vector;

void main(void)
{
   gl_Position   = ftransform();
   gl_TexCoord[0]   = gl_TextureMatrix[0] * gl_MultiTexCoord0;
   vector = vec3(matrix*gl_Vertex);
}

Die "matrix" aus dem Vertex-Shader wird im Programm wie folgt berechnet:
Code:
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(90, 1, NearClipping, FarClipping);
glGetfloatv(GL_PROJECTION_MATRIX,@projectionmatrix1);
glLoadIdentity;
gluPerspective(60, ClientWidth/ClientHeight, NearClipping, FarClipping);
glGetfloatv(GL_PROJECTION_MATRIX,@projectionmatrix2);

matrix:=Matrixf4Mult(Matrixf4Invert(projectionmatrix2),projectionmatrix1);

Da die Texturen, die die Normalen, die Tiefe und die Farben enthalten mit der normalen Projektion gefüllt wurden, das Fullscreen-Quad aber dann mit einer anderen Projektionsmatrix gezeichnet wird, muss man die Vertex-Positionen transformieren.

Man kann natürlich auch direkt die Matrizen setzen, wenn man weiß wie das geht (kann man nachlesen). Meine Variante macht es sich da ein bischen einfach. Funktionieren tut es aber.
Für die Matrix-Operationen musst du dann halt deine eigenen Funktionen benutzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Do Mär 17, 2011 10:00 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
vielleicht bin ich zu doof, aber ich verstehe einfach nich was du in deinem Fragmentshader machst? Wo teilst du da durch w? Hast du deine Tiefenwerte mit nem Shader gerendert? Wenn ja wie sah der aus?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Do Mär 17, 2011 20:28 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Bei mir ist die w-Koordinate immer 1. Wenn man nur Vertices mit 3 Komponenten verwendet wird die automatisch so gesetzt (siehe glVertex).
Bei den Tiefenwerten benutze ich auch nur, die die GL_DEPTH_COMPONENT liefert. Wie gesagt sind die Werte aus dem Tiefenbuffer aber nicht linear zur realen Tiefe. Deshalb müssen die umgerechnet werden. siehe Link. Das müsste man auch selbst aus dem Artikel zu gluPerspective schlussfolgern können.


Zuletzt geändert von Schläfer am Do Mär 17, 2011 20:50, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Do Mär 17, 2011 20:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Meep, nach der Projektion wird die w-Koordinate aber anders sein. Das ist der Trick. Dann musst du nach w normalisieren (also alle Vektorkomponenten durch w teilen). So kommt überhaupt erst die perspektivische Verzerrung zustande. Allein mit Matrizen geht das mathematisch nicht.

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: Deferred Shading
BeitragVerfasst: Do Mär 17, 2011 21:20 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Bei mir ist w trotzdem 1, weil in der Matrix die 4te Zeile (0,0,0,1) ist. Das liegt aber womöglich daran, dass ich für die richtige Szene und das Fullscreen-Quad die gleichen Werte fur Near und FarClipping-Plane verwende.


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


Wer ist online?

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