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
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
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.
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
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. :/
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
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.
@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
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.
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.
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.