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

Aktuelle Zeit: Mo Jul 14, 2025 21:58

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Mär 01, 2010 18:02 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

seit einiger Zeit bin ich Besitzer eines stereoskopischen Bildschirms mit passiver Brille (Polfilter), bei dem alle ungeraden Pixelzeilen auf das linke Auge und alle geraden Pixelzeilen auf das rechte Auge gehen. Ich wollte nun ein wenig mit OpenGL dafür programmieren. Irgendwo im Internet wurde gesagt, dass sich für ein solches Verfahren der Stencilbuffer empfiehlt. Ist das hier das Mittel der Wahl oder gibt es eine effizientere Methode mit Shadern? Für Anregnungen wäre ich sehr dankbar.

Gruß Joni.


Zuletzt geändert von Joni am Do Mär 04, 2010 17:08, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 01, 2010 18:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Ich hab das ganze einfach via PixelShader gelöst.
Die Scene in 2 FBOs gerendert und dann via Shader einfach á la:

Code:
  1. if (mod(gl_FragCoord.y, 2) == 0)
  2.   gl_FragColor = texture2D(leftImage, vec2(gl_TexCoord[0]);
  3. else
  4.   gl_FragColor = texture2D(rightImage, vec2(gl_TexCoord[0]);


Stencilbuffer geht natürlich prinzipiell auch.. aber da brauchst du, sobald du den StencilBuffer auch für andere dinge noch benötigst in der Scene auch 2 FBOs.

Und Shader hat den vorteil das du auch alle anderen arten der stereoskopischen darstellung (Rot/Cyan etc) damit einfach abhandeln kannst.

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 01, 2010 18:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Bei Aya's Methode sollte man nur ein FBO verwenden. Das wechseln zwischen zwei FBO dauert länger als das tauschen zweier Texturen innerhalb des FBO. Aber das sind Kleinigkeiten.

Der Vorteil des Stencilbuffers ist, das Pixel nicht unnötig gerendert werden. Dafür gibt es natürlich Probleme wenn man irgendwelche PostProcessing-Effekte wie z.B. Glow/Blur etc. anwenden will. In dem Fall braucht man die "unnötigen" Pixel nämlich.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 01, 2010 20:54 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

danke erstmal. Ayas Methode klingt sehr vielversprechend, wobei man dort zumindest bei einfacher Zeilenverschachtelung dahingehend doppelte Pixel vermeiden kann, dass man die Szene einfach mit halber Vertikalauflösung rendert. Bei Post-Processing-Effekten muss man das dann natürlich berücksichtigen (obwohl ich intuitiv sagen würde, dass das Ergebnis unter Berücksichtigung der "unnötigen" Pixel qualitativ etwas besser wird). Zu Ayas Methode: Ist der Wert glFragCoord.x/y in Pixeln angegeben?

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 01, 2010 21:14 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Hallo Joni,
meinst du nicht, es macht Sinn, das Programm so zu schreiben, dass es nicht nur mit deiner sondern mit eigentlich allen 3D-Display-Lösungen funktioniert? Bin mal im heise-Forum auf diesen Post gestoßen, der mich gleich neugierig gemacht hat (hab dann als mrtrain nachgefragt). Wenn das stimmt, was da geschrieben wurde, sollte dein Display-Treiber das mit den Zeilen also automatisch regeln.

Gruß mrtrain


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:55, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 01, 2010 22:22 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

das funktioniert dass so, dass man beim Erstellen des Pixelformats das Flag PFD_STEREO setzt und über glDrawBuffer(GL_BACK_LEFT) bzw. glDrawBuffer(GL_BACK_RIGHT) die beiden Bilder ansteuert. Ich habe jedoch keine Quadro Karte und auch keine sonstige Treiberlösung, die mir einen OpenGL Quadbuffer anbietet.

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 02, 2010 16:51 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Hmm, schade. Ich dachte, dieses Feature würde von allen gängigen GeForce- und Radeon-Grafiktreibern unterstützt. :( Hoffentlich ändert sich das noch während dem 3D-Boom...

mrtrain


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 17:55, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 02, 2010 20:48 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Frag doch mal beim Hersteller deiner Graka was du tun musst um 2 Backpuffer zu erhalten.

Eventuell gibts da Treibereinstellungen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 02, 2010 21:34 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
Hallo,

danke für die rege Beteiligung :) ich kann gerne mal ATI kontaktieren, ich bezweifele aber, dass ich da weiterkomme, da sowohl ATI als auch NVIDIA bei ihren FireGL/FirePro bzw. Quadro Serien mit der Quadbuffer-Unterstützung werben und es so wirkt, als sei dieses Feature (noch) diesen Karten vorbehalten.

Gruß Joni.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 04, 2010 17:40 
Offline
DGL Member

Registriert: So Okt 21, 2007 14:16
Beiträge: 123
Programmiersprache: Delphi
kleiner Nachtrag: Habe es jetzt mit Ayas Methode geschafft und mehrere Methoden ausprobiert, kann auch bei Interesse was in die Shadersammlung stellen:

Zuerst das Grundgerüst:
Code:
  1. #version 150
  2.  
  3. precision highp float;
  4.  
  5. in  vec3 ex_Color;
  6. in  vec2 ex_TexCoord;
  7. out vec4 out_Color;
  8.  
  9. uniform sampler2D left;
  10. uniform sampler2D right;
  11.  
  12. void main(void)
  13. {
  14. //Ausgabe
  15. }


Horizontal Interlaced (fast genauso wie Aya):
Code:
  1. if (mod(trunc(gl_FragCoord.y), 2.0) == 0)
  2.     out_Color = texture2D(left, vec2(ex_TexCoord));
  3.   else
  4.     out_Color = texture2D(right, vec2(ex_TexCoord));

Checkerboard:
Code:
  1.  
  2.   bool d1 = (mod(trunc(gl_FragCoord.x), 2.0) == 0);
  3.   bool d2 = (mod(trunc(gl_FragCoord.y), 2.0) == 0);
  4.   if (d1^^d2)
  5.     out_Color = texture2D(left, vec2(ex_TexCoord));
  6.   else
  7.     out_Color = texture2D(right, vec2(ex_TexCoord));


Anaglyphen (rot/cyan, mehrere Methoden):
Code:
  1.   vec3 cleft = texture2D(left, vec2(ex_TexCoord)).xyz;
  2.   vec3 cright = texture2D(right, vec2(ex_TexCoord)).xyz;
  3.   out_Color.r = cleft.r;  //Full-Color
  4.   out_Color.r = 0.299*cleft.r + 0.587*cleft.g + 0.114*cleft.b;  //Half-Color
  5.   out_Color.r = 0.7*cleft.g + 0.3*cleft.b;  //Optimized
  6.   out_Color.g = cright.g;
  7.   out_Color.b = cright.b;
Noch mehr Anaglyphen-Verfahren gibts auf http://www.3dtv.at/knowhow/AnaglyphComparison_en.aspx, außerdem könnte man noch rosa/grün und gelb/blau testen, ich besitze die entsprechenden Brillen aber nicht.


Zuletzt geändert von Joni am So Mär 07, 2010 12:11, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 04, 2010 18:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
kann auch bei Interesse was in die Shadersammlung stellen:

Interesse? Immer :)

_________________
Yeah! :mrgreen:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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 | 16 Queries | GZIP : On ]