zur Zeit versuche ich mich an einem rudimentären Malprogramm ("paint"-clone) mit OpenGL.
Es sollen per Tastendruck derade Linien gezeichnet werden können
Das Linien-Zeichnen funktioniert wie in MS-Paintbrush.
1. Mausklick um Startpunkt festzulegen.
2. mit weiterhin gedrückter Maustaste einen zweiten Punkt anvisieren:
Es wird dabei immer eine Gerade zwischen dem Startpunkt und dem aktuell markierten Punkt angezeigt. Ich handhabe es so, dass jedesmal wenn eine neue (vorläufige) Linie gezeichnet wird, die vorherige nocheinmal mit der Hintergrundfarbe des Fensters überzeichnet wird. So ist immer nur noch die aktuelle Linie sichtbar.
3. Maustaste loslassen.
4. Linie wird zwischen den beiden Punkten wird endgültig gezeichnet.
Das funktioniert soweit auch.
Das große Problem an der Sache ist aber folgendes:
Leider werden natürlich beim Überzeichen der vorläufigen Geraden auch vorher schon "entgültig" gezeichnete Linien mit der Hintergrundfarbe überpinselt.
Bisher habe ich es so gelöst, dass ich die endgültigen Linien in einem array (struct linie; linie fertigeLinien[] ) ablege und jedesmal wenn eine vorläufige Linie überschrieben wird wieder alle endgültigen Linien aus dem array auslese und neu zeichnen lasse.
Das erweist sich allerdings alles andere als performant. Sobald sich mehr als 10, 15 endgültige Linien auf dem Bildscirm befinden, dauert es merklich, bis eine vorläufige Linie als Reaktion auf das Bewegen der Maus mit gedrückter Taste erscheint.
Meine Frage ist deshalb:
Gibt es eine Möglichkeit (Funktion), den gesamten Fensterinhalt irgendwie festzuhalten und später wieder aufzurufen? Dann könnte ich, wenn eine vorläufige Linie überschrieben wird, diese Funktion ausführen und müsste nicht müselig jede Linie einzeln noch einmal aufrufen und berechnen lassen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Stichwort: Pixelbufferobjects oder RenderToTexture. Schau dich dazu am besten mal im Forum oder Wiki um.
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 network • my 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
vielen Dank für den Hinweis, das ( http://wiki.delphigl.com/index.php/Screenshot ) sieht so aus, als ob es mir weiterhelfen kann.
Als blutiger Open GL-Anfänger habe ich nicht gewusst, wonach suchen.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Hallo Günther,
Du bist schon der zweite, der innerhalb kurzer Zeit nach Linien fragt und Performanceprobleme hat. Ich habe schnell ein Mini-Delphi-Programm zusammengeschustert, das auf Knopfdruck (auf den Start-Button drücken) eine neue gerade farbige Linie per Random erzeugt und in eine Liste speichert. Diese Liste (dh. alle bisher erzeugten Linien) wird danach mit OpenGL ausgegeben; bei jedem Knopfdruck kommt eine Linie dazu. Die Anzahl der angezeigten Linien ist im Fensterbalken zu sehen. Die Ausgabe ist nicht langsam.
Ich hoffe Du programmierst mit Delphi.
Traude
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
wenn ich einfach Linien "auf einen Schlag" auf den Screen zeichnen lasse, habe ich mit der array-Lösung auch kein Geschwindigkeitsproblem.
Das Problem kam erst dadurch zustande, dass ich bei jeder Bewegung mit der Maus (Stichwort glutMotionFunc) immer wieder alle Geraden aus dem array auslesen und wieder zeichnen lassen musste, bis die Maus wieder losgelassen wird. Wenn das array zu voll war (10, 15 Einträge haben gereicht), ist das Programm wirklich seeeehr langsam geworden (wie schon beschrieben).
Nun habe ich es so gelöst, dass der komplette Screen gespeichert und wieder ausgelesen wird (glReadPixels, bzw. glDrawPixels) - das geht wunderbar!
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Finde ich gut, dass Du eine Lösung gefunden hast.
Auf die Gefahr hin, dass Du meinst, dass ich das letzte Wort behalten muss: ich habe das Mini-Beispielprogramm so abgeändert, dass Du jetzt zusätzliche Linien mit der Maus ziehen kannst (MouseDown->Mausziehen->MouseUp). Im OnCreate erstelle ich vorher 100 Linien. Ich wollte 1000 erstellen, aber dann kann man die neue Linie nicht mehr erkennen. Es ist aber auch bei 1000 Linien kein Performance-Einbruch feststellbar (und ich habe eine miese Grafikkarte).
Was ich damit sagen will: das einfache Linien ziehen mit glVertex2f genügt.
Traude
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mitglieder in diesem Forum: 0 Mitglieder und 22 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.