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

Aktuelle Zeit: Fr Jul 18, 2025 08:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Feb 27, 2009 01:13 
Offline
DGL Member

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

wie aus dem Titel ersichtlich habe ich ein Problem mit meiner Beleuchtung.
Das Problem ist aber nicht wie ich das ganze realisiere, sondern vielmehr das es auf meinem anderen Computer nicht so funktioniert, wie ich es gerne hätte.

Ich zeichne die Szene für jede Lichtquelle einmal und summiere das Ergebnis einfach mit additiven Blending. Vorher wird der Depthbuffer mit der Szene ohne Shader und Texturen initialisiert. Beim zeichnen der Lichter verwende ich dann GL_LEQUAL als Tiefenfunktion. Das ganze funktioniert auch ganz gut auf den beiden Computer mit einer Geforce 8800 GT und GTS. Auf dem älteren Athlon 64 mit einer 7600 GT allerdings nicht.
Dort sieht es für mich so aus als ob 2 mal die selbe Szene aus der selben Perspektive unterschiedliche Ergebnisse für die Tiefe liefert, weil ein regelmäßiges Muster aus unbeleuchteten Pixeln über die Flächen geht.

Um das zu beheben hab' ich auch wenig erfolgreich glPolygonoffset verwendet. Wenn sich also jemand damit auskennt und sein Wissen teilen möchte, wäre ich sehr dankbar.
Aber auch eine andere Idee, die auf einen Polygonoffset verzichtet, ist willkommen (wenn sie denn funktioniert :wink: )


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 27, 2009 11:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Nur so eine Idee...Stichwort GL_EXT_stencil_two_side ?
Also kann dein Stencilbuffer auch negative Werte? Ansonsten musst du dein Schattenvolumen nämlich zweimal rendern, einmal FrontFaces, einmal Backfaces. Mit nem Two-Side-Stencil ist es dagegen kein Problem wenn da zwischendurch negative Werte auftreten. (Du kannst den Stencilbuffer natürlich auch mit 128 oder so initialisieren)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 27, 2009 14:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Versuch anstatt additivem Blending mal, den Accumulation-Buffer zu verwenden. Mit glAccum(GL_LOAD, 1.0) überschreibst du den Accum-Buffer mit der aktuelle Szene, mit glAccum(GL_ACCUM, 1.0) addierst du die aktuelle Szene dazu. Mit glAccum(GL_RETURN, 1.0) wird der Inhalt des Accum-Buffers in den normalen Farbpuffer zurückgeschrieben. Siehe auch glAccum.

Der Accumulation-Buffer ist nur ein Farbbuffer, hat also keine separaten Tiefeninformationen. Du musst den Accum-Buffer wie auch die anderen Puffer beim erstellen des Kontextes anfordern.

Gruß Lord Horazont

_________________
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:
BeitragVerfasst: Fr Feb 27, 2009 16:04 
Offline
DGL Member

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

Den beidseitigen Stenciltest hatte ich sogar schon mal implementiert und nur auskommentiert, weil es keinen Geschwindigkeitsvorteil brachte. Jetzt nachdem ich ein paar Optimierungen am Rest des Programms vorgenommen habe, hat sich anscheinend der Flaschenhals wieder etwas verschoben, sodass ich damit immerhin 2% mehr FPS habe :D
Das eigentliche Problem hat das allerdings nicht gelöst.

@Lord Horazont

Das mit dem Akkumulationspuffer sollte funktionieren. Wenn ich den Tiefenpuffer immer lösche kann es ja garnicht anders. Leider wird das dann wohl langsamer sein, wenn nicht das verrechnen mit dem Akkumulationspuffer sehr viel schneller als Blending ist.
Ich hab auch mal gelesen, dass man mit dem Akku. Geschwindigkeit rausholen kann, indem erst die Beleuchtung der Szene ohne Textur aufsummiert wird und am Ende mit den Farbwerten ohne Beleuchtung und mit Texturen multipliziert wird. Aber ich schätze mal da brauch man entweder viele Lichter (hab bis jetzt grade mal 2) oder viele Texturlookups (bei mir auch nur einer).
Auf alle Fälle werde ich das mal ausprobieren, vielleicht gibt es ja noch eine positive Überraschung.


Edit:
Ich hab mal die Variante mit dem Akku. realisiert, funktioniert auch soweit, ist bloß um einiges langsamer. Da ich für die Schattenvolumen die Tiefeninformation brauche, aber obiges Problem dann verhindert, dass die Beleuchtung ordentlich gezeichnet wird, muss ich den Tiefenbuffer für jedes Licht beschreiben und wieder löschen. Es gibt nicht zufällig eine schnelle Möglichkeit den zBuffer zu speichern und zu laden?

Edit2:
Die Variante mit dem Licht addieren und am Schluss mit Textur multiplizieren kann ich wohl vergessen, weil ich da wieder Blending brauch, sodass ich wieder beim Ausgangsproblem wäre.


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


Wer ist online?

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