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

Aktuelle Zeit: Di Jul 15, 2025 23:05

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



Ein neues Thema erstellen Auf das Thema antworten  [ 55 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: Deferred Shading
BeitragVerfasst: Di Mär 08, 2011 20:54 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Hallöchen,

ich hab da mal ne Verständnisfrage zu Deferred Shading. Also mit meiner jetzigen Methoder für meine Lichtprojektionen komm ich gerade bei Notebooks schnell an die Grenzen des machbaren, obwohl ich sogut wie jede Optimierungsmöglichkeit (Frustumculling etc..) ausgenutzt habe.. Doch bei ~40 Lampen is vorbei.. Ich brauch aber bis zu 100 Lampen... Hab schon viel über D.S. gehört daher denke ich das ich damit weiter komme..

Wenn ich das richtig Verstanden habe müsste ich so vorgehen:

1. Meine Szene in ein FBO mit 4 Rendertargets (16bit Floating Tex) folgend rendern:

a. Farbpuffer mit Ambientem Licht
b. Die Normalen der Szene
c. Die Positionen in x, y, z > r, g, b
d. Die Tiefeninformation in z.b. r

Bei 16-Bit könnte ich doch die Tiefeninfos in den Alphawert schreiben oder?

2. Rendere ich meine Shadowmaps wie bisher
a. Aus Sicht der Lichtquelle mit Frustum Culling etc..

3. Erzeuge wie bisher meine Texturmatrizen zur Projektion

4. Rendere ich für jede Lampe mein Offscreenquad mit einem Shader
a. Dort berechne ich die Projektionskoordinaten nicht mehr im Vertexshader sondern je Fragment mit den Infos aus den Texturen aus Schritt 1


So stelle ich mir das im Groben vor.. Das müsste doch so funktionieren oder? Oder ist das doch komplizierter? Hat schon jemand sowas umgesetzt? Wie müssen da die Hardwareanforderungen sein? FBO is klar aber wie siehts mit den FP-Texturen aus?

Mal wieder Fragen über Fragen.. hoffe ihr könnt mir helfen.

Grüße
Thomas


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

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
An den Punkten 1-3 hab ich nichts zu meckern bzw. nichts zu ergänzen.
Bei Punkt 4 würde ich noch ergänzen, dass es reicht eine Bounding Box mit aktiviertem FrontFace-Culling, die die Lichtquelle einschliesst, zu zeichnen. Dann kommen die Fragmente ausserhalb der BoundingBox schon garnicht erst in die Verlosung :)
In meinen bisherigen Versuchen damit hab ich festgestellt, dass man relativ früh entfernte Lichtquellen verwerfen kann. Das hängt natürlich auch stark von der Szene selbst ab.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


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

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Lass die Positionsdaten weg und errechne diese aus der Tiefe.

_________________
Meine Homepage


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

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Kann meinem Vorposter nur zustimmen. Die Positions - Textur ist unnötig, weil du die Position ganz einfach durch die Tiefen - Textur und der ProjectionsMatrix berechnen kannst ;). Dadurch sparst du schonmal eine Textur. Du brauchst auch keine 16Bit, 8Bit tuns auch. Dafür muss auch die Normale entsprechend aufgeteilt werden. In meinem zuletzt erstellten Thread siehst du auch die umgesetzte Shader - Version: http://www.delphigl.com/forum/viewtopic.php?f=20&t=9735. Ich hab dir trotzdem nochmal die Shader - Dateien angehängt. Den MRT - Shader lässt du über den FrameBuffer mit der angehängten Color-, Normal-, und Depth - Textur laufen und den Deferred - Shader über ein bildschirmfüllendes Quad.

Dateianhang:
MRT.zip


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: Sa Mär 12, 2011 12:00 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Also ich habe versucht das jetzt mal umzusatzten und bin auch rel schnell vorangekomme: NormalMap, Depth und Color werden korrekt gerendert. Doch am endresultat stimmt die projektion meiner lampen nicht mehr. Die leuchten überall hin aber nicht da wo sie sollen... Ich tippe mal auf einen falschen eyeVektor..
Die Shader für normal und color hab ich einfach übernommen.

hier mein "Hauptshader":

Code:
uniform sampler2D colorMap;       // Color - Texture
   uniform sampler2D normalMap;   // Normal - Texture
   uniform sampler2D depthMap;     // Depth - Texture
   uniform sampler2D lightMap;
   
   uniform mat4 InvViewMat;
   uniform mat4 TexGenMat;            //Texturprojektionsmatrix
   uniform vec4 LampColor;       //Lichtfarbe und intensität
   uniform int GlobalLight;                //gibt an ob globales Punktlicht verwendet werden soll
   uniform vec4 LightPos;          //Lampenpositionen für evtl. weitere Berechnungen
   uniform float GlobalLightFactor;           //Gibt an wie stark alle Lichter sind

   void main() {
      vec2 texcoord = vec2(gl_TexCoord[0]);
      vec4 vColor = texture2D(colorMap, texcoord);
      float fDepth = texture2D(depthMap, texcoord).x;

       if(fDepth >= 1.0) {
         gl_FragColor = vec4(vColor.xyz, 1.0);
         discard;
      }

      vec4 vNormal = texture2D(normalMap, texcoord);
      vNormal.xyz = vNormal.xyz * 2.0 - 1.0;

      vec4 vVertex;
      vVertex.xy = gl_TexCoord[0].st * 2.0 - 1.0;
      vVertex.z = fDepth * 2.0 - 1.0;
      vVertex.w = 1.0;
      vVertex = gl_ProjectionMatrixInverse * vVertex;
      vVertex /= vVertex.w;

 
      vec4 vEye;      
        vEye.xyz      = normalize(-vVertex.xyz);
      

      vec4 posWorld = InvViewMat * vEye; 
      vec4 projCoord = TexGenMat * posWorld;   
      
      vec4 lightColor = texture2DProj(lightMap, projCoord);
            
       gl_FragColor =  lightColor * vColor;
   }



Also in meinem non-defferred shader hab ich PosEye im VertexShader mit posEye = gl_ModelViewMatrix * gl_Vertex; berechnet...


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

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Ich glaube mal das hier der Fehler liegt:

Code:
// ========================================================
      vec4 posWorld = InvViewMat * vEye;
// ========================================================

      vec4 projCoord = TexGenMat * posWorld;   
     
      vec4 lightColor = texture2DProj(lightMap, projCoord);


Den Rest hab ich auch so in meinem Shader und der funktioniert problemlos. Vielleicht ist InvViewMat fehlerhaft?


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

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
ja aber wo ist der unterschied zwischen dem vEye und dem PosEye aus meinem vorherigen Vertexshader?
Wie müsste es richtig aussehen?


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

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
ich hab mir jetzt mal vVertex in RGB anzeigen lassen, sieht ziemlich eintönig aus...
Dateianhang:
Position.jpg

Depth und Normal sehen ok aus.


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: Sa Mär 12, 2011 15:38 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Wie sieht dein Vertex - Shader aus? Wird das Quad nach deinen Geometrien direkt gerendert, ohne das dazwischen die glLoadIdentity() oder Ähnliches kommt?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Sa Mär 12, 2011 15:45 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
nein ich rendere das Quad ja in den Framebuffer und die Szenen inden FBO.
So rendere ich die Offscreenquads:

Code:
  procedure DrawShader;
  begin
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity;
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity;
    glbegin(GL_TRIANGLE_STRIP);
    glTexCoord2f(0, 1);
    glVertex3f(-1.0, 1.0, 0.0);
    glTexCoord2f(0, 0);
    glVertex3f(-1.0, -1.0, 0.0);
    glTexCoord2f(1, 1);
    glVertex3f(1.0, 1.0, 0.0);
    glTexCoord2f(1, 0);
    glVertex3f(1.0, -1.0, 0.0);
    glEnd;
  end;


und hier der Vertexshader

Code:

   void main(void) {
      gl_TexCoord[0].st = gl_Vertex.st * vec2(0.5, 0.5) + vec2(0.5, 0.5);
      gl_TexCoord[0].pq = vec2(0.0, 0.0);

      gl_Position = vec4(gl_Vertex.xy, 0.0, 1.0);
   }


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: Sa Mär 12, 2011 15:53 
Offline
DGL Member

Registriert: Sa Jun 05, 2010 16:15
Beiträge: 94
Das Quad muss in der selben Model- und Projectionsmatrix wie deine restliche Geometrie sein, sonst funktioniert der Shader nicht. Also musst du nach dem

Code:
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity;
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity;


deine Projektions- und ModelMatrix neu setzen. Oder du lässt den Codeabschnitt ganz weg.


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

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
ja aber wenn ich die Offscreenquads in der gleichen Modelview-Matrix wie die der Szene rendere, dann ist doch das kein Füllendes Quad mehr, sondern es dreht sie mit der Kamera... Verstehe auch nicht anwelcher Stelle die ModelViewMatrix im Vertexshader interessant ist? Die InverseMatrix ist korrekt, da die Einstellungen mit meinem "NON-DeferredShader" funktionieren...

Wie hast du deine Texturen für den FBO konfiguriert?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: So Mär 13, 2011 10:56 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Ohne mich jetzt großartig mit deferred shading auszukennen:

Wer zwingt dich, im Vertexshader die ModelViewProjection auf dein Fullscreenquad (*) anzuwenden? Die ist soweit ich weiß eher
1) für kleinere Lichtquellen, die du als Würfel, Ikosaeder, oder sonstwas zeichnest, damit nicht sinnloserweise für so viele Pixel der Wert 0.0 berechnet wird
2) damit du dir deine Positionsdaten berechnen kannst, falls du sie nicht speicherst
3) möglich, dass ich noch irgendwas vergessen hab, wofür du die brauchst

(*) ein Offscreenquad würde meiner Meinung nach ohnehin nicht viel Sinn machen ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Deferred Shading
BeitragVerfasst: So Mär 13, 2011 21:25 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
also mir würde jetzt nicht einfallen wie ich jetzt im Vertex den von der Model&Projektionsmatrix unberührten Vertex für das >Fullscreenquat< ;) bekomme..


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

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Also (wie gesagt, ich kenne mich mit deferred shadig nicht wirklich aus) soweit ich weiß, brauchst du für die Lichter mal sowieso einen eigenen Vertexshader.

Ich hab´s zwar nicht ausprobiert, aber ein einfaches
Code:
gl_Position = gl_Vertex //oder halt ggf das, was du statt gl_Vertex benutzt
müsste es eigentlich tun. In gl_Vertex mus dann natürlich die Position der Vertices im Screen Space rein, in die w koordinate würde ich (einfach mal ins Blaue geraten) 1.0 schreiben, weil da dann durchdividiert wird, schließlich ändert sich daran wohl nichts, nur weil du nicht mit der Projection Matrix multiplizierst. Tiefentest ist da soweit ich weiß sowieso ausgeschaltet, also musst du nur darauf achten, dass die z koordinate nicht von der near / far Clipping Plane abgeschnitten wird.

Sollte so funktionieren, hab´s aber nicht ausprobiert.


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 1, 2, 3, 4  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 3 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.010s | 17 Queries | GZIP : On ]