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

Aktuelle Zeit: Fr Jul 18, 2025 12:25

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Sep 11, 2008 07:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Hiho,

joar Frage siehe Topic. Kann ich trotz Doppelpufferung irgendwie direkt in den vorderen gerade aktuellen Puffer zeichnen.
Anwendung aus folgendem Grund: Rubberband im XOR-Modus.
Bisher sind mir da nur 2 Wege eingefallen:

2 mal SwapBuffers -> klappt, aber flackert kurz

immer alles zeichnen und Rubberband als letztes drüber: klappt, aber der eigentliche Sinn des Rubberband-Algos, sich das gesamte Zeichnen zu sparen, ist hinfällig.


MfG Pellaeon

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 11, 2008 08:53 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wird dir nicht helfen aber mir ^^ Was ist ein Rubberband ? Ich kenne das nur als Gummi, den man Kollegen und Schülern entgegen schnippt.
Google hat mich auch nur auf sowas verwiesen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 11, 2008 09:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich denke das ist wie ein Auswahlrechteck unter Windows war (seit xp mit styles ist es transparent. ohne styles aber noch "klassisch"). Also eine gestrichelte Linie die auf den Untergrund invertiert (XOR) dargestellt wird. Zeichnet man sie an genau der gleichen Stelle noch einmal wird sie wieder entfernt und man erhält das ursprüngliche Bild.

Normal kannst du mit glDrawBuffer(GL_FRONT); festlegen in welchen Buffer du zeichnen möchtest. Aber bei mir (Radeon HD 2400) hat dieser Befehl gerade gar keine Auswirkung und liefert auch keinen Fehler. Außer, wenn ich versuche in den nicht existierende Teil (GL_RIGHT) einer Stereoansicht zu rendern.

Alternativ kannst du entweder direkt die Windowsapi benutzen oder aber du wirst um ein Neuzeichnen/als Textur cachen nicht umher kommen. Letzteres hätte dann sogar den Vorteil, dass du nicht die klassische Methode benutzen müsstest sondern auch selber transparenzen einsetzen könntest. Wenn sich das gerenderte wärend dem Auswählen verändern kann wäre letztere Möglichkeit vermutlich auch die bessere. Auch wenn die mehr Arbeit für die Karte bedeutet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 11, 2008 13:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Hiho,

jo genau was Lossy beschreibt mein ich. Das mit dem glDrawBuffer werd ich mal testen. Hab hier aber nur nVidia^^

Das mit der WinAPI geht auch nicht mehr, zumindest unter Vista. Ich hab nen Programm, da war ne simple Screenshot-Funktion drinne. Ich hab einfach vom Panel die Canvas genommen (Delphi 2005-Programm) und das als bmp gespeichert. Die einfache Lösung war in diesem Fall da ausreichend. Programm unter Vista: liefert nur nen graues Bild.

Naja und meine letzten Transparenz-Tests (da sollten sich Steuerelemente überlagern mit Transparenteffekt) mit der MFC sind auch daran gescheitert. Unter XP komm ich an den Bildinhalt des OpenGL-Fensters per WinAPI ran, klappt wunderbar, unter Vista wieder net ... . Bleibt nur der Umweg über glReadPixels.

Danke für die Hilfe!


MfG Pellaeon

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 11, 2008 13:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Info-Update:

Funktioniert wunderbar, auch auf der ATI-Karte meines Freundes.

@Lossy: hast du mal ein glFinish(); gemacht? Weil wenn man direkt in den Frontbuffer rendert, fällt ja das SwapBuffer weg.

MfG Pellaeon

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 11, 2008 14:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Nö. Hatte ich nicht. Aber ja du hast Recht. Mit glFinish funktionierte es.

Irgendwie ist meine Grafikkarte hier aber komisch. Ohne das glFinish sehe ich nie etwas. Nicht mal single buffered. Und das obwohl ich nur einen Würfel mit einem vbo darstelle und anschließend sogar noch ein sleep von 15 ms habe. Mehr als genug Zeit wenigstens irgendwas zu zeichnen. Sobald das glFinish enthalten ist, dann funktioniert es. Kurioserweise sogar so als wäre doublebuffering aktiv. Mit anderen Worten kein Flackern was normal ziemlich unwahrscheinlich ist, dass das Timing wirklich immer so klappt.

Es scheint so als ob die Grafikkarte die Speicherbereiche komplett getrennt hat und erst auf Verlangen dann tatsächlich in den Speicher der GDI einfüllt. Früher war das zu mindest noch nicht so. Denn aktuell bräuchte ich dann hier genau genommen gar kein DoubleBuffering mehr. Muss ich noch mal zu Hause ausprobieren. Nicht, dass das nur an der beschnitten Karte hier liegt. Shared Memory. :/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 11, 2008 16:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Also ich hab den Eindruck, dass der die Renderbefehle erstmal sammelt und nicht gleich zeichnet. Evtl bringt es was OpenGL mit Geometrie testweise zuzuspammen^^ Werd ich mrogen mal testen. Einfach ne Schleife um den Renderaufruf ...

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 15, 2008 16:04 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
wie wärs denn allgemein mit

glEnable(GL_COLOR_LOGIC_OP);
glLogicOp(GL_XOR);
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glDisable(GL_LIGHTING);
Disable_GLClipPlane;
glEnable(GL_LINE_STIPPLE);
glLineStipple(2, $1C47); // dash/dot/dash

... Rubberband Zeichen

glDisable(GL_LINE_STIPPLE);
glDisable(GL_COLOR_LOGIC_OP);

Dann zu Vista:

glReadBuffer(GL_FRONT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelZoom(1, 1);
glRasterPos2i(Viewport[0], Viewport[1]); //set draw position at lower-left hand corner
glCopyPixels(Viewport[0], Viewport[1], Viewport[2], Viewport[3], GL_COLOR);

... Rubberband Zeichen

SwapBuffers(DC);

In den Front Buffer Zeichnen ist bei Vista nicht erlaubt (nur ohne Hardwarebeschleinungung)
Auch API Funktionen sind nicht bei einem Hardware beschleunigtem Context möglich, also bei jedem Resize muß ein Paint folgen. Auch Slidebar einfach drüber schieben geht nicht.
Visa erlaub kein mixen von befehlen an Hardwarebescheunigte Contexte. Da gibts irgendwo in Netz ne Abhandlung, was unter Visat geht und was nicht.

Grüße
User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 15, 2008 19:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Und wo gibts diese Abhandlung genau?

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 15, 2008 19:55 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
habs wiedergefunden :

http://www.opengl.org/pipeline/article/vol003_7/

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 16, 2008 07:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
@user: danke für den Link! Sehr interessant. Aber das Rendenr in den Frontbuffer nur sofwtareemuliert passiert steht da nicht. Nur das es langsam sein kann, wenn man zu oft das glFlush benutzt.

@Lossy: Hier ist die Anwtort, warum das glFlush zumindest unter Vista notwendig ist:

Zitat:
Windowed applications that use frontbuffer rendering without ever calling glFlush or glFinish (as they should) are likely to appear completely black, because the rendering will sit forever in the offscreen frontbuffer.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 16, 2008 09:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
@Lossy: Hier ist die Anwtort, warum das glFlush zumindest unter Vista notwendig ist:

Unter Vista kann ich das verstehen. Bzw sollte das dann hoffentlich auch nur bei aktivem Aeroglass so sein. Aber das war auf Windows 2000 getestet. Wobei ich zu meiner Schande gestehen muss, dass ich es bisher verpennt habe, dass mal zu Hause auf meinem Rechner zu testen. :roll:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 16, 2008 13:00 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Ich hatte zumindest bei meine Test so rausgefunden. (ist aber schon so ein jahr her).

Wenns sonst noch aussagen zu Vista oder System gerade in Bezug auf Kompatibilität gibt, wär ich sehr dran interessiert. Meine App muß von win 98-Vista laufen. Ich kann da keine Anwender wegen leicht veralteter Hardware (sprich 3-5 Jahre) ausgrenzen.

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 16, 2008 17:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Lossy eX hat geschrieben:
Wobei ich zu meiner Schande gestehen muss, dass ich es bisher verpennt habe, dass mal zu Hause auf meinem Rechner zu testen. :roll:

Nachgeholt. ;) Und das Verhalten ist auf Windows XP mit Radeon 3850 + aktuellem Treiber das Gleiche.


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


Wer ist online?

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